zoukankan      html  css  js  c++  java
  • 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;
                    }
                }
            }
        }
    }
    
  • 相关阅读:
    设计模式:面向对象设计的六大原则 (绝对详细)
    idea创建maven项目速度慢?别急,这有三种方案
    Spring Cloud开发人员如何解决服务冲突和实例乱窜?
    Spring Cloud Zuul的动态路由怎样做?集成Nacos实现很简单
    Spring Boot自定义配置实现IDE自动提示
    阿里注册中心Nacos生产部署方案
    日志排查问题困难?分布式日志链路跟踪来帮你
    zuul集成Sentinel最新的网关流控组件
    YAML中多行字符串的配置方法
    JetBrains 第二轮:再为免费全家桶续命三个月
  • 原文地址:https://www.cnblogs.com/dearnotes/p/13416139.html
Copyright © 2011-2022 走看看