Canvas基础知识

本文详细介绍使用Android Canvas进行各种图形绘制的方法,包括直线、点、矩形等基本图形,以及路径绘制、变换技巧等内容,并深入探讨了如何利用BitmapShader实现纹理填充。
public class TestView1 extends View {
    private Bitmap mBitmap;
    private BitmapShader mBitmapShader;
    public TestView1(Context context) {
        super(context);
    }

    public TestView1(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        mBitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.xyjy2)).getBitmap();
        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
    }

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

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public TestView1(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //绘制直线
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.FILL);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(10);
        paint.setShader(mBitmapShader);
        paint.setAntiAlias(true);

		canvas.drawLine(0, 0, 100, 100, paint);
       
    }

}

float []pts = {0,0,100,100,200,200,300,300};
		canvas.drawLines(pts, paint);


float []pts = {0,0,100,100,200,200,300,300};

        canvas.drawPoint(500, 500, paint);
		canvas.drawPoints(pts, paint);


RectF r = new RectF(100, 100, 400, 500);
		canvas.drawRect(r, paint);
		//canvas.drawRect(left, top, right, bottom, paint);

RectF r = new RectF(100, 100, 400, 500);
//		canvas.drawRect(r, paint);
		//canvas.drawRect(left, top, right, bottom, paint);

        //画圆角矩形
        //x-radius ,y-radius圆角的半径
		canvas.drawRoundRect(r, 30, 30, paint);



canvas.drawCircle(300, 300, 200, paint);


RectF r = new RectF(100, 100, 400, 500);

        paint.setColor(Color.GREEN);
        canvas.drawOval(r, paint);


RectF r = new RectF(100, 100, 400, 500);

//		canvas.drawArc(
//				r,
//				startAngle, //其实角度,相对X轴正方向
//				sweepAngle, //画多少角度的弧度
//				useCenter, //boolean, false:只有一个纯弧线;true:闭合的边
//				paint);
		canvas.drawArc(r, 0, 90, true, paint);//顺时针旋转90度


Path path = new Path();
		path.moveTo(100, 100);//画笔落笔的位置
		//移动
		path.lineTo(200, 100);
		path.lineTo(200, 200);
		path.cubicTo(250, 200, 350, 300, 450, 400);
		path.close();

		canvas.drawPath(path, paint);


//圆角矩形路径
        RectF r = new RectF(100, 100, 600, 800);
        Path path = new Path();
        float radii[] = {10,10,10,10,10,10,50,60};
        path.addRoundRect(r, radii, Path.Direction.CCW);
        //path.addArc(oval, startAngle, sweepAngle);
        canvas.drawPath(path, paint);


//--------------------Canvas变换技巧--------------------------
        //1.平移(Translate)

        // 绘制坐标系
		RectF r = new RectF(0, 0, 400, 500);
        paint.setColor(Color.GREEN);
		canvas.drawRect(r, paint);

        // 第一次绘制坐标轴
        canvas.drawLine(0,0,canvas.getWidth(),0,paint);// X 轴
        paint.setColor(Color.BLUE);
        canvas.drawLine(0,0,0,canvas.getHeight(),paint);// Y 轴

        //平移--即改变坐标原点
		canvas.translate(50, 50);
        // 第二次绘制坐标轴
        paint.setColor(Color.GREEN);
        canvas.drawLine(0,0,canvas.getWidth(),0,paint);// X 轴
        paint.setColor(Color.BLUE);
        canvas.drawLine(0,0,0,canvas.getHeight(),paint);// Y 轴

        canvas.rotate(45);
        // 第三次绘制坐标轴
        paint.setColor(Color.GREEN);
        canvas.drawLine(0,0,canvas.getWidth(),0,paint);// X 轴
        paint.setColor(Color.BLUE);
        canvas.drawLine(0,0,0,canvas.getHeight(),paint);// Y 轴

canvas.drawColor(Color.BLUE);
		RectF r2 = new RectF(0, 0, 400, 500);
		paint.setColor(Color.RED);
		//虽然新建了一个画布图层,但是还是会沿用之前设置的平移变换。不可逆的。(save和restore来解决)
		canvas.drawRect(r2, paint);

//2.缩放Scale
		RectF r = new RectF(0, 0, 400, 500);
		canvas.drawRect(r, paint);
		paint.setColor(Color.BLUE);
        //sx,sy:分别对x/y方向的一个缩放系数,画布的缩放会导致里面所有的绘制的东西都会有一个缩放效果
		canvas.scale(1.5f, 0.5f);
		canvas.drawRect(r, paint);
//3.旋转Rotate
		RectF r = new RectF(200, 200, 400, 500);
		canvas.drawRect(r, paint);
		paint.setColor(Color.BLUE);
		canvas.rotate(45);
		//canvas.rotate(45, 200, 200);
		canvas.drawRect(r, paint);
//4.斜拉画布Skew
		RectF r = new RectF(100, 100, 600, 800);
		canvas.drawRect(r, paint);
		paint.setColor(Color.BLUE);
		//sx,sy倾斜度:X轴方向上倾斜60度,tan60=根号3
		canvas.skew(1.73f, 0);
		canvas.drawRect(r, paint);

//5.裁剪画布clip
        RectF r = new RectF(200, 200, 400, 500);
        canvas.drawRect(r, paint);
        paint.setColor(Color.BLUE);
        canvas.clipRect(new Rect(250, 250, 300, 400));
        canvas.drawColor(Color.YELLOW);

// save 和 restore

        RectF r = new RectF(0, 0, 400, 500);
        paint.setColor(Color.GREEN);
        canvas.drawRect(r, paint);
        canvas.save();
        //平移
        canvas.translate(50, 50);


        paint.setColor(Color.BLUE);
        canvas.drawRect(r, paint);

        canvas.restore();
        canvas.rotate(45);

        paint.setColor(Color.YELLOW);
        r = new RectF(0, 0, 200, 200);

        canvas.drawRect(r, paint);


 //当canvas执行saveLayer的时候就会新建一个新的画布图层
        int layer = canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),null,Canvas.ALL_SAVE_FLAG);

        canvas.drawColor(Color.YELLOW);
        canvas.translate(50, 50);
        paint.setColor(Color.BLUE);
        canvas.drawRect(r, paint);

        canvas.restoreToCount(layer);






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值