本节导言:

不知道标题这两个玩意你熟不熟悉啦,假如自己完结过圆角或许圆形图片,信任对这两个名词 并不形式,一时半伙没想起来?不要紧,下面这个图你可曾见过?

PS:网上都说在:\samples\android-XX\legacy\ApiDemos\src\com\example\android\apis\graphics 下能找到这个图片- -,可是并没有,不知道是不是由于我的sample是android-22的,只在这儿找到一个 Xfermodes.java的Java文件!这儿直接贴下网上找到的~

嗯,说回来,这图信任大部分朋友都见过吧,没见过也不要紧,本节咱们带咱们来一点点的学习 这个东西~,看回咱们前面的Android根底入门教程——8.3.1 三个绘图东西类详解

setXfermode(Xfermode xfermode):设置图形堆叠时的处理方法,如兼并,取交集或并集, 常常用来制造橡皮的擦除作用!

咱们来到官方文档:,咱们发现他有三个儿子:

本节咱们来学习他的前两个儿子~


大儿子:AvoidXfermode

嗯,和前面学的MaskFilter的两个子类相同,不支持硬件加速,所以假如是API 14以上的版别, 需求封闭硬件加速才会有作用!怎样关自己看上一节哈~

咱们来看看他给咱们供给的结构办法!官方API文档:

参数有三个,依次是:

opColor:一个十六进制的带通明度的颜色值,比方0x00C4C4;

tolerance:容差值,假如你学过PS或许用过魔棒东西,便是设置选取颜色值的规模,比方 容差为0,你选的是纯黑的小点,当容差调为40的时分,规模现已扩大到大块黑色这样!假如 还不是很理解,等下咱们写写代码就知道了!

mode:AvoidXfermode形式,有两种:TARGETAVOID


形式1:AvoidXfermode.Mode.TARGET

该形式会判别画布上是否有与咱们设置颜色值不相同的颜色,假如有的话,会把这些区域 染上一层画笔界说的颜色,其他当地不染色!下面咱们写代码演示下,趁便让咱们感觉下 这个容差值!

运用代码示例

运转作用图

嗯,先上下原图,资料来自gank.io

接下来咱们随便把墙上某个当地的颜色用颜色取色器取下,然后写一个简略的View!

PS:需求在AndroidManifest.xml中的appliction节点增加封闭硬件加速: android:hardwareAccelerated="false"

/**
 * Created by Jay on 2015/10/22 0022.
 */
public class AvoidXfermodeView1 extends View {

    private Paint mPaint;
    private Bitmap mBitmap;
    private AvoidXfermode avoidXfermode;

    public AvoidXfermodeView1(Context context) {
        super(context);
        init();
    }

    public AvoidXfermodeView1(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public AvoidXfermodeView1(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  //抗锯齿
        avoidXfermode = new AvoidXfermode(0XFFCCD1D4, 0, AvoidXfermode.Mode.TARGET);
        mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.iv_meizi);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBitmap, 50, 50, mPaint);
        mPaint.setARGB(255, 222, 83, 71);
        mPaint.setXfermode(avoidXfermode);
        canvas.drawRect(50, 50, 690, 1010, mPaint);
    }
}

运转后的作用

看到墙上那堆阿姨红了没,作用杠杠的,这儿咱们的容差值并没有发挥作用,咱们改一改,把 妹子的白衣服变成阿姨红!

咱们把上面结构AvoidXfermode的内容改成:

avoidXfermode = new AvoidXfermode(0XFFD9E5F3, 25, AvoidXfermode.Mode.TARGET);

然后,妹子身上的白衣服就变成阿姨红了...,满满的罪恶感...


形式2:AvoidXfermode.Mode.AVOID

和上面的TARGET形式相反,上面是颜色相同才改动颜色,这儿是颜色不相同反而改动颜色, 而容差值相同带来相反的成果,容差值为0时,只有当图片中的像素颜色值与设置的颜色值完全不相同 的时分才会被染色,而当容差值到达最大值255的时分,略微有一点颜色不相同就会被染色! 咱们只需简略的修正上面的比如就可以了,同一是修正下结构AvoidXfermode的内容! 咱们改成下面这句:

avoidXfermode = new AvoidXfermode(0XFFD9E5F3,230, AvoidXfermode.Mode.AVOID);

运转作用图


二儿子:PixelXorXfermode

这个则是另一种图画混排形式,比起大儿子更简略,他的结构办法如下:

官方API文档:

参数解析:

就一个16进制带通明值得颜色值,至于这个值的作用,是有一个算法的: PixelXorXfermode内部是依照" opColor ^ src ^ dst "这个异或算法运算的, 得到一个不通明的(alpha = 255)的颜色值,设置到图画中!好吧,这是网上搜的 详细我也不知道,写个比如试试作用呗~

代码示例

运转作用图

完结代码

/**
 * Created by Jay on 2015/10/22 0022.
 */
public class PixelXorXfermodeView1 extends View{

    private Paint mPaint;
    private Bitmap mBitmap;
    private PixelXorXfermode pixelxorXfermode;

    public PixelXorXfermodeView1(Context context) {
        super(context);
        init();

    }

    public PixelXorXfermodeView1(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public PixelXorXfermodeView1(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  //抗锯齿
        pixelxorXfermode = new PixelXorXfermode(0XFFD9E5F3);
        mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.iv_meizi);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBitmap, 50, 50, mPaint);
        mPaint.setARGB(255, 222, 83, 71);
        mPaint.setXfermode(pixelxorXfermode);
        canvas.drawRect(50, 50, 690, 1010, mPaint);
    }

}

本节示例代码下载:


本节小结:

好吧,满满的罪恶感,很漂亮的一个妹子,成果给我写demo写成了这个姿态,别怪我, 嗯,对了,忘掉说,Xfermode的大儿子和二儿子现已过世(过期),在API 16后的版别,就 过期了,也就说本节并没什么卵用...

也不能这样说,Apache在4.4后的版别都给阉割了,可是仍是有人用着HttpClient,或许 由这个库写的HTTP恳求结构哈~当然,这种人根本很少很少!不过学多点总没害处,是吧, 下节的三儿子PorterDuffXfermode就没过期啦,也很重要,嗯,定心,不会又会毁相片! 嗯,就说这么多,谢谢~