当前位置:   article > 正文

Paint之setXfermode(图形混合模式)_paint.setxfermode

paint.setxfermode

PorterDuff.Mode表示混合模式,枚举值有18个,表示各种图形混合模式,有:


//DST相关模式
Mode.DST  
Mode.DST_OVER  
Mode.DST_IN  
Mode.DST_OUT  
Mode.DST_ATOP  

//SRC相关模式
Mode.SRC  
Mode.SRC_OVER  
Mode.SRC_IN  
Mode.SRC_OUT  
Mode.SRC_ATOP  

//颜色叠加相关模式
Mode.DARKEN  (变暗)
Mode.LIGHTEN  (变亮)
Mode.MULTIPLY  (正片叠底)
Mode.SCREEN  (滤色)
Mode.OVERLAY  (叠加)
Mode.ADD (饱和度相加)

//其它模式
Mode.CLEAR  
Mode.XOR  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

上面每一个模式都对应着一个算法:

效果:

背景红色:

这里写图片描述

背景白色:

这里写图片描述

测试:

MyActivityI

public class MyActivityI extends AppCompatActivity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);

        //黄色圆形:dst    蓝色矩形:src
        ((PorterDuffView) this.findViewById(R.id.view11)).setMode(PorterDuff.Mode.CLEAR);
        ((PorterDuffView) this.findViewById(R.id.view12)).setMode(PorterDuff.Mode.ADD);

        ((PorterDuffView) this.findViewById(R.id.view21)).setMode(PorterDuff.Mode.SRC);
        ((PorterDuffView) this.findViewById(R.id.view22)).setMode(PorterDuff.Mode.DST);

        ((PorterDuffView) this.findViewById(R.id.view31)).setMode(PorterDuff.Mode.SRC_OVER);
        ((PorterDuffView) this.findViewById(R.id.view32)).setMode(PorterDuff.Mode.DST_OVER);

        ((PorterDuffView) this.findViewById(R.id.view41)).setMode(PorterDuff.Mode.SRC_IN);
        ((PorterDuffView) this.findViewById(R.id.view42)).setMode(PorterDuff.Mode.DST_IN);

        ((PorterDuffView) this.findViewById(R.id.view51)).setMode(PorterDuff.Mode.SRC_OUT);
        ((PorterDuffView) this.findViewById(R.id.view52)).setMode(PorterDuff.Mode.DST_OUT);

        ((PorterDuffView) this.findViewById(R.id.view61)).setMode(PorterDuff.Mode.SRC_ATOP);
        ((PorterDuffView) this.findViewById(R.id.view62)).setMode(PorterDuff.Mode.DST_ATOP);

        ((PorterDuffView) this.findViewById(R.id.view71)).setMode(PorterDuff.Mode.XOR);
        ((PorterDuffView) this.findViewById(R.id.view72)).setMode(PorterDuff.Mode.OVERLAY);

        ((PorterDuffView) this.findViewById(R.id.view81)).setMode(PorterDuff.Mode.DARKEN);
        ((PorterDuffView) this.findViewById(R.id.view82)).setMode(PorterDuff.Mode.LIGHTEN);

        ((PorterDuffView) this.findViewById(R.id.view91)).setMode(PorterDuff.Mode.MULTIPLY);
        ((PorterDuffView) this.findViewById(R.id.view92)).setMode(PorterDuff.Mode.SCREEN);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

manifest中关闭硬件加速

android:hardwareAccelerated=”false”

 <activity
            android:name=".MyActivityI"
            android:hardwareAccelerated="false">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

定义PorterDuffView


/**
 * 1、关闭硬件加速
 * 2、使用图层(离屏绘制)
 */

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class PorterDuffView extends View {

    private int width = 100;
    private int height = 100;
    private Bitmap dstBmp;
    private Bitmap srcBmp;
    private Paint mPaint;

    public PorterDuffView(Context context, AttributeSet attrs) {
        super(context, attrs);
        dstBmp = makeDst(width, height);
        srcBmp = makeSrc(width, height);
        mPaint = new Paint();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);


        int layerID = canvas.saveLayer(0, 0, width * 2, height * 2, mPaint, Canvas.ALL_SAVE_FLAG);

        canvas.drawBitmap(dstBmp, 0, 0, mPaint);//目标:黄色圆形

        mPaint.setXfermode(new PorterDuffXfermode(mode));
        canvas.drawBitmap(srcBmp, width / 2, height / 2, mPaint);//源:蓝色矩形

        mPaint.setXfermode(null);

        canvas.restoreToCount(layerID);

    }

    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, h), p);
        return bm;
    }

    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(0, 0, w, h, p);
        return bm;
    }

    private PorterDuff.Mode mode = PorterDuff.Mode.CLEAR;

    public void setMode(PorterDuff.Mode mode) {
        this.mode = mode;
        invalidate();
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

布局

把背景设置粉红色

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff4081">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:layout_width="0dp"
                android:layout_height="20dp"
                android:layout_weight="1"
                android:text="CLEAR"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="ADD"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="SRC"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="DST"
                android:textSize="16sp" />
        </LinearLayout>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <com.android.imooc.PorterDuffView
                android:id="@+id/view11"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

            <com.android.imooc.PorterDuffView
                android:id="@+id/view12"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

            <com.android.imooc.PorterDuffView
                android:id="@+id/view21"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

            <com.android.imooc.PorterDuffView
                android:id="@+id/view22"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />
        </LinearLayout>

        <!--000000000000000000000000000000000000000000000000000000000000000-->

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:layout_width="0dp"
                android:layout_height="20dp"
                android:layout_weight="1"
                android:text="SRC_OVER"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="DST_OVER"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="SRC_IN"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="DST_IN"
                android:textSize="16sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <com.android.imooc.PorterDuffView
                android:id="@+id/view31"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

            <com.android.imooc.PorterDuffView
                android:id="@+id/view32"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />


            <com.android.imooc.PorterDuffView
                android:id="@+id/view41"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

            <com.android.imooc.PorterDuffView
                android:id="@+id/view42"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />
        </LinearLayout>

        <!--000000000000000000000000000000000000000000000000000-->

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:layout_width="0dp"
                android:layout_height="20dp"
                android:layout_weight="1"
                android:text="SRC_OUT"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="DST_OUT"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="SRC_ATOP"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="DST_ATOP"
                android:textSize="16sp" />
        </LinearLayout>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <com.android.imooc.PorterDuffView
                android:id="@+id/view51"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

            <com.android.imooc.PorterDuffView
                android:id="@+id/view52"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />


            <com.android.imooc.PorterDuffView
                android:id="@+id/view61"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

            <com.android.imooc.PorterDuffView
                android:id="@+id/view62"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

        </LinearLayout>

        <!--00000000000000000000000000000000000000000000000-->

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:layout_width="0dp"
                android:layout_height="20dp"
                android:layout_weight="1"
                android:text="XOR"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="OVERLAY"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="DARKEN"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="LIGHTEN"
                android:textSize="16sp" />
        </LinearLayout>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <com.android.imooc.PorterDuffView
                android:id="@+id/view71"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

            <com.android.imooc.PorterDuffView
                android:id="@+id/view72"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

            <com.android.imooc.PorterDuffView
                android:id="@+id/view81"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

            <com.android.imooc.PorterDuffView
                android:id="@+id/view82"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

        </LinearLayout>

        <!--00000000000000000000000000000000000000000000000000-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:layout_width="0dp"
                android:layout_height="20dp"
                android:layout_weight="1"
                android:text="MULTIPLY"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="SCREEN"
                android:textSize="16sp" />

        </LinearLayout>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <com.android.imooc.PorterDuffView
                android:id="@+id/view91"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />


            <com.android.imooc.PorterDuffView
                android:id="@+id/view92"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

        </LinearLayout>

    </LinearLayout>
</ScrollView>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/332669
推荐阅读
相关标签
  

闽ICP备14008679号