graphic Xfermode

    技术2025-04-18  14

    1. Xfermode可以通过修改Paint的Xfermode来影响在Canvas已有的图像上面绘制新的颜色的方式 。在正常的情况下,在已有的图像上绘图将会在其上面添加一层新的形状。如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint;如果它是部分透明的,那么它将会被染上下面的颜色。下面的Xfermode子类可以改变这种行为:AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素XOR操作。PorterDuffXfermode  这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。要应用转换模式,可以使用setXferMode方法,如下所示:

    AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID); borderPen.setXfermode(avoid);

    2. 16条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

     

    3.

    // make a ckeckerboard pattern Bitmap bm = Bitmap.createBitmap(new int[] { 0xFFFFFFFF, 0xFFCCCCCC, 0xFFCCCCCC, 0xFFFFFFFF }, 2, 2, Bitmap.Config.RGB_565); mBG = new BitmapShader(bm, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); Matrix m = new Matrix(); m.setScale(6, 6); mBG.setLocalMatrix(m);

     

     

    4.

    // draw the src/dst example into our offscreen bitmap int sc = canvas.saveLayer(x, y, x + W, y + H, null, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG); canvas.translate(x, y); canvas.drawBitmap(mDstB, 0, 0, paint); paint.setXfermode(sModes[i]); canvas.drawBitmap(mSrcB, 0, 0, paint); paint.setXfermode(null); canvas.restoreToCount(sc);

     

    最新回复(0)