Xfermode


Xfermode有三个子类:

AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。

PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素异或操作。

PorterDuffXfermode  这是一个非常强大的转换模式,使用它,

可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。


设置方式如下:

 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
canvas.drawBitmap(result,100,100,paint);


我们准备了两张图:

        

代码有点问题,因为下层图的非交集部分总是显示出来,知道原因的大神请告知,谢谢。

 public MissingView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        Log.e("mag","1");
        init();
    }

    public boolean init(){
        result = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.m);
        Bitmap a = BitmapFactory.decodeResource(getResources(),R.drawable.mm);
        Canvas canvas = new Canvas(result);
        canvas.drawBitmap(a,50,50,paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));
        canvas.drawBitmap(bitmap,100,100,paint);
        return  true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int w = getWidth();
        int h = getHeight();
        Log.e("w:",""+ w);
        Log.e("h:","" + h);
        // Bitmap bitmap = decodeBitmapFromResource(Math.min(w,h));
        paint.setXfermode(null);
        canvas.drawBitmap(result,0,0,paint);
    }



下面依次改变绘制图片mm时的paint的PorterDuffXfermode

PorterDuffXfermode的十六条Porter-Duff有:

1.PorterDuff.Mode.CLEAR 所绘制不会提交到画布上


2.PorterDuff.Mode.SRC( 显示上层绘制图片)


3.PorterDuff.Mode.DST(显示下层绘制图片)


4.PorterDuff.Mode.SRC_OVER( 正常绘制显示,上下层绘制叠盖)


5..PorterDuff.Mode.DST_OVER( 上下层都显示。下层居上显示)


6.PorterDuff.Mode.SRC_IN(取两层绘制交集。显示上层)


7.PorterDuff.Mode.DST_IN(取两层绘制交集。显示下层)


8.PorterDuff.Mode.SRC_OUT( 取上层绘制非交集部分)


9.PorterDuff.Mode.DST_OUT(取下层绘制非交集部分)


10.PorterDuff.Mode.SRC_ATOP(取下层非交集部分与上层交集部分)


11.PorterDuff.Mode.DST_ATOP( 取上层非交集部分与下层交集部分)


12.PorterDuff.Mode.XOR(  异或:去除两图层交集部分)


13.PorterDuff.Mode.DARKEN(取两图层全部区域,交集部分颜色加深)


14.PorterDuff.Mode.LIGHTEN(取两图层全部,点亮交集部分颜色)


15.PorterDuff.Mode.MULTIPLY(  取两图层交集部分叠加后颜色)


16.PorterDuff.Mode.SCREEN( 取两图层全部区域,交集部分变为透明色)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章