Android自定义View基础知识总结

自定义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对绘制的辅助和设置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值