• PorterDuff.Mode


    有的时候我们做UI上的效果不可避免用到PorterDuff.Mode,官方给出的解释是定义了源图和目标图的合成结果,我们可以理解为两个图片的不同叠加所组成的效果,根据我们日常设计的需求通过算法给出了不同的模式


    官方给出了18中模式

    首先来个所有模式的总图。

    各个模式的图形就是以上方的方形作为源图形,圆形作为目标图形,按照一定的算法绘制的图形。(两个大的方块图叠加)

    接下来解析每个模式

    1.ADD


    将源图像素添加到目标图像素,使结果图形饱和。

    2.CLEAR


    (Destination pixels covered by the source are cleared to 0. )可以理解为清除像素

    3.DARKEN


    (Retains the smallest component of the source and destination pixels. )深色覆盖浅色,深浅相同则混合

    4.DST


    只绘制目标图像素。

    5.DST_ATOP


    舍弃掉没有被源图形覆盖的目标图形的像素

    6.DST_IN


    保留两图相交时目标图形的像素

    7.DST_OUT


    绘制没有被源图像素覆盖的目标图形像素

    8.DST_OVER


    源图形像素被绘制在目标图形下面

    9.LIGHTEN


    Retains the largest component of the source and destination pixel.

    10.MULTIPLY


    混合源图和目标图像素

    11.OVERLAY


    (Multiplies or screens the source and destination depending on the destination color.)颜色叠加

    12.SCREEN


    两图像素都绘制,两图相交处变为透明色

    13.SRC


    源图像素替换目标图像素

    14.SRC_ATOP


    舍弃掉没有覆盖目标图的源图像素

    15.SRC_IN


    保留两图相交处,并用源图像素覆盖目标图像素

    16.SRC_OUT


    保留没有覆盖目标图的源图像素

    17.SRC_OVER


    源图像素和目标图像素都绘制,源图像素置于上方

    18.XOR


    舍弃掉两图相交部分像素

    官方demo

    public class Xfermodes extends GraphicsActivity {
        // create a bitmap with a circle, used for the "dst" image
        static Bitmap makeDst(int w, int h) {
            Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            Canvas c = new Canvas(bm);
            Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
            p.setColor(0xFFFFCC44);
            c.drawOval(new RectF(0, 0, w*3/4, h*3/4), p);
            return bm;
        }
        // create a bitmap with a rect, used for the "src" image
        static Bitmap makeSrc(int w, int h) {
            Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            Canvas c = new Canvas(bm);
            Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
            p.setColor(0xFF66AAFF);
            c.drawRect(w/3, h/3, w*19/20, h*19/20, p);
            return bm;
        }
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new SampleView(this));
        }
        private static class SampleView extends View {
            private static final int W = 64;
            private static final int H = 64;
            private static final int ROW_MAX = 4;   // number of samples per row
            private Bitmap mSrcB;
            private Bitmap mDstB;
            private Shader mBG;     // background checker-board pattern
            private static final Xfermode[] sModes = {
                new PorterDuffXfermode(PorterDuff.Mode.CLEAR),
                new PorterDuffXfermode(PorterDuff.Mode.SRC),
                new PorterDuffXfermode(PorterDuff.Mode.DST),
                new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),
                new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),
                new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),
                new PorterDuffXfermode(PorterDuff.Mode.DST_IN),
                new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),
                new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),
                new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),
                new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),
                new PorterDuffXfermode(PorterDuff.Mode.XOR),
                new PorterDuffXfermode(PorterDuff.Mode.DARKEN),
                new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),
                new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),
                new PorterDuffXfermode(PorterDuff.Mode.SCREEN)
            };
            private static final String[] sLabels = {
                "Clear", "Src", "Dst", "SrcOver",
                "DstOver", "SrcIn", "DstIn", "SrcOut",
                "DstOut", "SrcATop", "DstATop", "Xor",
                "Darken", "Lighten", "Multiply", "Screen"
            };
            public SampleView(Context context) {
                super(context);
                mSrcB = makeSrc(W, H);
                mDstB = makeDst(W, H);
                // 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);
            }
            @Override protected void onDraw(Canvas canvas) {
                canvas.drawColor(Color.WHITE);
                Paint labelP = new Paint(Paint.ANTI_ALIAS_FLAG);
                labelP.setTextAlign(Paint.Align.CENTER);
                Paint paint = new Paint();
                paint.setFilterBitmap(false);
                canvas.translate(15, 35);
                int x = 0;
                int y = 0;
                for (int i = 0; i < sModes.length; i++) {
                    // draw the border
                    paint.setStyle(Paint.Style.STROKE);
                    paint.setShader(null);
                    canvas.drawRect(x - 0.5f, y - 0.5f,
                                    x + W + 0.5f, y + H + 0.5f, paint);
                    // draw the checker-board pattern
                    paint.setStyle(Paint.Style.FILL);
                    paint.setShader(mBG);
                    canvas.drawRect(x, y, x + W, y + H, paint);
                    // draw the src/dst example into our offscreen bitmap
                    int sc = canvas.saveLayer(x, y, x + W, y + H, null);
                    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);
                    // draw the label
                    canvas.drawText(sLabels[i],
                                    x + W/2, y - labelP.getTextSize()/2, labelP);
                    x += W + 10;
                    // wrap around when we've drawn enough for one row
                    if ((i % ROW_MAX) == ROW_MAX - 1) {
                        x = 0;
                        y += H + 30;
                    }
                }
            }
        }
    }
    
  • 相关阅读:
    使用remove_constants工具查看Oracle是否使用绑定变量
    v$sqlarea,v$sql,v$sqltext这三个视图提供的sql语句有什么区别?
    Cardinality (基数)
    分区表操作
    递归连接查询
    解决Android应用安装快完毕时提示签名冲突,android签名文件生成(转)
    Oracle的Numer类型与C,C#数据类型对应关系
    Spring学习(四)——使用Spring JDBC访问数据库
    Spring学习(三)——集成 Velocity
    Spring学习(二)——使用Gradle构建一个简单的Spring MVC Web应用程序
  • 原文地址:https://www.cnblogs.com/dearnotes/p/13416139.html
Copyright © 2020-2023  润新知