Canvas

Canvas的使用以及高级部分
Canvas:画布、画板。
一、Canvas基本的使用
绘制直线、点、几何图形、曲线、Bitmap、圆弧等等
Path路径来绘制线条

1.Region区域

Canvas画布的正确的理解:
1)当canvas执行drawXXX的时候就会新建一个新的画布图层
canvas.drawRect(r, paint);
2)虽然后面新建了一个画布图层,但是还是会沿用之前设置的平移变换。不可逆的。(save和restore来解决)
canvas.translate(50, 50);
//当canvas执行drawXXX的时候就会新建一个新的画布图层
canvas.drawRect(r, paint);
RectF r2 = new RectF(0, 0, 400, 500);
paint.setColor(Color.RED);
//虽然新建了一个画布图层,但是还是会沿用之前设置的平移变换。不可逆的。(save和restore来解决)
canvas.drawRect(r2, paint);

画板的变换
如何恢复画板(恢复变换设置,已经画过的不会改变)
流程:
canvas.save(); //保存画布
xxx画板的设置变换,然后绘制
canvas.restore(); //恢复之前到保存的画布状态,已经画的不会被恢复,只是恢复画板设置

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


//      canvas.drawLine(0, 0, 100, 100, paint);
        float []pts = {0,0,100,100,200,200,300,300};
//      canvas.drawLines(pts, paint);
//      canvas.drawLines(pts, 20, 2, paint);//通过offset设置线的间隔距离,可以实现虚线效果

        //      canvas.drawPoint(500, 500, paint);
//      canvas.drawPoints(pts, paint);
        //Rect int和RectF float
//      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);
        paint.setColor(Color.GREEN);
//      canvas.drawOval(r, paint);

//      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);

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


//      RectF r = new RectF(100, 100, 400, 500);
//      Path path = new Path();
//      path.addOval(r, Direction.CCW);
//      
//      //创建一块矩形的区域
//      Region region = new Region(100, 100, 400, 500);
//      Region region1 = new Region();
//      region1.setPath(path, region);//path的椭圆区域和矩形区域进行交集
//      
//      //结合区域迭代器使用(得到图形里面的所有的矩形区域)
//      RegionIterator iterator = new RegionIterator(region1);
//      
//      Rect rect = new Rect();
//      while (iterator.next(rect)) {
//          canvas.drawRect(rect, paint);
//      }
//      //合并
//      region.union(r);
//      region.op(r, Op.INTERSECT);//交集部分

        //--------------------Canvas变换技巧--------------------------
        //1.平移(Translate)
//      RectF r = new RectF(0, 0, 400, 500);
//      canvas.drawRect(r, paint);
//      paint.setColor(Color.BLUE);
//      //将画布平移
//      canvas.translate(50, 50);
//      //当canvas执行drawXXX的时候就会新建一个新的画布图层
//      canvas.drawRect(r, paint);
//      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(200, 200, 400, 500);
//      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);



    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值