PorterDuffXfermode的理解
来源:互联网 发布:招商银行网络银行 编辑:程序博客网 时间:2024/05/16 21:30
这张图片大家不陌生吧,网络上解释也一大堆,都是不经大脑的疯传。
public Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
Bitmap sbmp;
// 比较初始Bitmap宽高和给定的圆形直径,判断是否需要缩放裁剪Bitmap对象
if (bmp.getWidth() != radius || bmp.getHeight() != radius)
sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false);
else
sbmp = bmp;
Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(),
Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight());
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.parseColor("#BAB399"));
canvas.drawCircle(sbmp.getWidth() / 2 + 0.7f,
sbmp.getHeight() / 2 + 0.7f, sbmp.getWidth() / 2 + 0.1f, paint);
// 核心部分,设置两张图片的相交模式,在这里就是上面绘制的Circle和下面绘制的Bitmap
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(sbmp, rect, rect, paint);
return output;
}
根据解释SRC_IN是 取两层绘制交集。显示上层。所以最终得到的是一个圆形图片。好,这个解释可以通过
那我们换一下代码,
canvas.drawBitmap(sbmp, rect, rect, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
canvas.drawCircle(sbmp.getWidth() / 2 + 0.7f,
sbmp.getHeight() / 2 + 0.7f, sbmp.getWidth() / 2 + 0.1f, paint);
根据解释说DST_IN是取两层绘制交集,显示下层。但是最后显示的却不是一张圆形图片,这个是为什么呢?
因为非drawBitmap都是直接在构造在Canvas的Bitmap区域内,并没有两层效果,所以第2种写法,最后显示的还是一张图片。第一种虽然没有两层,但是Canvas的构造区域就是一个圆形,因为是先画圆,我个人理解是这样的,期待大神有更好的解释。
http://e.hiphotos.baidu.com/zhidao/pic/item/c995d143ad4bd1133f5619e35cafa40f4afb0543.jpg?qq-pf-to=pcqq.c2c
- PorterDuffXfermode的理解
- Android 理解PorterDuffXfermode叠加模式
- PorterDuffXfermode的用法
- PorterDuffXfermode的用法
- PorterDuffXfermode的用法
- PorterDuffXfermode的用法
- PorterDuffXfermode的用法
- PorterDuffXfermode的用法
- PorterDuffXfermode的初级使用
- PorterDuffXfermode的用法
- PorterDuffXfermode的用法
- PorterDuffXfermode的用法
- 关于PorterDuffXfermode的学习
- PorterDuffXferMode的几个坑
- PorterDuffXfermode
- PorterDuffXfermode
- PorterDuffXfermode
- PorterDuffXferMode不正确的真正原因PorterDuffXferMode深入试验)
- Python Paramiko模块安装和使用
- php反射机制
- Rails的事务和锁
- java注释规范
- 那些Android中的性能优化
- PorterDuffXfermode的理解
- 数据挖掘,并不是想象的那么神秘!
- 在Android Sudio中使用Uiautomator
- php缓存技术总结
- Retrofit 2.0的改进以及使用
- 微信支付app支付服务器端(Java)
- ibatis 模糊查询和多条件查询
- 环形ProgressBar特效
- Android--从零单排系列(8)--service的使用和利用service进行数据的传递