解释都在代码注释中:

 public class SampleView extends View {
private Paint mPaint;
private Path mPath; public SampleView(Context context) {
super(context);
setFocusable(true); mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(6);
mPaint.setTextSize(16);
mPaint.setTextAlign(Paint.Align.RIGHT); mPath = new Path();
} private void drawScene(Canvas canvas) {
canvas.clipRect(0, 0, 100, 100); canvas.drawColor(Color.WHITE); mPaint.setColor(Color.RED);
canvas.drawLine(0, 0, 100, 100, mPaint); mPaint.setColor(Color.GREEN);
canvas.drawCircle(30, 70, 30, mPaint); mPaint.setColor(Color.BLUE);
canvas.drawText("Clipping", 100, 30, mPaint);
} @Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.GRAY);
canvas.save();
canvas.translate(10, 10);
drawScene(canvas);
canvas.restore(); // Region.Op.DIFFERENCE B-A
canvas.save();
canvas.translate(160, 10);
canvas.clipRect(10, 10, 90, 90); // B
canvas.clipRect(30, 30, 70, 70, Region.Op.DIFFERENCE); // A
drawScene(canvas);
canvas.restore(); // 这里因为在3.0以上的硬件上开启了硬件加速,会有问题.
// Region.Op.REPLACE 不论A和B的集合状况,B的范围将全部进行显示,如果和A有交集,则将覆盖A的交集范围
// canvas.save();
// canvas.translate(10, 160);
// mPath.reset();
// canvas.clipPath(mPath); // B
// mPath.addCircle(50, 50, 50, Path.Direction.CCW);
// canvas.clipPath(mPath, Region.Op.REPLACE);// A
// drawScene(canvas);
// canvas.restore(); // Region.Op.UNION AB并集范围
canvas.save();
canvas.translate(160, 160);
canvas.clipRect(0, 0, 60, 60);// B
canvas.clipRect(40, 40, 100, 100, Region.Op.UNION);// A
drawScene(canvas);
canvas.restore(); // Region.Op.XOR 异或,去掉AB相交的部分
canvas.save();
canvas.translate(10, 310);
canvas.clipRect(40, 40, 100, 100); // B
canvas.clipRect(0, 0, 60, 60, Region.Op.XOR); // A
drawScene(canvas);
canvas.restore(); // Region.Op.REVERSE_DIFFERENCE A-B
canvas.save();
canvas.translate(160, 310);
canvas.clipRect(0, 0, 60, 60); // B
canvas.clipRect(40, 40, 100, 100, Region.Op.REVERSE_DIFFERENCE);// A
drawScene(canvas);
canvas.restore();
}
}

这个在游戏中还是很常用的。

关于硬件加速的问题,http://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling

谷歌文档说的很清楚。

android SurfaceView绘制 重新学习--切图clipRect详解的更多相关文章

  1. ps切图抠图详解-web前端(转)

    网页设计在技术层面上,第一步是美工做出网页效果图,第二步就是网页前端进行网页切图.网页切图工具常用的有fireworks.PS,这里使用PS进行网页切图. 我们通过设计稿,得到我们想要的产出物(如.p ...

  2. android SurfaceView绘制 重新学习--控制动画移动

    直接上demo,图是自己切的,将就用吧.点击左右两边分别向左右移动. public class MySurfaceView extends SurfaceView implements Callbac ...

  3. android SurfaceView绘制 重新学习--基础绘制

    自从大二写了个android游戏去参加比赛,之后就一直写应用,一直没用过SurfaceView了,现在进入了游戏公司,准备从基础开始重新快速的学一下这个,然后再去研究openGL和游戏引擎. 直接上代 ...

  4. Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

    [Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.And ...

  5. 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

    本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...

  6. Asp.Net MVC学习总结之过滤器详解(转载)

    来源:http://www.php.cn/csharp-article-359736.html   一.过滤器简介 1.1.理解什么是过滤器 1.过滤器(Filters)就是向请求处理管道中注入额外的 ...

  7. [深入学习Web安全](5)详解MySQL注射

    [深入学习Web安全](5)详解MySQL注射 0x00 目录 0x00 目录 0x01 MySQL注射的简单介绍 0x02 对于information_schema库的研究 0x03 注射第一步—— ...

  8. Activiti工作流学习之流程图应用详解

    Activiti工作流学习之流程图应用详解 1.目的  了解Activiti工作流是怎样应用流程图的. 2.环境准备2.1.相关软件及版本    jdk版本:Jdk1.7及以上 IDE:eclipse ...

  9. [转帖]Docker学习之Dockerfile命令详解

    Docker学习之Dockerfile命令详解 https://it.baiked.com/system/docker/2436.html 图挺好的 前言 之前,制作镜像的伪姿势搭建已经见过了,今天介 ...

随机推荐

  1. JNI 学习笔记系列(二)

    c中没有Boolean类型的值,一般是使用1表示true,0表示false,c中也没有String类型的数据,c中的字符串要通过char数组来表示.c中没有byte类型,一般用char表示byte类型 ...

  2. Java基础知识强化之IO流笔记54:IO流练习之 LineNumberReader的特有的功能使用

    1. LineNumberReader的特有的功能:  BufferedReader |--LineNumberReader  public int getLineNumber():获得当前行号.   ...

  3. android ViewPager滑动事件讲解

    首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener OnPageChangeListener这个接口需要实现三个方法:(onPageScrollStateChan ...

  4. Mac通过以太网共享网络

    在日常工作和学习中,需要WiFi热点而没有路由器,这个时候我们可以用我们工作的Mac来共享网络. 系统偏好设置->共享->互联网共享:设置共享来源和共享端口->WiFi选项:设置网络 ...

  5. Unity3D 中3D刚体组件的力

    一般一个物体除了手动添加刚体受到重力作用外,还可以给该刚体添加一个其他的力. 这里就要涉及到一个恒定力(Constant Force)组件 首先要去掉物体的重力(因为重力是刚体组件中默认的一个向下的力 ...

  6. JVM内存模型及垃圾回收机制

    http://blog.csdn.net/zhangpengju999/article/details/11773183 JVM垃圾回收机制 分代垃圾回收 不同的对象生命周期不同.与业务信息有关的对象 ...

  7. (转) ASP.NET反射

    原文:http://www.cnblogs.com/zizo/p/3509895.html 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何 ...

  8. (SQL Analyzer services)定义链接维度

    链接文档是在一个 Analysis Services 数据库中存在.但在相同版本和兼容级别的另一个 Analysis Services 数据库中重复使用的一种文档. 链接文档是只读的. 如果您想要修改 ...

  9. bootstrap 正则表达式

    <asp:TextBox runat="server"  title="邮箱正确格式:xxx@xxx.xxx" class="form-cont ...

  10. Jquery VailDate初探

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...