Paint设置Xfermode绘制混合图层

Xfermode有3个子类,我们主要用PorterDuffXfermode这个类,他只有一个构造方法

   public PorterDuffXfermode(PorterDuff.Mode mode) {
        porterDuffMode = mode.nativeInt;
    }

PorterDuff.Mode是一个enum类,里面有多种模式,可以让我们实现不同的效果,其中每个mode都是由Sa,Sc,Da,Dc四个决定的。

    Sa:全称为Source alpha,表示源图的Alpha通道;
    Sc:全称为Source color,表示源图的颜色;
    Da:全称为Destination alpha,表示目标图的Alpha通道;
    Dc:全称为Destination color,表示目标图的颜色.

每种模式代表什么样的效果,下面看看一张图就大概明白了,这个图片来自这篇文章
http://ssp.impulsetrain.com/porterduff.html

一图解千言:
PorterDuff.Mode.png

下面看看基本用法:

    private void initXfermode() {
        // 初始化
        mXfermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 存为新图层
        int saveLayerCount = canvas.saveLayer(0, 0, mTotalWidth, mTotalHeight, mBitPaint,
                Canvas.ALL_SAVE_FLAG)
        // 绘制源图形
        canvas.drawRect(mSourceRect, mPaint);
        // 设置混合模式
        mPaint.setXfermode(mXfermode);
        // 绘制目标图
        canvas.drawRect(mDesRect, mPaint);
        // 清除混合模式
        mPaint.setXfermode(null);
        // 恢复保存的图层;
        canvas.restoreToCount(saveLayerCount);

    }

最后提一下硬件加速:
Api14之后默认开启了硬件加速,硬件加速使用DisplayList来帮助渲染,不需要每次重绘都执行大量的代码。硬件加速使用OpenGL,会占用更多内存,并且增加耗电量,同时还有一些api是不支持硬件加速的,官方也提供了4个级别给开发者控制硬件加速,不支持的api和4个级别的控制,见官方文档,写的很详细
https://developer.android.com/guide/topics/graphics/hardware-accel.html

你可能感兴趣的:(Paint设置Xfermode绘制混合图层)