① android canvas.drawbitmap(bitmap,0,0,null)什么意思
你是要实现图画功能的吧?这个很简单理解。
canvas.drawbitmap()函数你可以理解为新建一个画布, 就好比画家的画板,当然你不往里面添加东西,就什么都没有,它是空的。现在放入参数, bitmap就是导入你已有的图片,比如,画家上次还没画完的一张图片,现在放在画板上,要继续工作。参数,0,0,为设置这张画在画板上的放置的位置,0,0为x轴和y轴的坐标,如果是(0,0),则默认为从从左上角开始放置。下面的一张图片为设置不同参数的时候,这种那个图片放置在这个画板上的位置的变化,你可以看到我设置为(100,10),也就是x坐标100,图片离左边距离为100;y坐标10,图片离上方距离为10,你可以看到左边黑色的部分占了100,上边部分的黑色占了10.最后,就是那个null,null的参数是用来设置画笔的,你没有画笔,当然就不用设了,你这个只是简单的,见图片显示在画板上,并没有实现要在画板上画图的功能 。你还想实现美妙显示多少张图片的话,我只能给你指示简单的方向,就是你要设置一个定时器,在定时器里面,加上你的这个函数,然后定时更改参数bitmap变量,这个bitmap是图片的路径,实现实现每秒多少贞,就是要设置定时器你每秒,你改变参数bitmap的频率,关于这个问题,你还得学习下定时器,再说下去内容就多了,你还是自己先琢磨吧……
ps:其实这个函数还比较好理解,不好理解的是要开始实现画图的时候,要设置两个这样的,实现双缓冲,这个比较难,多看看书吧,我也只能帮你到这里了。祝你学习快乐哈~我也正在学习。
② android canvas 画图 坐标是参照什么
左上角是(0,0)android 是左收坐标系
③ android 使用canvas画线,如何保证快速画出圆滑的曲线
[mw_shl_code=java,true] RectF rect = new RectF(0, 0, radii, radii); // 圆形弧度需要的区域(左上角的x,y坐标 ,及右下角x,y坐标) Paint paint = new Paint(); paint.setColor(r.getColor(R.color.bg_color_1)); canvas.drawCircle(radii/2, radii/2, radii/2, paint);[/mw_shl_code]
④ Android Canvas 方法总结
在自定义 View的时候,我们经常需要绘制一些自己想要的效果。
这里就需要使用Canvas对象。
下面将Canvas对象常用方法做个笔记,方便记忆。
对Canvas的一系列操作,是指对Canvas进行旋转、平移、缩放等操作。
这些操作可以让Canvas对象使用起来更加便捷。
Canvas提供了几个方法,让我们可以方便的对Canvas的状态进行更改和还原。
这些方法是: save() 、 restore() 、 restoreToCount(int saveCount) 。
我们在对Canvas进行平移、旋转、放大等操作时候,可以调用 save() 方法,将当前修改过的Canvas状态进行保存,调用 restore() 方法后,会将Canvas还原成最近的一个 save() 的状态。
save() 方法还会有一个返回值,我们也可以调用 restoreToCount(int saveCount) 方法,将这个返回值作为参数传递进去,就可以将Canvas还原成某一个特定的 save() 状态。
⑤ android canvas画一条贯通屏幕的线,如何确定xy的坐标
你可以随便搞个view,胡乱设一个背景色胡乱定个宽高,用一个相对布局把你自定义的view放在上面,随便搞的view放在下面(相对布局可以重叠),然后设置这个随便搞的view的左边距,和你画的线对齐了X坐标就确定了,同样的道理上边距就是Y坐标。
⑥ Android 绘图之Canvas相关API使用
Android 自定义控件或多或少都会用到Canvas,那么我们就需要熟悉它的API。Canvas给我们提供了大量的的DrawXXX方法,通过这些方法我们就可以绘制出我们想要的效果。接下来看看官方是怎么说的:
大致意思就是说:
Canvas类持有“draw”调用。 要绘制一些东西,你需要4个基本组件:一个位图来保存像素,一张画布(Canvas)来主持绘图调用(写入位图),一个绘图图元(如Rect,Path,text,Bitmap)和一支画笔(描述绘图的颜色和样式)。
首先介绍下画笔(Paint)的常用API:
Paint默认的字体大小为12px,在绘制文本时我们往往要考虑密度density设置合适的字体大小。画笔的默认颜色为黑色,默认的style为FILL,默认的cap为BUTT,默认的线宽为0。
单一颜色填充Canvas画布
以上就是大部分的绘制操作,当然还有一些没介绍到,还有一些需要在API21(5.0)以上才能使用,这个使用到的时候可以弄个小demo看下效果,接下来介绍下针对画布变换和画布裁剪做一些介绍。
在学习绘制操作的时候很多地方都使用到了translate 和rotate 这里就不再对它们进行操作
1.画布scale
2.画布skew
这里针对Canvas的API进行了一些说明,希望对大家有所帮助。没有添加完整工程上来,但是每一个方法都是实际跑过的,只需要在onDraw中调用就可以看到效果了。
⑦ Android绘图基础--Canvas和Drawable
Github链接
画2D图形有两种方法:
Canvas实际上是封装了各种draw方法的类,调用draw方法把图形绘制到底层的Surface上,即绘制在Window上。
这个例子中构造了两个Canvas和一个Bitmap,分别调用其draw方法,先是mCanvas往Bitmap里绘制一个方块,再在onDraw方法内调用canvas.drawBitmap绘制这个方块。
思考一个问题,为什么mCanvas需要设置Bitmap?
很简单,因为它没有持有一块内存地址,自然没法绘制。来看一下draw的起点ViewRootImpl(软件绘制,不开启硬件加速下)。
这个通过mSurface.lockCanvas返回的Canvas是View.draw的canvas变量,所以当1,2情况时,Canvas都持有一个Bitmap,指向共享内存里的某一小块,当调用Canvas.draw方法时就能绘制出东西。但对于自定义Canvas来说并不是,即使设置一个Bitmap和绘制了Bitmap,但不往共享内存上写,屏幕上是不会显示的,SurfaceView同理,通过Surface.lockCanvas获取持有共享内存的Canvas,绘制完毕后调用Surface.unlockCanvasAndPost把绘制内容显示到surface上并release掉Canvas。
顺带一提Canvas.save和Canvas.restore方法,如下Demo
效果图如
画的是三个颜色和旋转角度都不同的小方形。
步骤1把默认坐标系旋转20°,画出第一个蓝色的方形,步骤2保存当前的matrix(旋转了20°),继续旋转20°,此时坐标系已经旋转了40°,画出第二个黄色的方块,步骤3,恢复上一步保存的matrix(旋转了20°),此时坐标系还是旋转了20°,步骤4,再旋转40°,此时坐标系旋转了60°,画出第三个黑色方块。
Canvas.save用于保存当前matrix和clip,Canvas.restore用于恢复上次保存的matrix和clip。
Drawable是一个能画出来的物体的抽象,使用前需要调用setBounds确定位置和大小,通过getIntrinsicHeight和getIntrinsicWidth取到实际大小。Drawable可以有几种形式存在:Bitmap、Nine Patch、Vector、Shape、Layers等。
从Resource.getDrawable会判断是否.xml结尾,不是的话走6,7步,如果从xml中读取,需要getResource.getDrawable -> ResourceImpl.loadDrawableForCookie -> drawable.createFromXml -> DrawableInflater.inflateFromXmlForDensity -> drawable.inflateFromTag
看一下Shape实现类GradientDrawable的inflate实现,读取各项属性并赋值,到draw方法。
调用canvas.drawRect把mRect画出来,而mRect的赋值在ensureValidRect。[图片上传失败...(image-a25af0-1515826613001)]
bounds在哪里设置的?答案是ImageView.updateDrawable内,会调用Drawable.getIntrinsicHeight赋值(从xml中size属性读取),再调用configureBounds -> setBounds,如果使用的不是ImageView,一定要在draw之前 调用setBounds ,否则size就会出错。
回到loadDrawableForCookie,再看一下6,7步加载图片的过程,通过AssetManager读取图片流数据,通过Drawable.createFromResourceStream这个我们经常使用的方法获取到Drawable。
取到屏幕密度之后调用BitmapFactory.decodeResourcesStream,计算密度后调用native创建Bitmap,感兴趣的同学可以看下更具体的分析文章(如 理解Bitmap )。
本文探究了两点
Android 7.1.1 源码
Android 官方文档, Canvas and Drawable , Drawable 等
⑧ Android canvas绘制的可滑动刻度尺
首先放上所有成员变量
以上用到的方法
本Demo是使用Canvas进行绘制刻度,为了适配不同宽度的屏幕,所以小的刻度使用从中心指针处向两边绘制到屏幕边界的方法,使用GestureDetector接管View的触摸事件,在onScroll中修改体重值并不断进行重绘,达到刻度尺滚动的效果。并在onFling中接收抛动的事件,开启一个属性动画达到平滑的效果。由于我没有在GestureDetector中找到能响应不fling的up事件,所以要自己手动在onTouchEvent中写ACIONT_UP时的动作
遮罩层的实现方式,是drawRec 一个整个画布大小的白色矩形,使用线性渐变,两边不透明到中间透明。注意,由于使用了PorterDuff.Mode.MULTIPLY来合成,所以需要使用到离屏缓冲,关于离屏缓冲可以看看 HenCoder
最后附上github: https://github.com/Pro47x/BodyWeightScaleTableView
⑨ android怎么移动canvas
我们可以把这个Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套画图的API,真正的内存是下面的Bitmap),而且它还提供了一整套对这个内存区域进行操作的方法,所有的这些操作都是画图API。也就是说在这种方式下我们已经能一笔一划或者使用
Graphic来画我们所需要的东西了,要画什么要显示什么都由我们自己控制。
这种方式根据环境还分为两种:一种就是使用普通View的canvas画图,还有一种就是使用专门的SurfaceView的canvas来画图。两种的主要是区别就是可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。前面一种适合处理量比较小,帧率比较小的动画,比如说象棋游戏之类的;而后一种主要用在游戏,高品质动画方面的画图。
Paint 代表了Canvas上的画笔、画刷、颜料等等;
Paint类常用方法:
setARGB(int a, int r, int g, int b) // 设置 Paint对象颜色,参数一为alpha透明值
setAlpha(int a) // 设置alpha不透明度,范围为0~255
setAntiAlias(boolean aa) // 是否抗锯齿
setColor(int color) // 设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义
setTextScaleX(float scaleX) // 设置文本缩放倍数,1.0f为原始
setTextSize(float textSize) // 设置字体大小
setUnderlineText(booleanunderlineText) // 设置下划线
// 1、将会以颜色ARBG填充整个控件的Canvas背景
//mCanvas.drawARGB(122, 10, 159, 163) ;
// 2、将会以颜色ARBG填充整个控件的Canvas背景
//mCanvas.drawColor(Color.BLUE) ;
// 3、绘制颜色,但是要制定一个mode
//mCanvas.drawColor(Color.BLUE, Mode.SCREEN) ;
// 4、画背景,跟2等效
//mCanvas.drawPaint(mPaint) ;
// 5、画一个点
//mCanvas.drawPoint(23, 23, mPaint) ;
// 6、画很多点这里的float[] 表示{x0,y0,x1,y1,x2,y2,x3,y3.....}
//mCanvas.drawPoints(new float[]{10,11,10,12,10,13,10,14,10,15,10,16}, mPaint) ;
// 7、画线
//mCanvas.drawLine(...) ;
// 8、画长方形 Rect 和RectF的区别?
//精度不一样,Rect是使用int类型作为数值,RectF是使用float类型作为数值
//Rect r = new Rect(10,10,50,50) ;
//mCanvas.drawRect(r, mPaint) ;
//RectF rf = new RectF(10,10,50,50) ;
//mCanvas.drawRect(rf, mPaint) ;
//mCanvas.drawRect(10, 10, 50, 50, mPaint) ;
// 9、画椭圆 初始化RectF的参数是(left,top,right,bottom)
//RectF rf = new RectF(100,100 ,200 ,250) ;
//mCanvas.drawOval(rf, mPaint) ;
// 10、画圆 (圆心x0,圆心y0,半径,paint)
//mCanvas.drawCircle(100, 100, 50, mPaint) ;
// 11、画圆弧 RectF对象表明内切矩形的(left,top,right,bottom)
//RectF rf = new RectF(100 ,100 ,200 ,200) ;
// 参数(rf,startAngle ,angle ,sweepAngle ,paint) sweepAngle表明是否显示圆弧三角形 angle画多少度
//mCanvas.drawArc(rf, 60, 30, true, mPaint) ;
// 12、绘制圆角矩形 RectF是矩形的(left,top,right,bottom)
//RectF rf = new RectF(100 ,100 ,200 ,200) ;
// 50表明x方向的半径,20表示y方向的半径
//mCanvas.drawRoundRect(rf, 50, 20, mPaint) ;
// 13、画任意多边形
//Path path = new Path() ;
//path.moveTo(100, 100) ;
//path.lineTo(200, 200) ;
//path.lineTo(300, 200) ;
//mCanvas.drawPath(path, mPaint) ;
// 14、通过Path对象,也可以画其他的图形
//Path path = new Path() ;
//path.addCircle(100, 100, 20, Path.Direction.CCW) ;
//mCanvas.drawPath(path ,mPaint);
/*drawBitmap
drawText
drawPicture*/
/*Rect r = new Rect(100,100,200,200) ;
ByteArrayOutputStream out = new ByteArrayOutputStream();
Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ;
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out) ;
InputStream in = new ByteArrayInputStream(out.toByteArray()) ;
*/
/*Picture picture = Picture.createFromStream(mContext.getResources().openRawResource(R.raw.bg)) ;
mCanvas.drawPicture(picture) ;*/
// 15、画bitmap对象
//mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg),100, 100, mPaint) ;
// 16、Matrix中包含了对Bitmap的处理操作
/*Matrix m = new Matrix() ;
m.postScale(2, 2) ;
m.postRotate(60) ;
mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg), m, mPaint) ;*/
// 17、画带Matrix参数的bitmap,经过Matrix对象可以对bitmap做相关的处理,比如旋转,缩放,移动等《关于Matrix的使用另行总结》
/*Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ;
Matrix m = new Matrix() ;
m.postScale(2, 2) ;
m.postRotate(60) ;
m.postTranslate(300, 300) ;
mCanvas.drawBitmap(bitmap, m, mPaint) ;*/
//mCanvas.drawBitmap(....) ; 暂不总结
// 18、画文字
//mCanvas.drawText(123, 10, 10, mPaint) ;
//mCanvas.drawText(....)
⑩ android之canvas的坐标在canvas旋转后会变化吗
得看你如何设置咯,如果canvas也旋转了就不会变,如果没有的话,那肯定会咯