canvas教程

Android2DGraphics学习(二)、Canvas篇2、Canvas裁剪和Region、

字号+ 作者:H5之家 来源:H5之家 2017-12-18 18:50 我要评论( )

Android2DGraphics学习(二)、Canvas篇2、Canvas裁剪和Region、RegionIterator_newdanger706_新浪博客,newdanger706,

canvas 还提供裁剪的功能。

裁剪功能由Canvas提供的一系列的clip...方法 和quickReject方法来完成。前面已经提到,真正提供可绘制区域的是Canvas内部的mutable bitmap。 Canvas更像是一个图层,我们只能在这上面的图层来绘制东西。

1、首先介绍Region类

Region,中文意思即区域的意思,它表示的是canvas图层上的某一块封闭的区域。

[java] view plain

  • public void setEmpty() {
  • public boolean set(Region region)
  • public boolean set(Rect r)
  • public boolean setPath(Path path, Region clip) //用指定的Path和裁剪范围构建一个区域
  • public Rect getBounds()
  • public boolean getBounds(Rect r)
  • public Path getBoundaryPath()
  • public boolean quickReject(Rect r) //是否没和该矩阵相交
  • scale, Region dst);//hide
  • public boolean op(Rect r, Op op) {
  • bottom, Op op)
  • public boolean op(Region region, Op op)
  • public boolean op(Rect rect, Region region, Op op)
  • public Region() //创建一个空的区域 public Region(Region region) //拷贝一个region的范围 public Region(Rect r) //创建一个矩形的区域 public Region(int left, int top, int right, int bottom) //创建一个矩形的区域 public void setEmpty() { public boolean set(Region region) public boolean set(Rect r) public boolean set(int left, int top, int right, int bottom) public boolean setPath(Path path, Region clip) //用指定的Path和裁剪范围构建一个区域 public native boolean isEmpty();//判断该区域是否为空 public native boolean isRect(); //是否是一个矩阵 public native boolean isComplex();//是否是多个矩阵组合 public Rect getBounds() public boolean getBounds(Rect r) public Path getBoundaryPath() public boolean getBoundaryPath(Path path) public native boolean contains(int x, int y);//是否包含某点 public boolean quickContains(Rect r) //是否包含某矩阵 public native boolean quickContains(int left, int top, int right, int bottom) //是否没有包含某矩阵 public boolean quickReject(Rect r) //是否没和该矩阵相交 public native boolean quickReject(int left, int top, int right, int bottom); //是否没和该矩阵相交 public native boolean quickReject(Region rgn); //是否没和该矩阵相交 public void translate(int dx, int dy) public native void translate(int dx, int dy, Region dst); public void scale(float scale) //hide public native void scale(float scale, Region dst);//hide public final boolean union(Rect r) public boolean op(Rect r, Op op) { public boolean op(int left, int top, int right, int bottom, Op op) public boolean op(Region region, Op op) public boolean op(Rect rect, Region region, Op op)
    上面几乎是Region的所有API,很好理解,主要说明一下最后的一组关于Region组合的方式。组合即当前的Region和另外的一个Region组合,可以用不同的Op方式来进行组合。

    Op是一个枚举,定义在Region类中。

    [java] view plain

  • 假设用region1 去组合region2
  • // 最终区域为region1 与 region2相交的区域
  • }
  • 假设用region1 去组合region2 public enum Op { DIFFERENCE(0), //最终区域为region1 与 region2不同的区域 INTERSECT(1), // 最终区域为region1 与 region2相交的区域 UNION(2), //最终区域为region1 与 region2组合一起的区域 XOR(3), //最终区域为region1 与 region2相交之外的区域 REVERSE_DIFFERENCE(4), //最终区域为region2 与 region1不同的区域 REPLACE(5); //最终区域为为region2的区域 }

    ApiDemo中已经提供了一个关于组合的例子,在最后面给出。

    Android还提供了一个RegionIterator来对Region中的所有矩阵进行迭代,可以使用该类,获得某个Region的所有矩阵。比较简单。

    2、什么是裁剪

    裁剪Clip,即裁剪Canvas图层,我们绘制的东西,只能在裁剪区域的范围能才能显示出来。

    [java] view plain

  • @Override
  • protected void onDraw(Canvas canvas) {
  • canvas.save();
  • canvas.drawColor(Color.BLUE);//裁剪区域的rect变为蓝色
  • ), paint);//在裁剪的区域之外,不能显示
  • , paint);//在裁剪区域之内,能显示
  • canvas.restore();
  • }
  • @Override protected void onDraw(Canvas canvas) { Paint paint=new Paint(); canvas.save(); canvas.clipRect(new Rect(100,100,300,300)); canvas.drawColor(Color.BLUE);//裁剪区域的rect变为蓝色 canvas.drawRect(new Rect(0,0,100,100), paint);//在裁剪的区域之外,不能显示 canvas.drawCircle(150,150, 50, paint);//在裁剪区域之内,能显示 canvas.restore(); }
    裁剪并不像Matrix变换,它相对于mutable bitmap的坐标是不会改变的。所以超出裁剪区域的绘制不会被显示


    3、裁剪的保存和回滚

    在之前已经提到了,canvas.save()和canvas.restore()不仅对matrix有效,同样对clip有类似的效果。


    4、裁剪的方式

    Canvas提供了三种裁剪的方式:

    1、最基本的clipRect,裁剪一个矩形

    2、clipPath,裁剪Path包括的范围,Path所包括的范围不是空的才有效。

    3、clipRegion。

    Region在前面已经介绍过了,其实Region就是一个对区域组合的一个封装。但是它和clipRect和clipPath的最大区别在于下面:

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    网友点评