android clipRect Op.xxx各个参数理解

简介:

有点小啰嗦的一篇学习笔记,可以直接看最后得出的结论:前面的各种图片和说明都是为最后的结论服务的

1)剪切:和平常画图工具剪切的作用一样,在画布上剪切一个区域,比如剪切一个Rect区域,画布canvas其余的部分都丢掉,之后所有的画图都在这个Rect区域内进行(如果不涉及save和restore方法)。

2)clip进行剪切的时候,不会影响之前已经画好的图形。

3)剪切是对canvas的操作,而不是在canvas上的图进行操作。

为了说明这几点,下面进行一下说明。


步骤1) 在剪切之前绘制一个全屏的蓝色的矩形。

2)定义剪切的矩形Rect区域,并进行剪切

3)设置剪切过后画布颜色为红色

运行的效果如下图所示:此时剪切过后画布的区域就是剪切的Rect区域,虽然剪切掉了canvas上面和下面的一部分,但是仍然会把途中所示的蓝色部分显示出来而不会剪切掉:也就是如上所说不会影响之前已经画好的图形。

\

 

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
protected  void  onDraw(Canvas canvas) {
         int  width = getMeasuredWidth();
         int  height = getMeasuredHeight();
         
         
         Paint paint = new  Paint();
         paint.setColor(Color.BLUE);    
         //全屏绘制一个蓝色的矩形画面
         canvas.drawRect( 0 , 0 ,width,height,paint);
     
         //定义剪切的Rect区域
         Rect rect = new  Rect();
         rect.left = 0 ;
         rect.top = 300 ; //左上角(0,300)
         rect.right = width;
         rect.bottom = height/ 2 ; //右下角(width,height)
         //进行剪切   
         canvas.clipRect(rect)
         canvas.drawColor(Color.RED);
      
     }

上面的clipRect是只有一个参数的(默认为INTERSECT,下面看看它的重载方法Cliprect(rect,OP.xx)第二个参数以及各个参数的含义和运行效果:

开始之前做些准备工作:

区域A:剪切之前的画布区域

区域B:当前要剪切的区域,也就是clipRect的第一个参数所表示的区域


在没有直接写代码测试之前对这些字段的翻译和查阅写数学资料并对Op.xxx的各种字段在心里做了如下假设:

XOR:异或运算,相同为0(false),不用为1(true),也就是两个区域重叠的地方为0,不同的地方为1,剪切过后的画布的区域就是两个区域不重叠的部分。

INTERSECT:交集运算,剪切过后的画布区域就是两个区域的交集区域。

REPLACE:这个有待验证,不明所以,从字面意思来说是代替的意思,应该就是用B的区域代替A的区域,所以剪切过后的画布区域可能就是只剩下B的区域,当然这个只是假设,有待下面的验证过。

DIFFERENCE:差集运算,剪切过后的画布的区域就是A-B

REVERSE_DIFFERENCE:差集运算,REVERSE为反向,逆向的意思,不难猜出剪切过后的画布区域是B-A的区域

UNION:并集运算,剪切过后的画布区域就是A和B的区域相加,当然重叠的地方只计算一次

下面就写程序注意验证上面的结果和得出相应的结论

先是全集和子集的情况:此时A为全集区域,B为A的子集

\

a) Op.DIFFERENCE:即将剪切的区域(设置B)与当前canvas(设置A)之间的差集,剪切过后还剩下的画布canvas区域就是A-B的区域,看看运行结果

步骤还是之前的步骤,只是把canvas.clipRect(rect)改成canvas.clipRect(rect,Op.DIFFERENCE);运行结果如下:<喎�"/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"/uploadfile/Collfiles/20150212/2015021208423342.png" alt="\">

b) Op.REVERSE_DIFFERENCE:对比DIFFERENCE取A-B,REVERSE是相反的意思,所以为B-A,因为B为A的子集,所以该差集不存在,所以运行结果为下:

\

c) Op.XOR:两个区域进行异或运算,异或运算的规则是:“相同为0(false),不同为1(true)”,当两个区域进行异或的时候,很显然“区域重叠的地方为0,不重叠的地方为1”,剪切过后剩下的画布canvas的区域就是不重叠的地方所在的区域,看看运行结果

\

d) Op.UNION 取A和B的并集,所以运行结果为下图:

\

 

e) Op.INTERSECT 取A和B的交集,因为上面的程序中A是全屏的画布范围,而B在A里面,所以剪切的结果为下图所示,所以说交集为B的范围

\

f) Op.REPLACE,运行效果如下

\

通过全集和子集的运行效果来看,REPLACE应该就是跟上面设想的一样,其余的倒是跟设想的结论一样。

所以我就测试了非全集和子集的情况

此时A区域和B区域的关系如图,C为A和B的交集区域:

\

测试画图步骤:

1)绘制一个蓝色的矩形面

2)定义A的Rect对象(第一次要剪切的区域),并开始剪切

3)定义B的rect对象并开始剪切,并且调用clipRect(rect,Op.xxx)来看不用xxx下剪切的效果 

4)把剪切过后的画布设置为红色

上面步骤的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
                 int  width = 1000 ;
                 int  height = 1000 ;
                 Paint paint = new  Paint();
         paint.setColor(Color.BLUE);    
         //全屏绘制一个蓝色的矩形画面
         canvas.drawRect( 0 , 0 ,width,height,paint);
         
               //定义区域A的rect对象
         Rect rect = new  Rect();
         rect.left = 100 ;
         rect.top = 100 ; //左上角(0,300)
         rect.right = 300 ;
         rect.bottom = 300 ; //右下角(width,hei
         //剪切为A区域
         canvas.clipRect(rect); //同clipRect
         
                 //设置b的rect对象
         rect.left = 200 ;
         rect.top = 200 ; //左上角(0,300)
         rect.right = 400 ;
         rect.bottom = 400 ; //右下角(width,height) 
         canvas.clipRect(rect,Op.xxxx);
 
                 //把剪切过后的画布设置红色
                 canvas.drawColor(Color.RED);

 

a) DIFFERENCE的情况下的运行效果(A-B的差集):也就是A区域去掉C区域

\

b) REVERSE_DIFFERENCE的运行效果如下图(B-A的差集):也就是B区域去掉C区域

\

c) UNION 的运行结果 (A和B的并集)

\

d) INTERSECT (交集运算)此时画布只剩下C区域可以显示,所以运行结果如下

\

e)XOR 异或运算,剪切过后的结果为A和B区域不重叠的区域

\

f)REPLACE 这个运算结果是什么呢?就是B区域,也就是剪切过后的结果只保留B区域,这也就是REPLACE代替或者替换的含义:当前还没被剪切的区域A被即将要剪切的区域B来代替。


结论:

XOR:异或运算,相同为0(false),不用为1(true),也就是两个区域重叠的地方为0,不同的地方为1,剪切过后的画布的区域就是两个区域不重叠的部分。

INTERSECT:交集运算,剪切过后的画布区域就是两个区域的交集区域。

DIFFERENCE:差集运算,剪切过后的画布的区域就是A-B

REVERSE_DIFFERENCE:差集运算,REVERSE为反向,逆向的意思,不难猜出剪切过后的画布区域是B-A的区域

UNION:并集运算,剪切过后的画布的区域为A+B的区域

REPLACE:也就是剪切过后的结果只保留B区域,这也就是REPLACE代替或者替换的含义:当前还没被剪切的区域A被即将要剪切的区域B来代替。



    本文转自 一点点征服   博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6665033.html,如需转载请自行联系原作者

相关文章
|
4月前
|
Java Shell Linux
从 am start 的 --user 参数说到 Android 多用户
am start 命令有时并不会乖乖如我们所愿,这时候我们需要知对策并知其所以然。
96 16
|
7月前
|
Android开发 Kotlin
Android面试题之kotlin中怎么限制一个函数参数的取值范围和取值类型等
在Kotlin中,限制函数参数可通过类型系统、泛型、条件检查、数据类、密封类和注解实现。例如,使用枚举限制参数为特定值,泛型约束确保参数为Number子类,条件检查如`require`确保参数在特定范围内,数据类封装可添加验证,密封类限制为一组预定义值,注解结合第三方库如Bean Validation进行校验。
118 6
|
9月前
|
编解码 缓存 安全
Android SELinux 参数语法介绍及基础分析
Android SELinux 参数语法介绍及基础分析
260 0
|
9月前
|
Android开发
Android 动态修改参数配置
Android 动态修改参数配置
62 0
|
9月前
|
测试技术 Android开发
Android Poco初始化时,不大起眼但可能存在坑点的参数们
Android Poco初始化时,不大起眼但可能存在坑点的参数们
129 0
|
9月前
|
存储 XML Android开发
Android Studio App开发入门之数据存储中共享参数SharedPreferneces的讲解及使用(附源码 超详细必看)
Android Studio App开发入门之数据存储中共享参数SharedPreferneces的讲解及使用(附源码 超详细必看)
103 0
|
Java 数据安全/隐私保护 Android开发
app逆向实战强化篇——破解某安卓APP请求加密参数
app逆向实战强化篇——破解某安卓APP请求加密参数
|
机器学习/深度学习 人工智能 编解码
安卓手机上跑15亿参数大模型,12秒不到就推理完了
安卓手机上跑15亿参数大模型,12秒不到就推理完了
279 0
|
XML Android开发 数据格式
Android XML 布局基础(三)LayoutParams 布局参数
Android XML 布局基础(三)LayoutParams 布局参数
258 0
|
Android开发
Android TextView.setText() 实现字符串(String)+数值(Integer)作为参数
Android TextView.setText() 实现字符串(String)+数值(Integer)作为参数

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    Android历史版本与APK文件结构
  • 3
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 6
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 8
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 9
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 1
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    24
  • 2
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    32
  • 3
    Android历史版本与APK文件结构
    120
  • 4
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    28
  • 5
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    23
  • 6
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    56
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    37
  • 8
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    73
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    118
  • 10
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
    29