PorterDuffXfermode学习笔记,2024年最新阿里面试场景题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

PorterDuffXfermode用于实现新绘制的像素(SRC)与Canvas上对应位置已有的像素(DEST)按照混合规则进行颜色混合。

记住:先绘制的图形为DEST

这个混合规则一个基本的知识点是,一个图片是由a和c组成的,a表示透明度,c表示color,其实这个规则,就是利用DEST的a和c的值与SRC的a和c进行计算得到的(即:Sa 、Da、Sc 、Da这四个值的混合运算)

简单讲,你用canvas先绘制一个黄色的圆形,再错位绘制一个蓝色方形,如果不使用PorterDuffXfermode规则的话,你只能得到两个效果,要么圆形覆盖方形,要么方形覆盖圆形,相交的部分要么是圆形的黄色,要么是方形的蓝色。

按照上述简单规则混合得到的效果太单一了,所以出现了PorterDuffXfermode模式

Android在绘图时会先检查该画笔Paint对象有没有设置Xfermode,如果没有设置Xfermode,那么直接将绘制的图形覆盖Canvas对应位置原有的像素;如果设置了Xfermode,那么会按照Xfermode具体的规则来更新Canvas中对应位置的像素颜色。

使用方法


离屏绘制:我们需要把绘制的核心代码放在saveLayer()和restoreToCount()之间即可。


//★禁用硬件加速:

setLayerType(View.LAYER_TYPE_SOFTWARE, null);  



//★新建图层    

  int layerId = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);  



      //★TODO 核心绘制代码 

       //1.画DEST图形

       canvas.drawCircle(r, r, r, paint);

       //2.给Paint设置PorterDuffXfermode

       paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));   

       //3.绘制SRC图形

       canvas.drawRect(r, r, r * 2.7f, r * 2.7f, paint);

       //4.最后将画笔去除Xfermode

       paint.setXfermode(null);



  //★还原图层

  canvas.restoreToCount(layerId);

Google官方图片的误读(略)

关于18种模式的解读(选择两个理解)

我们关心的区域

图片来自于启舰大神的博客

图片和文字均来自于启舰大神的博客

所以如上图所示,我们在计算源图像所在区域效果图时,需要着重关注两个区域:

1、如图标示区域一:区域一是源图像和目标图像的相交区域,由于在这个区域源图像和目标图像像素都不是空白像素,所以可以明显看出颜色的计算效果。

2、如图标示区域二:在区域二中,源图像所在区域的目标图像是空白像素,所以这块区域所表示的意义就是,当某一方区域是空白像素时,此时的计算结果。

总而言之:我们在下面的各个模式计算时,只需要关注图示中的区域一和区域二;其中区域一表示当源图像和目标图像像素都不是空白像素时的计算结果,而区域二则表示当某一方区域是空白像素时,此时的计算结果。

Mode.SRC

从公式中也可以看出,在处理源图像所在区域的相交问题时,全部以源图像显示

所以示例图像为:

Mode.SRC_IN

计算公式为:[Sa * Da, Sc * Da]

在这个公式中结果值的透明度和颜色值都是由Sa,Sc分别乘以目标图像的Da来计算的。所以当目标图像为空白像素时,计算结果也将会为空白像素。

示例图像为:

大家注意SRC_IN模式与SRC模式的区别,一般而言,是在相交区域时无论SRC_IN还是SRC模式都是显示源图像,而唯一不同的是,当目标图像是空白像素时,在SRC_IN所对应的区域也将会变成空白像素;

其实更严格的来讲,SRC_IN模式是在相交时利用目标图像的透明度来改变源图像的透明度和饱和度。当目标图像透明度为0时,源图像就完全不显示。

AvoidXfermode

AvoidXfermode的用法看这里这里:简单说这个外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传AvoidXfermode指的是正选(Mode.TARGET),或者反选(Mode.AVOID)指定的颜色值,而这个颜色只有一定容差。

最后用画笔所设置的颜色将其替换

最后

总而言之,成功是留给准备好的人的。无论是参加什么面试,都要做好充足的准备,注意好面试的礼仪和穿着,向面试官表现出自己的热忱与真诚就好。即使最后没有过关,也要做好经验的总结,为下一次面试做好充足准备。

这里我为大家准备了一些我在面试后整理的面试专题资料,除了面试题,还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家,希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

毕竟不管遇到什么样的面试官,去面试首先最主要的就是自己的实力,只要实力够硬,技术够强,就不怕面试拿不到offer!

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-QLBZfb1f-1713568951888)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值