自定义view流程

重要方法
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
}
1.Draw()的意思是绘制视图自身
2.dispatchDraw()是绘制子视图
3.无论是View还是ViewGroup对它们俩的调用顺序都是onDraw()->dispatchDraw()
4.在绘制View控件时,需要重写onDraw()函数,在绘制ViewGroup时,需要重写dispatchDraw()函数。
常用方法
1.绘制内容
//绘制底色
canvas.drawColor(Color.BLACK);
//在坐标(200,500)的位置绘制一个点
canvas.drawPoint(200, 500, paint);
//在这些坐标位置绘制多个点
canvas.drawPoints(new float[]{
200, 200,
300, 300,
400, 400
}, paint);
//绘制一条起点为(10,10),终点为(100,600)的直线
canvas.drawLine(10, 10, 100, 600, paint);
//绘制一组线
canvas.drawLines(new float[]{
0, 0, 0, 400,
0, 0, 500, 0
}, paint);
//绘制矩形
//第一种方式
canvas.drawRect(315,115,345,145,paint);
//第二种方式
Rect rect = new Rect(360, 115, 390, 145);
canvas.drawRect(rect,paint);
//第三种方式
RectF rectF = new RectF( 335.5f, 160F,370.5f, 170.6f);
canvas.drawRect(rectF,paint);
2.圆角矩形
// 第一种
RectF rectF = new RectF(100,100,800,400);
//drawRoundRect(@NonNull RectF rect, float rx, float ry, @NonNull Paint paint)
canvas.drawRoundRect(rectF,30,30,paint);
// 第二种,API21以上可用
canvas.drawRoundRect(100,100,800,400,30,30,paint);
** rx,ry的理解**

圆角矩形的角实际上不是一个正圆的圆弧,而是椭圆的圆弧,这里的两个参数实际上是椭圆的两个半径
在rx为宽度的一半,ry为高度的一半时,刚好是一个椭圆,通过上面我们分析的原理推算一下就能得到,而当rx大于宽度的一半,ry大于高度的一半时,实际上是无法计算出圆弧的,所以drawRoundRect对大于该数值的参数进行了限制(修正),凡是大于一半的参数均按照一半来处理
3.椭圆
// 第一种
RectF rectF = new RectF(100,100,800,400);
canvas.drawOval(rectF,paint);
// 第二种
canvas.drawOval(100,100,800,400,paint);
4.圆
// 绘制一个圆心坐标在(500,500),半径为400 的圆。
canvas.drawCircle(500,500,400,paint);
5.圆弧
// 第一种
public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint){}
// 第二种
public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint) {}
startAngle :开始角度
sweepAngle:扫过角度
useCenter:是否使用中心
网友评论