Android高级UI开发(四十四)canvas基本知识(2) 裁剪与区域

举报
yd_57386892 发表于 2020/12/28 23:15:54 2020/12/28
6.1k+ 0 0
【摘要】  裁剪: 裁剪后,canvas只能在裁剪出的这块rectF矩形上进行绘制。 区域: canvas图层上的一块封闭区域,如下rect2这个矩形区域,drawRegion绘制出这个区域。    package com.xiaowei.lsn7_canvas; import android.content.Context;import android.graphics.B...

 裁剪:

裁剪后,canvas只能在裁剪出的这块rectF矩形上进行绘制。
 

区域:

canvas图层上的一块封闭区域,如下rect2这个矩形区域,drawRegion绘制出这个区域。
 

  


      package com.xiaowei.lsn7_canvas;
      import android.content.Context;
      import android.graphics.Bitmap;
      import android.graphics.Canvas;
      import android.graphics.Color;
      import android.graphics.Paint;
      import android.graphics.Path;
      import android.graphics.Rect;
      import android.graphics.RectF;
      import android.graphics.Region;
      import android.graphics.RegionIterator;
      import android.graphics.drawable.BitmapDrawable;
      import android.util.AttributeSet;
      import android.view.View;
      /**
       * Created by xiaowei on 2019/5/14.
       */
      public class MyView3 extends View {
      private Bitmap mBitmap;
      public MyView3(Context context) {
      this(context,null);
       }
      public MyView3(Context context, AttributeSet attrs) {
      super(context, attrs);
       mBitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.xyjy2)).getBitmap();
       }
      @Override
      protected void onDraw(Canvas canvas) {
      super.onDraw(canvas);
      //step1. 裁剪画布练习:裁剪一个矩形路径,并在这个矩形里绘制绿色。
       Paint paint = new Paint();
       paint.setColor(Color.WHITE);
      //裁剪
      //没有裁剪前,绿色对整个画布,即整个屏幕染色。
       canvas.drawColor(Color.GREEN);
      //裁剪一块矩形 rectF
       RectF rectF = new RectF(100,100,400,400);
       Path path = new Path();
       path.addRect(rectF, Path.Direction.CCW);
       canvas.save();
       canvas.clipPath(path);
      //裁剪后,红色只能对裁剪出的这块rectF矩形范围内着色。
       canvas.drawColor(Color.RED);
      //step2. 区域画布练习:创建一个矩形区域,并用白色画笔画出这个矩形Region区域
      //区域:canvas图层上的一块封闭区域,如下rect2这个矩形区域,drawRegion绘制出这个区域。
       canvas.restore();//恢复到裁剪前的画布,所以一下rect2的x坐标为0是从整个屏幕左上角开始,并非是上面裁剪矩形path的左上角。
       paint.setStyle(Paint.Style.FILL);
       Rect rect2 = new Rect(0,800,100,900);
       Region region = new Region(rect2);
       drawRegion(canvas,region,paint);
       }
      private void drawRegion(Canvas canvas,Region rgn,Paint paint)
       {
       RegionIterator iter = new RegionIterator(rgn);
       Rect r = new Rect();
      while (iter.next(r)) {
       canvas.drawRect(r, paint);
       }
       }
      }
  
 

 参考资料:https://blog.csdn.net/yaorugang/article/details/42519363?ops_request_misc=&request_id=&biz_id=102&utm_source=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0

文章来源: blog.csdn.net,作者:冉航--小虾米,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/gaoxiaoweiandy/article/details/105840550

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。