一、概述Xfermode全名transfer-mode,其作用是实现两张图叠加时的混合效果。网上流传的关于Xfermode最出名的图来源于AndroidSDK的samples中,名叫Xfermodes.java,效果如下: [转载请保留本文地址:http://www.c ...
一、概述
Xfermode全名transfer-mode,其作用是实现两张图叠加时的混合效果。
网上流传的关于Xfermode最出名的图来源于AndroidSDK的samples中,名叫Xfermodes.java,效果如下:
[转载请保留本文地址:http://www.cnblogs.com/goagent/p/5326438.html]
二、体验
提炼出Xfermodes.java中的核心代码,自己写了个简单粗暴的demo试试水:
1 public class ImageViewXfermode extends ImageView { 2 public ImageViewXfermode(Context context) { 3 super(context); 4 init(); 5 } 6 7 public ImageViewXfermode(Context context, AttributeSet attrs) { 8 super(context, attrs); 9 init();10 }11 12 public ImageViewXfermode(Context context, AttributeSet attrs, int defStyle) {13 super(context, attrs, defStyle);14 init();15 }16 17 private void init() {18 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {19 setLayerType(View.LAYER_TYPE_SOFTWARE, null);20 }21 }22 23 @Override24 protected void onDraw(Canvas canvas) {25 int defaultWidth = dip2px(85); //26 int defaultdHeight = dip2px(85); //27 28 if (canvas.getHeight() == defaultWidth && canvas.getHeight() == defaultdHeight) {29 //拿到黄色圆形的bitmap30 Bitmap bitcircle = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);31 Canvas canvascicle = new Canvas(bitcircle);32 Paint paintcicle = new Paint(Paint.ANTI_ALIAS_FLAG);33 paintcicle.setColor(0xFFFFCC44);34 canvascicle.drawCircle(dip2px(30), dip2px(30), dip2px(25), paintcicle);35 36 //拿到蓝色矩形的bitmap37 Bitmap bitrect = Bitmap.createBitmap(defaultWidth, defaultdHeight, Config.ARGB_8888);38 Canvas canvasrect = new Canvas(bitrect);39 Paint paintrect = new Paint(Paint.ANTI_ALIAS_FLAG);40 paintrect.setColor(0xFF66AAFF);41 canvasrect.drawRect(dip2px(30), dip2px(30), dip2px(80), dip2px(80), paintrect);42 43 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);44 Xfermode xfermode = new PorterDuffXfermode(Mode.LIGHTEN);45 46 //采用saveLayer,让后续canvas的绘制在自动创建的bitmap上47 int cnt = canvas.saveLayer(0, 0, defaultWidth, defaultdHeight, null, Canvas.ALL_SAVE_FLAG);48 //先画圆形,圆形是dest49 canvas.drawBitmap(bitcircle, 0, 0, paint);50 paint.setXfermode(xfermode);51 //后画矩形,矩形是src52 canvas.drawBitmap(bitrect, 0, 0, paint);53 paint.setXfermode(null);54 canvas.restoreToCount(cnt);55 } else {56 super.onDraw(canvas);57 }58 }59 60 private int dip2px(float dip) {61 float scale = getResources().getDisplayMetrics().density;62 return (int)(dip * scale + 0.5f);63 }64 }
原标题:Android Xfermode 学习笔记
关键词:Android
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。