自定义View关键点
1 自定义绘制的方式是重写绘制方法,其中最常见的是onDraw()方法。
2 绘制的关键点是Canvas的使用
(1)Canvas的绘制类方法:drawXXX(xxx),关键参数是Paint。
(2)Canvas的辅助类方法:范围裁切和几何变换。
自定义绘制知识的四个级别
1 Canvas类的drawXXX系列方法和Paint最常见的使用。
canvas.drawXXX()方法是自定义绘制最基本的操作。比如怎么画圆,怎么画方,怎么画图像和文字。组合绘制这些内容,再配合上Paint的一些常见方法来对绘制内容的颜色和风格进行简单的配置。
2 Paint的完全攻略,常见的有设置颜色,实心空心,线条粗细,有没有阴影。
3 Canvas 对绘制的辅助---范围裁切和几何变换
范围裁切和几何变换都是用于辅助的。
4 使用不同的绘制方法来控制绘制顺序
最重要的onDraw
提前创建好Paint对象,重写onDraw()方法,把绘制代码写在onDraw()方法里面。
Paint paint = newPaint();
@OverrideprotectedvoidonDraw(Canvas canvas){
super.onDraw(canvas);
//绘制一个圆canvas.drawCircle(300,300,200,paint);
}
Canvas.drawXXX()和Paint基础
1 Canvas类下的所有以draw--开头的方法,比如 drawCircle()和drawBitmap()。
2 Paint类下的几个最常用的方法:
Paint.setStyle(Stytle stytle)设置绘制模式
Paint.setColor(Color color)设置颜色
Paint.setStrokeWidth(float width)设置线条宽度
Paint.setTextSize(float textSize)设置文字大小
Paint.setAntiAlias(boolean a)设置抗锯齿
Canvas.drawColor(int color)颜色填充
这是最基本的drawXXX()方法:在整个绘制区域填充指定的颜色。
比如drawColor(Color.BLACK)会把整个区域涂上纯黑色,并且覆盖掉原有内容;
drawColor(Color.parse(#88880000))会在原有的绘制效果上加一层半透明的红色遮罩。
类似的方法还有drawRGB(int r, int g ,int b)和drawARGB(int r, int g ,int b)和drawColor()方法作用一样。
这类颜色填充一般用于绘制之前设置底色,或者在绘制之后为界面设置半透明遮盖。
drawCircle(float centerX,float centerY,float radius,Paint paint)画圆
centerX和centerY是圆心的横纵坐标,第三个参数radius是圆的半径,单位都是像素,它们共同构成了这个圆的基本信息。
知识点:在Android里,每一个View都有一个自己的坐标系,彼此之间是不影响的。这个坐标系的原点是View左上角的那个点;
如果要画一个红色的圆需要这些写:
panit.setColor(Color.RED);
canvas.drawCircle(300,300,200,panit);
如果想空心圆,那就要设置绘制模式
paint.setStyle(Paint.Style.STROKE);//style修改为划线模式canvas.drawCircle(300,300,200,paint);
setStyle(Style style)这个方法设置的是绘制模式,style具体有三种:
FILL:填充模式
STROKE是画线模式
FILL_AND_STROKE两种模式一并使用,既画线又填充。它的默认值是FILL,填充模式。
还可以设置画线的粗细,在STROKE,FILL_AND_STROKE模式下,还可以设置线条的粗细:
aint.setStyle(Paint.Style.STROKE);
//线条宽度为20像素
paint.setStrokeWidth(20);
canvas.drawCircle(300,300,200,paint);
在绘制的时候,往往需要开启抗锯齿来让图形和文字的边缘更加平滑,设置抗锯齿的方式有两种:
paint paint= new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setAntiAlias(boolean a);
知识点:锯齿现象的发生,只是由于图形分辨率过低,导致人眼看到了画面中的像素颗粒而已。开启抗锯齿后会修改图形边缘处的像素颜色,从而让图形在肉眼看来具有更加平滑的感觉.
Canvas还可以画矩形比如 drawRect(float left,float top, float right, float bottom,Paint paint);
paint.setStyle(Paint.Style.FILL);
canvas.drawRect(100,100,500,500,paint);
paint.setStyle(Paint.Style.STROKE);
canvas.drawRect(100,100,500,500,paint);
另外,它还有两个重载方法drawRect(RectF rect,Paint paint)和drawRect(Rect rect, Paint paint),让你可以直接填写rectF或Rect对象来绘制矩形。
Canvas还可以画点drawPoint(float x, float y,Paint paint);
x和y是点的横纵坐标,点的大小可以通过paint.setStrokeWidth(float width)来设置;点的形状可以通过paint.setStrokeCap(cap)来设置,ROUND画出的是圆形的点,SQUARE或者BUTT画出的是方形的点。
Paint.setStrokeCap(cap)可以设置点的形状,但这个方法并不是专门设置点的形状的,而是一个设置线条端点形状的方法端点有圆头(ROUND)平头(BUTT)方头(SQUARE)三种。
//画圆形的点paint.setStrokeWidth(20);
paint.setStrokeCap(Paint.Cap.ROUND);
canvas.drawPoint(50,50,paint);
//画方形的点paint.setStrokeWidth(20);
paint.setStrokeCap(Paint.Cap.SQUARE);
canvas.drawPoint(50,50,paint);
还可以批量画点 drawPoints(float[]pts, int offset, int count , Paint paint) 或者 drawPoints(float[]pts, Paint paint)
同样是画点,它和drawPoint()的区别是可以画多个点。pts这个数组是点的坐标,每两个成一对; offset表示跳过数组的前几个数再开始记坐标; count表示一共要绘制几个坐标。
float[] points = {0, 0, 50, 50, 100, 100, 50, 100, 100, 50...};
//绘制四个点canvas.drawPoints(points, 2/*跳过两个数,既前面两个0*/,8/*一共绘制8个数*(4个点)/,paint);
还可以画椭圆,drawOval(float left,float top, float rigint, float bottom, Paint paint)
只能绘制横着的或者竖着的椭圆,不能绘制斜的,如果画斜着的椭圆,不能直接使用drawOval(),而是需要配合几何变换。left,top,right,bottom对应着椭圆的左上右下四个边界的坐标
paint.setStyle(Paint.Style.FILL);
canvas.drawOval(50,50,350,200,paint);
paint.setStyle(Paint.Style.Stroke);
canvas.drawOval(400,50,700,200,paint)
它还有一个重载方法drawOval(RectF rectt, Paint paint); 让你可以直接填写RectF来绘制椭圆。
还可以画线,drawLine(float startX, float startY, float StopX, float StopY,Paint paint)
startX, startY, stopX, stopY分别是线的起点坐标和终点坐标。
//由于直线不是封闭图形,所以setStyle(style)对直线没有影响。
canvas.drawLine(200,200,800,500,paint);
还可以批量画线,drawLines(float[] pts, int offet, int count, Paint paint)或者drawLines(float[]pts, Paint paint)
float[] points = {20,20,120,20,70,20,70,120,20,120,120...};
canvas.drawLines(points,paint);
还可以画圆角矩形,drawRoundRect(float left,float top, float right, float bottom, float rx, float ry, Paint paint),left ,top ,right, bottom是四条边的坐标,rx,ry是圆角的横向半径和纵向半径
//还有一个重载方法
//直接RectF来绘制圆角矩形。
drawRoundRect(RectF rect, floatrx, floatry,Paint paint);
canvas.drawRoundRect(100,100,500,300,50,50,paint);
还可以绘制圆弧或扇形, drawArc(float left,float top,float right, float bottom, float startAngle, float sweepAngle, boolean useCenter,Paint paint)
drawArc()是使用一个椭圆来描述弧形的。left,top,bottom描述的是这个弧形所在的椭圆;startAngle是弧形的起始角度(x轴的正向,即正右的方向,是0度的位置;顺时针为正角度,逆时针是负角度),sweepAngle是弧形滑过的角度;useCenter表示是否连接到圆心,就是弧形,如果连接到圆心,就是扇形。
paint.setStyle(Paint.Style.FILL);
canvas.drawArc(200,100,800,500,-110,100,true,paint);
canvs.drawArc(200,100,800,500,20,140,false,paint);
//画线模式
paint.setStyle(Paint.Style.STROKE);
canvas.drawArc(200,100,800,500,180,60,false,paint);
画自定义图形,drawPath(Path path,Paint paint)
前面的这些方法,都是绘制某个给定的图形,而drawPath(Path path, Paint paint)可以绘制自定义图形。当你要绘制的图形比较特殊,使用前面的那些方法做不到的时候,就可以使用drawPath()来绘制。
drawPath(path)这个方法是通过描述路径的方式来绘制图形的,它的path参数就是用来描述图形路径的对象。path的类型是Path.
public classPathViewextendsView{
Paint paint = new Paint();
Path path = new Path();
xxx
{
//使用path来描述图形的路径
path.addArc(200,200,400,-225,225);
path.arcTo(400,200,600,400,-180,225,false);
path.lineTo(400,542);
}
@Override
protectd void onDraw(Canvascanvas){
super.onDraw(canvas);
canvas.drawPath(path,paint);
}
}
Path可以描述直线、二次曲线、三次曲线、圆、椭圆、弧形、矩形、圆角矩形。
Path有两类方法,一类是直接描述路径的,另一类是辅助的设置或者计算。
Path方法第一类:直接描述路径。
这一类方法还可以细分为两组:添加子图形和画线(直线或曲线)
第一组:addXxx()-----添加子图形
addCircle(float x, float y, float radius,Direction dir)添加圆
x,y,radius这三个参数是圆的基本信息,最后一个参数dir是画圆的路径的方向。
路径方向有两种:顺时针和逆时针,对于普通情况,这个参数天顺时针还是逆时针没有影响。它只是在填充图形(Paint.Style为FILL或者FILL_AND_STROKE)
在用addCircle()为Path中新增一个圆后,调用canvas.drawPath(path,paint),就能画一个圆出来。
path.addCircle(300,300,200,Path.Direction.CW)
xxxcanvas.drawPath(path,paint);
drawPath()一般是在绘制组合图形时才会用到的。其他的Path.add-()方法和这类似
第二组:xxxTo()---画线(直线或曲线)
这一组和第一组addXxx()方法区别在于,第一组是添加的完整封闭图形(除了addPath()),而这一组添加的只是一条线。
lineTo(float x, float y) / rLineTo(float x, float y)画直线
从当前位置向目标位置画一条直线,x和y是目标位置的坐标。这两个方法区别是,lineTo(x,y)的参数是绝对坐标,而rLineTo(x,y)的参数是相对当前位置的相对坐标。
所谓当前位置,即最后一次调用画Path的方法的终点位置。初始值为原点(0,0)
paint.setStyle(Style.STROKE);
path.lineTo(100,100);//由当前位置(0,0)向(100,100)画一条直线path.rLineTo(100,0);//由当前位置(100,100)向正右方100像素的位置画线。
drawBitmap(Bitmap bitmap, float left, float top, float right, float bottom, Paint paint)画Bitmap
绘制Bitmap对象,也就是把这个Bitmap中的像素内容贴过来,其中left,top是要把bitmap绘制到屏幕的坐标。
drawBitmap(Bitmap bitmap,Rect src,RectF dst,Paint paint);
drawBitmap(Bitmap bitmap,Rect src,Rect dst,Paint paint);
drawBitmap(Bitmap bitmap,Matrix matrix,Paint paint);
drawBitmap还有一个兄弟办法drawBitmapMesh(),可以绘制具有网格拉伸效果的Bitmap。
drawText(String text, float x, floaty,Paint paint)绘制文字
界面中所有的显示内容,都是绘制出来的,包括文字。drawText()这个方法就是绘制文字的。参数text是用来绘制的字符串,x和y是绘制的起点坐标。 canvas.drawText(text, 200, 100, paint);
Paint.setTExtSize(float textSize);可以设置文字的大小。
这些是本次自定义View基础知识的回顾和常用hi总结,下次准备总结Canvas对绘制的辅助和设置。