Android开发自定义控件之绘图基础

53 阅读4分钟

自定义View

新建类并继承View

package com.example.javatest.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Region;
import android.graphics.RegionIterator;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.Nullable;

public class BaseView extends View {
    public BaseView(Context context) {
        super(context);
    }

    public BaseView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public BaseView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        
    }
}

布局中引用自定义view

<com.example.javatest.view.BaseView
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

设置画布颜色

onDraw方法中设置画笔和画布,设置画布即整屏颜色可以使用drawColor、drawRGB、drawARGB属性设置。

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);    
    //一、设置画布颜色    
    canvas.drawColor(0xFF49AF11);
//  canvas.drawRGB(73,175,17);
//  canvas.drawARGB(255, 73, 175, 17);
}

画点

//设置画笔的基本属性
Paint paint = new Paint();
//设置抗锯齿
paint.setAntiAlias(true);
//设置画笔颜色
paint.setColor(Color.GREEN);
//设置画笔宽度
paint.setStrokeWidth(15);
//画点:x,y为点坐标
canvas.drawPoint(100, 100, paint);

画线

//设置画笔的基本属性
Paint paint = new Paint();
//设置抗锯齿
paint.setAntiAlias(true);
//设置画笔颜色
paint.setColor(Color.GREEN);
//设置画笔宽度
paint.setStrokeWidth(5);
//画线 startX,startY:起始点坐标;stopX,stopY:终点坐标
canvas.drawLine(100, 100, 400, 400, paint);

画矩形

//设置画笔的基本属性
Paint paint = new Paint();
//设置抗锯齿
paint.setAntiAlias(true);
//设置画笔颜色
paint.setColor(Color.GREEN);
//设置画笔宽度
paint.setStrokeWidth(5);
//设置填充样式
paint.setStyle(Paint.Style.FILL_AND_STROKE);
//画矩形,直接构造
canvas.drawRect(10, 10, 100, 100, paint);
//画矩形,间接构造
paint.setStyle(Paint.Style.STROKE);
RectF rectF = new RectF(210f, 10f, 300f, 100f);
canvas.drawRect(rectF, paint);

画圆

//设置画笔的基本属性
Paint paint = new Paint();
//设置抗锯齿
paint.setAntiAlias(true);
//设置画笔颜色
paint.setColor(Color.GREEN);
//设置画笔宽度
paint.setStrokeWidth(5);
//设置填充样式
paint.setStyle(Paint.Style.FILL_AND_STROKE);
//画大圆 cx,cy:圆心坐标;radius:圆直径
canvas.drawCircle(160, 160, 150, paint);
//画小圆
paint.setColor(0x7EFFFF00);
canvas.drawCircle(160, 160, 100, paint);

画三角形

//设置画笔的基本属性
Paint paint = new Paint();
//设置抗锯齿
paint.setAntiAlias(true);
//设置画笔颜色
paint.setColor(Color.GREEN);
//设置画笔宽度
paint.setStrokeWidth(5);
//设置填充样式
paint.setStyle(Paint.Style.STROKE);
//画一个三角形
Path path = new Path();
path.moveTo(60, 10);
path.lineTo(10, 100);
path.lineTo(120, 100);
path.close();
canvas.drawPath(path, paint);

画弧线

//设置画笔的基本属性
Paint paint = new Paint();
//设置抗锯齿
paint.setAntiAlias(true);
//设置画笔颜色
paint.setColor(Color.GREEN);
//设置画笔宽度
paint.setStrokeWidth(5);
//设置填充样式
paint.setStyle(Paint.Style.STROKE);
//弧线路径 left到right为圆的横向宽度,left为居左多少px;top到bottom为圆的纵向宽度,top为居上多少px
RectF rectF = new RectF(10, 10, 210, 210);
Path path = new Path();
//startAngle:起始角度,默认三点钟;sweepAngle:角度大小
path.arcTo(rectF, 0, 90, true);
canvas.drawPath(path, paint);

Region构造图形

直接构造

//设置画笔的基本属性
Paint paint = new Paint();
//设置抗锯齿
paint.setAntiAlias(true);
//设置画笔颜色
paint.setColor(Color.GREEN);
//设置画笔宽度
paint.setStrokeWidth(5);
//设置填充样式
paint.setStyle(Paint.Style.STROKE);
//Region直接构造
Region region = new Region(new Rect(10, 10, 210, 210));
drawRegion(canvas, region, paint);

private void drawRegion(Canvas canvas, Region region, Paint paint) {
    RegionIterator iterator = new RegionIterator(region);
    Rect rect = new Rect();
    while (iterator.next(rect)) {
        canvas.drawRect(rect, paint);
    }
}

间接构造

//设置画笔的基本属性
Paint paint = new Paint();
//设置抗锯齿
paint.setAntiAlias(true);
//设置画笔颜色
paint.setColor(Color.GREEN);
//设置画笔宽度
paint.setStrokeWidth(5);
//设置填充样式
paint.setStyle(Paint.Style.STROKE);
//Region间接构造
RectF rectF = new RectF(50, 50, 200, 500);
Path path = new Path();
path.addOval(rectF, Path.Direction.CCW);
//在setPath()函数中传入一个比椭圆区域小的矩形区域,让其取交集
Region region = new Region();
region.setPath(path, new Region(50, 50, 200, 200));
//画出路径
paint.setStyle(Paint.Style.FILL_AND_STROKE);
drawRegion(canvas, region, paint);

区域相交

//设置画笔的基本属性
Paint paint = new Paint();
//设置抗锯齿
paint.setAntiAlias(true);
//设置画笔颜色
paint.setColor(Color.GREEN);
//设置画笔宽度
paint.setStrokeWidth(5);
//设置填充样式
paint.setStyle(Paint.Style.STROKE);
//区域相交:union()函数
Region region = new Region(10, 10, 210, 110);
region.union(new Rect(10, 10, 110, 310));
paint.setStyle(Paint.Style.FILL_AND_STROKE);
drawRegion(canvas, region, paint);

区域操作

//设置画笔的基本属性
Paint paint = new Paint();
//设置抗锯齿
paint.setAntiAlias(true);
//设置画笔颜色
paint.setColor(Color.GREEN);
//设置画笔宽度
paint.setStrokeWidth(5);
//设置填充样式
paint.setStyle(Paint.Style.STROKE);
//区域操作
Rect rect1 = new Rect(10, 110, 310, 210);
Rect rect2 = new Rect(110, 10, 210, 310);
canvas.drawRect(rect1, paint);
canvas.drawRect(rect2, paint);
Region region1 = new Region(rect1);
Region region2 = new Region(rect2);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
//交集:Region.Op.INTERSECT
//补集:Region.Op.DIFFERENCE
//异并集:Region.Op.XOR
//替换:Region.Op.REPLACE
//反转补集:Region.Op.REVERSE_DIFFERENCE
//并集:Region.Op.UNION
region1.op(region2, Region.Op.INTERSECT);
drawRegion(canvas, region1, paint);

平移

//设置画笔的基本属性
Paint paint = new Paint();
//设置抗锯齿
paint.setAntiAlias(true);
//设置画笔颜色
paint.setColor(Color.GREEN);
//设置画笔宽度
paint.setStrokeWidth(5);
//设置填充样式
paint.setStyle(Paint.Style.STROKE);
//平移:translate
canvas.translate(100, 100);
Rect rect = new Rect(0, 0, 400, 200);
paint.setStyle(Paint.Style.FILL);
canvas.drawRect(rect, paint);

裁剪

//裁剪:clipRect
canvas.drawColor(Color.RED);
canvas.clipRect(new Rect(100,100,200,200));
canvas.drawColor(Color.GREEN);