关于 Xfermode 正确理解姿势

2024-06-07 20:18

本文主要是介绍关于 Xfermode 正确理解姿势,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者: 夏至 欢迎转载,但保留这段申明
http://blog.csdn.net/u011418943/article/details/79310254

首先,先抛出一张 Google 的示例图,这是一张让人尴尬的效果图:
这里写图片描述

为啥这么说?

因为这张图为了能够显示 PorterDuff 的效果,代码是做了一些效果的,这就导致了一些小伙伴在写 demo 理解的时候,发现跟 Google 的效果不一致,从而产生疑问,是不是我写错了?哪里不一致呢?比如我写了 SRC_IN 这个模式,按照上面的效果,应该是这样的:
这里写图片描述

而实际上,却是这样的:
这里写图片描述

咦,为啥是这样的,我进入的姿势不对? 这里写图片描述

不要急,这里我想说的是,你没有理解错,只是源码做了处理而已。

1、ApiDemo 的代码

先看一下 ApiDemo 的代码, src 和 dst 是一张图片,而玄机就在这里,首先先看 src(即蓝色的图片)的代码:

  // create a bitmap with a rect, used for the "src" imagestatic Bitmap makeSrc(int w, int h) {Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);Canvas c = new Canvas(bm);Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);p.setColor(0xFF66AAFF);c.drawRect(w/3, h/3, w*19/20, h*19/20, p);return bm;}

可以看到,虽然设置了 宽 和 高,但是实际canvas在画的时候,却没有填满,而留一段空白区域出来。我们在四周加一个边框,看一下效果:
这里写图片描述

可以看到,这里留了一大段的空白区域,同理,dst 的图片也是如此:
这里写图片描述
而 SRC_IN 是两者相较的地方绘制,那么上面这两张图绘制的结果,就只能是这样:
这里写图片描述

真相终于大白了,原来是这厮
这里写图片描述

嗯,那么,来一段帮助你理解这些模式的代码,去折腾吧:

public class XfermodeView extends View {private static final String TAG = "XfermodeView";private PorterDuffXfermode mPdXfermode;   //定义PorterDuffXfermode变量//定义MODE常量,等下直接改这里即可进行测试private static PorterDuff.Mode PD_MODE = PorterDuff.Mode.SRC_IN         ;private int mScreenW, mScreenH; //屏幕宽高private int mWidth = 200;      //绘制的图片宽高private int nHeight = 200;private Bitmap mSrcBitmap, mDstBitmap;     //上层SRC的Bitmap和下层Dst的Bitmapprivate Paint mShowpaint;public XfermodeView(Context context) {this(context, null);}public XfermodeView(Context context, AttributeSet attrs) {super(context, attrs);mShowpaint = new Paint();mShowpaint.setStyle(Paint.Style.STROKE);mShowpaint.setStrokeWidth(2);mScreenW = ScreenUtil.getScreenW(context);mScreenH = ScreenUtil.getScreenH(context);//创建一个PorterDuffXfermode对象mPdXfermode = new PorterDuffXfermode(PD_MODE);//实例化两个BitmapmSrcBitmap = makeSrc(mWidth, nHeight);mDstBitmap = makeDst(mWidth, nHeight);}public XfermodeView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}//定义一个绘制圆形Bitmap的方法,作为dst图private Bitmap makeDst(int w, int h) {Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);Canvas c = new Canvas(bm);Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);p.setColor(0xFF26AAD1);c.drawOval(new RectF(0, 0, w * 3 / 4, h * 3 / 4), p);//画四周的边框线mShowpaint.setColor(0xFF26AAD1);c.drawRect(0,0,w,h, mShowpaint);return bm;}//定义一个绘制矩形的Bitmap的方法,作为src图private Bitmap makeSrc(int w, int h) {Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);Canvas c = new Canvas(bm);Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);p.setColor(0xFFFFCE43);Log.d(TAG, "zsr --> makeSrc: "+w/3+"  "+w*19/20);c.drawRect(w / 3, h / 3, w * 19 / 20, h * 19 / 20, p);//画四周的边框线mShowpaint.setColor(0xFFFFCE43);mShowpaint.setStyle(Paint.Style.STROKE);c.drawRect(0,0,w,h,mShowpaint);return bm;}@Overrideprotected void onDraw(Canvas canvas) {Paint paint = new Paint();paint.setFilterBitmap(false);paint.setStyle(Paint.Style.FILL);//绘制SRC上层的矩形Bitmapcanvas.drawBitmap(mSrcBitmap, (mScreenW / 3 - mWidth) / 2, (mScreenH / 2 - nHeight) / 2, paint);//绘制DST下层的原型Bitmapcanvas.drawBitmap(mDstBitmap, (mScreenW / 3 - mWidth) / 2 + mScreenW / 3, (mScreenH / 2 - nHeight) / 2, paint);//创建一个图层,在图层上演示图形混合后的效果int sc = canvas.saveLayer(0, 0, mScreenW, mScreenH, null, Canvas.ALL_SAVE_FLAG);canvas.drawBitmap(mDstBitmap, (mScreenW / 3 - mWidth) / 2 + mScreenW / 3 * 2,(mScreenH / 2 - nHeight) / 2, paint);     //绘制i//设置Paint的Xfermodepaint.setXfermode(mPdXfermode);canvas.drawBitmap(mSrcBitmap, (mScreenW / 3 - mWidth) / 2 + mScreenW / 3 * 2,(mScreenH / 2 - nHeight) / 2, paint);paint.setXfermode(null);// 还原画布canvas.restoreToCount(sc);/*** 画图片的边框,便于理解*/// src lineint srcleft = (mScreenW / 3 - mWidth) / 2 + mScreenW / 3 * 2;int srctop = (mScreenH / 2 - nHeight) / 2;mShowpaint.setColor(0xFFFFCE43);canvas.drawRect(srcleft,srctop,srcleft + mWidth,srctop+ nHeight,mShowpaint);// des line,因为位置一样,加4减4,能看出效果mShowpaint.setColor(0xFF26AAD1);canvas.drawRect(srcleft + 4,srctop + 4,srcleft + mWidth - 4,srctop+ nHeight -4 ,mShowpaint);}
}

这篇关于关于 Xfermode 正确理解姿势的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040187

相关文章

HDU1720(输入输出涨姿势)

A+B Coming Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5953    Accepted Submission(s): 3901 题目链接: http://acm.hdu.edu.cn/showproblem.p

Hdfs FileSystem 使用姿势不对导致的内存泄露

文章目录 一、问题描述二、问题排查Java Heap Dump文件使用Jmap获取运行中的jvm内存在Jhat页面查找对应类实例具体的引用问题定位 三、解决方案四、总结 一、问题描述 有用户反馈访问httpfs服务偶尔出现502的情况,所以上httpfs服务器看了下,发现有一台因为OOM挂掉了(运维告警没弄好,所以没及时通知到)。 目前有两台HttpFs,通过nginx转发,

Hive源码本地IDEA调试的正确姿势

Hive源码本地IDEA调试的正确姿势 背景环境准备初始化配置修改配置初始化元数据库编译代码 启动HiveMetaStore启动Hive sql客户端Client Driver模式HiveServer2模式启动HiveServer2启动beeline客户端本地启动远程启动 总结 背景 Hive作为最最基础的大数据框架,可以说,没装Hive,就等于没有大数据这回事。Hive的

让Activity更加简洁第二篇---AsyncTask的使用姿势

如果你点开的这篇文章,那么 AsyncTask 的基本用法肯定是掌握了的。这篇文章不是分析 AsyncTask的内部原理,而是侧重于如何使用,让我们视图层中的Activity看起来更舒适。本文的项目地址请移步:https://github.com/herojing/JokeTask 下面结合项目谈谈自己的使用心得。 一、使用后效果如何?        老规矩,DEMO 实现的是

使用 RestTemplate 发送http请求的正确姿势原来是这样的!

本文要介绍的这个工具类,是基于RestTemplate做了一层代码封装!!非常好用哦! 第一步添加httpclient依赖包 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.6</version></dependency>

【华为】轻松get!eNSP登录无线AC Web界面的新姿势

【华为】轻松get!eNSP登录无线AC Web界面的新姿势 无线AC:web界面实验准备华为云配置01 拉取设备02添加UDP端口03再添加VMnet1(VMnet8 也行)网段连接AC的端口04最后设置端口映射 无线AC配置01拉取AC设备和连接华为云02配置AC的g0/0/1端口(SVI接口)03开启AC的HTTP功能 登入AC Web界面 无线AC:web界面 在真实项目

App推广新姿势:Xinstall地推码,一键直达用户心!

Xinstall地推码:开启App推广新篇章 在移动互联网时代,App推广的重要性不言而喻。然而,传统的推广方式往往伴随着繁琐的操作和难以精准统计的数据,让推广者头疼不已。幸运的是,Xinstall作为国内专业的App全渠道统计服务商,以其独特的地推码技术,为App推广带来了革命性的变化。 一、地推码的诞生:解决推广痛点 地推,作为App推广的一种重要手段,一直以其直接、高效的特点受到推广者

解锁App推广新姿势,Xinstall带你玩转投放查看

在移动互联网时代,App推广和运营成为了各大企业和开发者关注的焦点。然而,在这个过程中,推广者常常面临一些痛点,比如无法实时查看投放效果、数据不透明、难以精准定位目标用户等。这些问题不仅影响了推广效果,还可能导致资源的浪费。今天,我们就来聊聊如何通过Xinstall这一利器,解决这些痛点,提升App推广和运营的效率。 一、实时投放查看,让数据更透明 在App推广过程中,实时查看投放数据是至关

Spark性能调优之道——解决Spark数据倾斜(Data Skew)的N种姿势

原文:http://www.infoq.com/cn/articles/the-road-of-spark-performance-tuning?utm_campaign=rightbar_v2&utm_source=infoq&utm_medium=articles_link&utm_content=link_text 为何要处理数据倾斜(Data Skew) 什么是数据倾斜 对Spark/

秋季喝水的正确姿势,快来get√!

处暑已过,暑气渐渐消退,昼夜温差逐渐增大,凉爽的秋天就要来了。 俗话说秋高气爽,形容秋天是一个干爽舒适的季节。但干爽背后还隐藏着一个大问题——干燥。 秋天空气中的湿度降低,不仅会让人感到皮肤干燥、口干舌燥,还可能导致身体脱水,影响健康。干燥的环境容易引发呼吸道疾病,如咳嗽、哮喘等。 对抗外部干燥,可以使用加湿器来增加室内湿度。在室内摆放一些植物,也能有效提高空气湿度,同时还能净化