androidcanvasview
‘壹’ Android自定义View(3) 《Canvas绘制简单的图形》
在Android中,我们经常会需要去绘制一些自己需要的控件,所以继承自View的自定义View就产生了。这篇文章主要介绍在View中的重要类,Canvas类。
Canvas是自定义View中几个最重要的类之一,可以理解为画布,但是我理解下来,这只是单一的图层,每次Canvas绘制时其实都是在canvas类所定义出的一个图层上进行绘制图形,一旦canvas变化,则图层也发生变化,图层变化之前绘制的结果不变,但之后的绘制结果会以新的图层为基准进行绘制
在这里绘制线条调用Canvas.drawLine(float startX, float startY, float stopX, float stopY,Paint paint)方法,参数分别如下
绘制矩形调用canvas.drawRect(RectF rect, Paint paint),矩形Rect的构造参数的四个参数分别为左边界,上边界,右边界,下边界的值,单位为px,RectF与Rect不同之处在于构造参数的类型一个全为float,一个全为int,运行结果如下
绘制椭圆主要调用drawOval(RectF oval, Paint paint),以一个矩形的边界来绘制一个椭圆,运行结果如下
绘制圆主要使用Canvas.drawCircle(float cx, float cy, float radius, Paint paint),
绘制Path的方法比较多,这里只简单示例绘制线条路径构建一个三角形的用法,后续会再详细介绍绘制别的类型路径的用法,该例运行结果如下
这里我们绘制了一段文字和一根线段这里是为了演示出Canvas中的文字的绘制方法只能实现水平方向上的居中显示,垂直方向上的垂直是需要我们再进行实现的,绘制文字有很多个,我们这里只简单调用了设置起始点的绘制方法,关于文字的绘制其实内容还是比较多的,这里我们就只简单的介绍,后续有时间会专门出一个文字绘制的文章,该示例运行结果如下
今天总结了Canvas中一些简单图形的绘制,下篇我们介绍Canvas中的一些其他内容。
‘贰’ android canvas怎么创建
工具/原料
电脑(windows)
eclipse+android编程环境
方法/步骤
首先新建一个android项目名字为CanvasShow,其余参数可以自己配置,点击完成,形成项目信息
配置main.xml,在这里main.xml 基本不用修改,只需增加
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/root"
>
</LinearLayout>
CanvasShowInfo中实现方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init() {
LinearLayout layout=(LinearLayout) findViewById(R.id.root);
final CanvasDraw view=new CanvasDraw(this);
view.setMinimumHeight(500);
view.setMinimumWidth(300);
//通知view组件重绘 这个很重要!
view.invalidate();
layout.addView(view);
}
那么CanvasDraw.java中实现了什么呢?
声明CanvasDraw.java 继承View,重写其中的onDraw方法。
比如画圆:
// 创建画笔
Paint p = new Paint();
p.setColor(Color.RED);// 设置红色
canvas.drawText("画圆:", 10, 20, p);// 画文本
canvas.drawCircle(40, 40, 15, p);// 分别是 圆心的x,y坐标,15为半径
p.setAntiAlias(true);// 设置画笔的锯齿效果。 true是去除,大家一看效果就明白了
canvas.drawCircle(100, 120, 50, p);// 分别是 圆心的x,y坐标,50为半径
从图中可以看见,去除锯齿的图形更加圆滑。下面是相对应的效果图
canvas.drawText("画矩形:", 10, 90, p);
p.setColor(Color.BLUE);// 设置灰色
p.setStyle(Paint.Style.FILL);//设置填满
canvas.drawRect(60, 60, 80, 80, p);// 正方形
canvas.drawRect(70, 90, 300, 100, p);// 长方形
// drawRect函数前两个参数是一个顶点的坐标,后两个参数是对顶点的坐标,相对应的效果图
canvas.drawText("画扇形:", 120, 120, p);
// 设置渐变色 这个扇形的颜色是改变的 /
Shader mShader = new LinearGradient(0, 0, 100, 100,
new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW,
Color.LTGRAY }, null, Shader.TileMode.REPEAT); // 一个材质,打造出一个线性梯度沿着一条线。
p.setShader(mShader);
p.setColor(Color.BLUE);
RectF oval2 = new RectF(60, 100, 200, 240);// 设置个新的长方形,扫描测量
canvas.drawArc(oval2, 200, 130, true, p);
// 画弧,第一个参数是RectF:该类是第二个参数是角度的开始,第三个参数是多少度,第四个参数是真的时候画扇形,是假的时候画弧线
其中:
public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
oval :指定圆弧的外轮廓矩形区域。
startAngle: 圆弧起始角度,单位为度。
sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度。
useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。
paint: 绘制圆弧的画板属性,如颜色,是否填充等。
‘叁’ android canvas一定要设置具体的画布吗canvas是画在屏幕上还是画在bitmap上求详解
简短的说就像text框要输入文字一样,你必须先让text取得焦点,获得光标才能进行输入
bitmap就像画布,canvas就像画笔。要画画就要知道画在哪里,所以必须要画布。
view的onDraw的canvas是花在view的背景上,也是类似bitmap上。
缓冲是在另一个后台bitmap上画好在进行展示
以上代表个人通俗理解只做参考理解,不是标准
‘肆’ android:如何用canvas在自定义view里画图
做安卓开发的话,不会自定义view是不行的,自定定义各种控件以满足开发需求,在开发中是很重要的,自定义view通过继承view,通过重写ondraw方法实现重绘自己所需要的控件样式。
在ondraw方法中,通过canvas来绘制想要的样式,首先需要定义好画笔,以及画笔的各种属性,比如需要的时候要
抗锯齿
等等。都准备好了就可以用canvas来实现绘图了,当然api提供的api肯定是不够用的,需要多姿多彩的样式很多时候需要借助准备好的一些图片,通过canvas绘制bitmap来实现把准备好的图片绘制上去。绘制好了当然还是不够的,控件都是需要和用户交互的,所以很多时候样式是会发生改变的,所以要在其中定义相关方法暴露出来,方法中处理用户操作或其他的结果改变样式的重绘,绘制好了调用更新(
invalidate
())方法,实现样式的改变。做好一个控件还需要优化性能等等,都需要一步一慢慢实现。
‘伍’ 请问各位高手,android开发中的View里面的Ondraw函数的参数Canvas是如何获得的
Canvascanvas=newdrawSurfaceView(activity).getHolder().lockCanvas(null);//用一个view定义一个canvas
canvas.drawLine(startX,startY,stopX,stopY,paint)//画线,需要起始坐标和结束坐标
canvas.drawBitmap(bitmap,null,dest,paint);//一样了,dest定义了起始和结束
canvas是指一个画布对象,你需要给定大小和“画”这个动作的起始位置,然后用paint画笔完成这个动作,比如从(0,0)(1,1)画了一条线,再从(1,1)到(3,3)又话了一条线,两条线连起来就是一个曲线了,画图的话就是第三行代码了;如果你没有得到这个画布,说明你有个参数是错误的,没有得到大小,或者没有得到位置,就这样。
如上所示,
canvas是从SurfaceView控件里面得到,上面有注释,你的大小参数自己定义就行了,别超出了控件大小
‘陆’ 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是怎么初始化的
paint应该在构造方法里赋值的,我在你的代码里面没有看到有赋值的过程。另外你把画笔的颜色设置为白色,那么你的布局的背景颜色就不应该用白色的,否则会显示不出来,这些你应该确认一下。
希望对你有帮助。
‘捌’ android中,如何用canvas绘制透明
第一种思路是通过对Bitmap进行操作,将Bitmap的像素值get到一个int[]数组里,因为在android里Bitmap通常是ARGB8888格式,所以最高位就是A通道的值,对齐进行改变后再新建一个Bitmap即可。
第二种思路是通过设置canvas的paint的透明度,然后通过canvas.drawBitmap()来改变View的透明度。
Paint .setAlpha(0);
‘玖’ android canvas view重绘 我在一个activity中调用了canvas。在canvas中我点击事件需要重新绘制当前view
除了SurfaceView,其它的都必须通过调用View.invalidate方法刷新View
所以不能直接执行moren(canvas),需要在onTouchEvent调用invalidate