正確的快速的理解PorterDuff.Mode保證你不記混淆 有注釋

首先官方給的圖中,src是頂層 ,dsc是底層,我總是混淆,哎,畢竟英文嘛,如果名字就叫top 我就能不記憶混淆了。

那么下面是直接創(chuàng)建畫(huà)布的用法,我?guī)缀跽也坏街苯觿?chuàng)建畫(huà)布的實(shí)際上都差不多,不過(guò)我調(diào)試了好久啊


    /*
  顯示相交部分的上層
   */

    /**
     * @param dstBitmap 黃色 底層
     * @param srcBitmap 藍(lán)色 上層
     * @param context
     * @return
     */
    public static Bitmap getPorterDuffBitmap(Bitmap dstBitmap, Bitmap srcBitmap, int position, Context context) {
        Paint paint = new Paint();
        Bitmap bgBitmap = Bitmap.createBitmap(dstBitmap.getWidth(), dstBitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bgBitmap);

        canvas.drawColor(Color.TRANSPARENT);//
        RectF srcRectF = new RectF(0, 0, dstBitmap.getWidth(), dstBitmap.getHeight());
        int saveCount = 0;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
//            saveCount = canvas.saveLayerAlpha(srcRectF, 255);
            saveCount = canvas.saveLayer(srcRectF, paint);
//            saveCount = canvas.saveLayer(0, 0,500, 500, paint);
        } else {

            saveCount = canvas.saveLayer(srcRectF, paint, Canvas.ALL_SAVE_FLAG);
        }
        PorterDuff.Mode mode = intToMode(position);//相交的部分取第二層的

//        PorterDuff.Mode mode = PorterDuff.Mode.DST_IN;//相交的部分取第二層的
        RectF dstRect = new RectF(0, 0, dstBitmap.getWidth(), dstBitmap.getHeight());
        canvas.drawBitmap(dstBitmap, null, dstRect, paint);
        paint.setXfermode(new PorterDuffXfermode(mode));
        canvas.drawBitmap(srcBitmap, null, srcRectF, paint);
        paint.setXfermode(null);
        canvas.restoreToCount(saveCount);

        return bgBitmap;

    }


    public static final PorterDuff.Mode intToMode(int position) {
        switch (position) {
            default:
            case 0:
                return PorterDuff.Mode.CLEAR;//啥都沒(méi)有
            case 1:
                return PorterDuff.Mode.SRC;//只顯示頂層
            case 2:
                return PorterDuff.Mode.DST;//只顯示底層
            case 3:
                return PorterDuff.Mode.SRC_OVER;//顯示底層和頂層 但是相交部分則顯示頂層區(qū)域
            case 4://顯示底層和頂層但是相交部分是顯示 底層 區(qū)域
                return PorterDuff.Mode.DST_OVER;
            case 5://相交部分顯示頂層view src
                return PorterDuff.Mode.SRC_IN;
            case 6://相交部分顯示底層view,
                return PorterDuff.Mode.DST_IN;
            case 7://顯示不相交部分的頂層
                return PorterDuff.Mode.SRC_OUT;
            case 8://顯示不相交的地方的底層
                return PorterDuff.Mode.DST_OUT;
            case 9://顯示底層和相交部分的頂層
                return PorterDuff.Mode.SRC_ATOP;
            case 10://顯示相交部分的底層和不相交部分的頂層
                return PorterDuff.Mode.DST_ATOP;
            case 11://顯示底層和頂層 但是不包含相交部分
                return PorterDuff.Mode.XOR;
            case 16://顯示不相交的頂層和底層 ,相交的部分類似遮蓋變暗效果
                return PorterDuff.Mode.DARKEN;
            case 17://顯示不相交的頂層和底層,相交部分則變量
                return PorterDuff.Mode.LIGHTEN;
            case 13://只顯示相交部分而且是疊加效果
                return PorterDuff.Mode.MULTIPLY;
            case 14://顯示不相交的頂層和底層 ,相交的部分類似 看不出啥名堂
                return PorterDuff.Mode.SCREEN;
            case 12:
                return PorterDuff.Mode.ADD;
            case 15:
                return PorterDuff.Mode.OVERLAY;
        }
    }

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final ImageView iv = (ImageView) findViewById(R.id.image);
        final Bitmap dstBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.logo_b);//dsc底層,src頂層。
        final Bitmap srcBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.imggirl);
/*        srcBitmap.setBounds(0, 0, (int) (1 * dWidth),
                (int) (scale * dHeight));*/


        Log.w(TAG, "WIDTH:" + dstBitmap.getWidth() + ",height:" + srcBitmap.getHeight());
        iv.setImageBitmap(getPorterDuffBitmap(dstBitmap, srcBitmap, currentPosition, this));

        iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                currentPosition++;
                if (currentPosition > 15) {
                    currentPosition = 0;
                }
                Bitmap porterDuffBitmap = getPorterDuffBitmap(dstBitmap, srcBitmap, currentPosition, MainActivity.this);
                iv.setImageBitmap(porterDuffBitmap);
                Toast.makeText(MainActivity.this, "current porterDuff mode:" + intToMode(currentPosition), Toast.LENGTH_SHORT).show();

            }
        });

    }

直接自定義view的畫(huà)布顯示方法

public class BuYaoLogo extends View {
    public BuYaoLogo(Context context) {
        super(context);
    }

    public BuYaoLogo(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public BuYaoLogo(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
        canvas.drawColor(Color.RED);//
        Bitmap dstBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.logo_b);
        Bitmap srcBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.imggirl111);
        RectF srcRectF = new RectF(0, 0, dstBitmap.getWidth(), dstBitmap.getHeight());
        int saveCount = 0;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
//            saveCount = canvas.saveLayerAlpha(srcRectF, 255);
            saveCount = canvas.saveLayer(srcRectF, paint);
//            saveCount = canvas.saveLayer(0, 0,500, 500, paint);
        } else {

            saveCount = canvas.saveLayer(srcRectF, paint, Canvas.ALL_SAVE_FLAG);
        }
        PorterDuff.Mode mode = PorterDuff.Mode.MULTIPLY;//相交的部分取第二層的
//        PorterDuff.Mode mode = PorterDuff.Mode.DST_IN;//相交的部分取第二層的
        RectF dstRect = new RectF(0, 0, dstBitmap.getWidth(), dstBitmap.getHeight());
        canvas.drawBitmap(dstBitmap, null, dstRect, paint);
        paint.setXfermode(new PorterDuffXfermode(mode));
        canvas.drawBitmap(srcBitmap, null, srcRectF, paint);
        paint.setXfermode(null);
        canvas.restoreToCount(saveCount);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容