`
1025250620
  • 浏览: 229850 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android clipPath切割画布

 
阅读更多

(转自:http://wallage.blog.163.com/blog/static/1738962420101012439991/)

 

 

 

  1. public class PictureTestActivity extends Activity {  
  2.    
  3.        @Override  
  4.        public void onCreate(Bundle savedInstanceState){  
  5.            super.onCreate(savedInstanceState);  
  6.            setContentView(new SampleView(this));  
  7.        }  
  8.         private static class SampleView extends View {  
  9.             private Paint mPaint;  
  10.             private Path mPath;  
  11.             public SampleView(Context context) {  
  12.                 super(context);  
  13.                 setFocusable(true);  
  14.                   
  15.                 mPaint = new Paint();  
  16.                 mPaint.setAntiAlias(true);  
  17.                 mPaint.setStrokeWidth(6);  
  18.                 mPaint.setTextSize(16);  
  19.                 mPaint.setTextAlign(Paint.Align.RIGHT);  
  20.                   
  21.                 mPath = new Path();  
  22.             }  
  23.               
  24.             private void drawScene(Canvas canvas) {  
  25.                 canvas.clipRect(00100100);  
  26.                   
  27.                 canvas.drawColor(Color.WHITE);  
  28.                   
  29.                 mPaint.setColor(Color.RED);  
  30.                 canvas.drawLine(00100100, mPaint);  
  31.                   
  32.                 mPaint.setColor(Color.GREEN);  
  33.                 canvas.drawCircle(307030, mPaint);  
  34.                   
  35.                 mPaint.setColor(Color.BLUE);  
  36.                 canvas.drawText("Clipping"10030, mPaint);  
  37.             }  
  38.               
  39.             @Override   
  40.             protected void onDraw(Canvas canvas) {  
  41.                 canvas.drawColor(Color.GRAY);              
  42.                 canvas.save();  
  43.                 canvas.translate(1010);  
  44.                 drawScene(canvas);  
  45.                 canvas.restore();  
  46.                   
  47.                 canvas.save();  
  48.                 canvas.translate(16010);  
  49.                 canvas.clipRect(10109090);  
  50.                 canvas.clipRect(30307070, Region.Op.DIFFERENCE);  
  51.                 drawScene(canvas);  
  52.                 canvas.restore();  
  53.                   
  54.                 canvas.save();  
  55.                 canvas.translate(10160);  
  56.                 mPath.reset();  
  57.                 canvas.clipPath(mPath); // makes the clip empty  
  58.                 mPath.addCircle(505050, Path.Direction.CCW);  
  59.                 canvas.clipPath(mPath, Region.Op.REPLACE);  
  60.                 drawScene(canvas);  
  61.                 canvas.restore();  
  62.                   
  63.                 canvas.save();  
  64.                 canvas.translate(160160);  
  65.                 canvas.clipRect(006060);  
  66.                 canvas.clipRect(4040100100, Region.Op.UNION);  
  67.                 drawScene(canvas);  
  68.                 canvas.restore();  
  69.                   
  70.                 canvas.save();  
  71.                 canvas.translate(10310);  
  72.                 canvas.clipRect(006060);  
  73.                 canvas.clipRect(4040100100, Region.Op.XOR);  
  74.                 drawScene(canvas);  
  75.                 canvas.restore();  
  76.                   
  77.                 canvas.save();  
  78.                 canvas.translate(160310);  
  79.                 canvas.clipRect(006060);  
  80.                 canvas.clipRect(4040100100, Region.Op.REVERSE_DIFFERENCE);  
  81.                 drawScene(canvas);  
  82.                 canvas.restore();  
  83.             }  
  84.         }  
  85. }  

 

效果如图:

 

 

 

 

canvas.clipRect(30, 30, 70, 70, Region.Op.XOR);最后一个参数有多个选择分别是:

            //DIFFERENCE是第一次不同于第二次的部分显示出来
            //REPLACE是显示第二次的
            //REVERSE_DIFFERENCE 是第二次不同于第一次的部分显示
            //INTERSECT交集显示
            //UNION全部显示
            //XOR补集 就是全集的减去交集生育部分显示

分享到:
评论

相关推荐

    Android-使用clippath实现的CircleImageView没有Bitmap没有锯齿

    在Android的Canvas类中,`clipPath()`是一个用于剪裁绘制区域的方法,它可以将当前的绘图限制在一个特定的路径内。通过这个功能,我们可以创建出各种形状的视图,比如圆形。在实现CircleImageView时,我们可以通过`...

    Android canvas画图操作之切割画布实现方法(clipRect)

    本篇文章将详细介绍如何使用`clipRect`方法来切割Android Canvas画布,以及它的工作原理和相关选项。 `clipRect`方法允许开发者限制在画布上绘制的区域,换句话说,它可以帮助我们“剪裁”或“切割”画布。此方法的...

    安卓Android源码——(Canvas画布).rar

    这份“安卓Android源码——(Canvas画布).rar”压缩包很可能是包含了一些关于Canvas使用的源代码示例或者解析,帮助我们深入理解Android图形绘制的底层机制。 Canvas是Android中的一个类,它允许开发者通过调用其...

    Android应用源码之(Canvas画布)(-IT计算机-毕业设计.zip

    本项目源码深入探讨了如何利用Canvas在Android应用中实现画布操作,非常适合毕业设计或移动开发App的学习者参考。以下是Canvas画布相关的知识点详解: 1. **Canvas基本概念**: - Canvas是Android中的一个类,它...

    ClipPath实用的路径拷贝工具

    ClipPath是一款实用的工具,主要用于方便用户快速复制和管理文件路径。在日常的计算机操作中,我们经常需要复制文件或文件夹的路径,以便在不同的程序或文件夹之间进行引用。传统的复制路径方法可能繁琐且易出错,而...

    基于SVG clipPath的预览图变形特效幻

    本主题聚焦于SVG中的`clipPath`元素,这是一种强大的工具,可以用来定义图形显示的区域,通过裁剪或遮罩的方式实现各种视觉效果。在这个“基于SVG clipPath的预览图变形特效幻灯片”中,我们将深入探讨如何利用这个...

    SVG clipPath炫酷卡片膨胀动画特效

    这是codrops出品的一款HTML5 SVG clipPath炫酷卡片膨胀动画特效。该特效采用网格卡片布局,当用户点击其中一张卡片的时候,伴随一个非常酷的运动效果,它会切换到另一个页面,并变形为封面图片。

    android 具有图片斜切功能的自定义控件

    本篇文章将详细讲解如何在Android中创建一个具有图片斜切功能的自定义控件,该控件是基于ImageView进行扩展的,支持加载本地或网络图片,并可以根据实际需求进行定制化的图片切割。 首先,我们创建一个新的类,继承...

    android 圆形imageview实现 带自定定义大小

    我们需要计算图像的半径,并确保画布的剪切区域是圆形的。 ```java @Override protected void onDraw(Canvas canvas) { Bitmap bitmap = BitmapFactory.decodeResource(getResources(), getImageResource()); if ...

    android 取矢量图部分图片

    `Canvas`是用来绘制图形的画布,而`Path`则是定义图形形状的对象。通过解析矢量图的XML,我们可以获取到各个路径元素,然后用`Canvas`在指定区域内绘制这些路径。 2. **提取矢量图部分**:如果你需要从矢量图中提取...

    Android 头像适配6.0、 7.0、 8.0

    2. **圆形头像**:很多应用倾向于使用圆形或椭圆形头像,可以使用`android.graphics.Path`和`android.graphics.Canvas`来绘制,或者使用`ClipPath`属性。自API 21起,Android引入了`android.widget.ImageView`的`...

    Android裁剪图片为圆形图片Demo

    - `Shader`类是Android图形系统的一部分,它定义了颜色和纹理如何应用于画布上的形状。 2. **Paint对象** - 使用`Paint`对象,我们可以设置`BitmapShader`并将其应用于我们的`Canvas`。`Paint`对象包含了绘制时的...

    Android自定义TextView带圆角边框颜色(动态更改边框颜色)

    在`onDraw`方法中,我们首先调用`super.onDraw`绘制文本,然后根据圆角半径是否大于零决定是否使用`Path`和`addRoundRect`来创建一个带有圆角的矩形,并通过`canvas.clipPath`裁剪画布。最后,使用`canvas.drawPaint...

    android横屏半圆侧边栏

    3. **绘制半圆**:使用`Path`对象构建半圆形路径,然后使用`canvas.clipPath(path)`来限制画布的绘制区域。以下代码示例创建一个半圆路径: ```java Path path = new Path(); path.addArc(new RectF(0, 0, width,...

    Android 绘制圆形头像

    本文介绍了在Android应用中实现圆形头像绘制的两种方法:使用`BitmapShader`和使用`Path`配合`ClipPath`。每种方法都有其适用场景和优缺点,开发者可以根据具体需求选择合适的方法来实现圆形头像的功能。同时,还...

    Android圆形相机预览窗口,圆形SurfaceView

    接着调用`canvas.clipPath(path)`来裁剪Canvas,限制绘制区域为圆形。最后,调用`super.onDraw(canvas)`来绘制相机预览。 4. **开启相机预览**:在自定义的SurfaceView中,你需要设置一个`SurfaceHolder.Callback`...

    Android下使用Canvas画图

    - Canvas是Android系统提供的一个类,它提供了在二维画布上进行绘制的方法。 - 通常,我们会在一个Bitmap对象上操作Canvas,因为Bitmap是Android中的像素存储介质,Canvas则负责在Bitmap上进行绘制操作。 - 除了...

    Android代码-弹性视图是一种常规的CardView,可以从用户触摸中进行弯曲。

    在ElasticView的`onDraw()`方法中,开发者需要使用Canvas来绘制视图的背景、边框以及内容,同时根据当前的弯曲状态调整画布的剪裁区域(`clipPath()`或`clipRect()`)和变形(`drawARGB()`或`drawBitmapMatrix()`)...

    Android 圆形、圆角图片

    4. **自定义View**:如【描述】所述,创建一个自定义的ImageView子类,在onDraw()方法中利用canvas.clipPath()或者canvas.drawRoundRect()来绘制圆形或圆角图片。 5. **使用第三方库**:例如,`CircleImageView` 或...

Global site tag (gtag.js) - Google Analytics