赞
踩
Paint的setXfermode(Xfermode xfermode)方法设置的是两个图像重叠时候的混合显示模式
参数中Xfermode只有一个PorterDufferXfermode还一直使用,其他的都被废弃了!
该类有且只有一个含参的构造方法PorterDuffXfermode(PorterDuff.Mode mode),
这个参数PorterDuff.Mode就表示一种混合模式,而PorterDuffXfermode表示这种图形混合模式的显示.
这些模式显示用下面这张比较俗套的图可以展示:
在API中Android为我们提供了18种(比上图多了两种ADD和OVERLAY)模式;
需要说一下上图中的绘制顺序是:
所产生的混合效果,下面我们使用代码演示一下效果
先声明一下图层的融合要先保证背景是透明,不能有其他的颜色;所以最好要先使用saveLayer之后才会有效果
saveLayer方法相当于创建了一个透明的图层,在它上面进行图像的融合,正好可以!但必须是图层相同宽高的部分。
废话不多说,直接上代码了
- public class PorterDuffXfermodeView extends View {
-
- private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
- //定义图像间的混合显示模式
- //填入模式构建一个PorterDuffermode对象
- private final PorterDuffXfermode mXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER);
- private final Bitmap srcBitmap;//后画的Bitmap
- private final Bitmap dstBitmap;//先画的Bitmap
- private final int mScreenW;//屏幕宽度
-
- public PorterDuffXfermodeView(Context context, AttributeSet attrs) {
- super(context, attrs);
- //计算屏幕宽高
- WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
- DisplayMetrics outMetrics = new DisplayMetrics();
- wm.getDefaultDisplay().getMetrics(outMetrics);
- mScreenW = outMetrics.widthPixels;
-
- dstBitmap = makeDst(mScreenW / 3.0f, mScreenW / 3.0f);//屏幕的宽度三等分
- srcBitmap = makeSrc(mScreenW / 3.0f, mScreenW / 3.0f);
- }
-
- //先绘制一个黄色圆形
- private Bitmap makeDst(float w, float h) {
- Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
- p.setColor(0xFFFECF41);//黄色
- Bitmap bm = Bitmap.createBitmap((int) w, (int) h, Bitmap.Config.ARGB_8888);
- Canvas dstCanvas = new Canvas(bm);
- dstCanvas.drawCircle(w / 2, h / 2, w / 5, p);
- return bm;
- }
-
- //后绘制一个蓝色矩形
- private Bitmap makeSrc(float w, float h) {
- Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
- p.setColor(0xFF63A9FE);//蓝色
- Bitmap bm = Bitmap.createBitmap((int) w, (int) h, Bitmap.Config.ARGB_8888);
- Canvas srcCanvas = new Canvas(bm);
- srcCanvas.drawRect(w / 2, h / 2, w * 4 / 5, h * 4 / 5, p);
- return bm;
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- //显示各组画一个圆形和矩形
- canvas.drawBitmap(dstBitmap, 0, 0, paint); // 先画的图形 DST
- canvas.drawBitmap(srcBitmap, mScreenW / 3.0f, 0, paint);// 后画的图形 SRC
-
- //在另一个图层上演示DST和SRC图形混合后的效果
- int sc = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);
- canvas.drawBitmap(dstBitmap, mScreenW * 2 / 3.0f, 0, paint);//先绘制圆形
- paint.setXfermode(mXfermode); //设置Xfermode混合模式
- canvas.drawBitmap(srcBitmap, mScreenW * 2 / 3.0f, 0, paint);//再绘制矩形
- // 还原画布
- canvas.restoreToCount(sc);
- }
-
- }
我们改变代码中的PorterDuff.Mode变量验证所有的混合模式,
上面代码解释:
运行之后的效果图(按照那张模式图来展示):
以上结果在华为和小米两台手机上分别验证,大部分模式都是和效果图一样的;
上面红色字体在小米手机上显示是有问题,出不来那个效果,俺也不知道怎么回事!!!华为手机都没有问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。