国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Manuel de développement Android / Paint API之—— Xfermode與PorterDuff詳解(一)

Paint API之—— Xfermode與PorterDuff詳解(一)

本節(jié)引言:

不知道標(biāo)題這兩個(gè)玩意你熟不熟悉啦,如果自己實(shí)現(xiàn)過(guò)圓角或者圓形圖片,相信對(duì)這兩個(gè)名詞 并不模式,一時(shí)半伙沒(méi)想起來(lái)?沒(méi)關(guān)系,下面這個(gè)圖你可曾見(jiàn)過(guò)?

1.png

PS:網(wǎng)上都說(shuō)在:\samples\android-XX\legacy\ApiDemos\src\com\example\android\apis\graphics 下能找到這個(gè)圖片- -,然而并沒(méi)有,不知道是不是因?yàn)槲业膕ample是android-22的,只在這里找到一個(gè)Xfermodes.java的Java文件!這里直接貼下網(wǎng)上找到的~

嗯,說(shuō)回來(lái),這圖相信大部分朋友都見(jiàn)過(guò)吧,沒(méi)見(jiàn)過(guò)也沒(méi)關(guān)系,本節(jié)我們帶大家來(lái)一點(diǎn)點(diǎn)的學(xué)習(xí) 這個(gè)東西~,看回我們前面的Android基礎(chǔ)入門(mén)教程——8.3.1 三個(gè)繪圖工具類(lèi)詳解

setXfermode(Xfermode xfermode):設(shè)置圖形重疊時(shí)的處理方式,如合并,取交集或并集, 經(jīng)常用來(lái)制作橡皮的擦除效果!

我們來(lái)到官方文檔:Xfermode,我們發(fā)現(xiàn)他有三個(gè)兒子:

2.png

本節(jié)我們來(lái)學(xué)習(xí)他的前兩個(gè)兒子~


大兒子:AvoidXfermode

嗯,和前面學(xué)的MaskFilter的兩個(gè)子類(lèi)一樣,不支持硬件加速,所以如果是API 14以上的版本, 需要關(guān)閉硬件加速才會(huì)有效果!怎么關(guān)自己看上一節(jié)哈~

我們來(lái)看看他給我們提供的構(gòu)造方法!官方API文檔:AvoidXfermode

3.png

參數(shù)有三個(gè),依次是:

opColor:一個(gè)十六進(jìn)制的帶透明度的顏色值,比如0x00C4C4;

tolerance:容差值,如果你學(xué)過(guò)PS可能用過(guò)魔棒工具,就是設(shè)置選取顏色值的范圍,比如 容差為0,你選的是純黑的小點(diǎn),當(dāng)容差調(diào)為40的時(shí)候,范圍已經(jīng)擴(kuò)大到大塊黑色這樣!如果 還不是很明白,等下我們寫(xiě)寫(xiě)代碼就知道了!

mode:AvoidXfermode模式,有兩種:TARGETAVOID


模式1:AvoidXfermode.Mode.TARGET

該模式會(huì)判斷畫(huà)布上是否有與我們?cè)O(shè)置顏色值不一樣的顏色,如果有的話,會(huì)把這些區(qū)域 染上一層畫(huà)筆定義的顏色,其他地方不染色!下面我們寫(xiě)代碼演示下,順便讓大家感覺(jué)下 這個(gè)容差值!

使用代碼示例

運(yùn)行效果圖

嗯,先上下原圖,素材來(lái)自gank.io

4.jpg

接下來(lái)我們隨便把墻上某個(gè)地方的顏色用顏色取色器取下,然后寫(xiě)一個(gè)簡(jiǎn)單的View!

PS:需要在AndroidManifest.xml中的appliction節(jié)點(diǎn)添加關(guān)閉硬件加速: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);
    }
}

運(yùn)行后的效果

5.png

看到墻上那堆姨媽紅了沒(méi),效果杠杠的,這里我們的容差值并沒(méi)有發(fā)揮作用,我們改一改,把 妹子的白衣服變成姨媽紅!

我們把上面構(gòu)造AvoidXfermode的內(nèi)容改成:

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

然后,妹子身上的白衣服就變成姨媽紅了...6.jpg,滿滿的罪惡感...

7.png


模式2:AvoidXfermode.Mode.AVOID

和上面的TARGET模式相反,上面是顏色一樣才改變顏色,這里是顏色不一樣反而改變顏色, 而容差值同樣帶來(lái)相反的結(jié)果,容差值為0時(shí),只有當(dāng)圖片中的像素顏色值與設(shè)置的顏色值完全不一樣 的時(shí)候才會(huì)被染色,而當(dāng)容差值達(dá)到最大值255的時(shí)候,稍微有一點(diǎn)顏色不一樣就會(huì)被染色! 我們只需簡(jiǎn)單的修改上面的例子就可以了,同一是修改下構(gòu)造AvoidXfermode的內(nèi)容! 我們改成下面這句:

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

運(yùn)行效果圖

8.png


二兒子:PixelXorXfermode

這個(gè)則是另一種圖像混排模式,比起大兒子更簡(jiǎn)單,他的構(gòu)造方法如下:

官方API文檔:PixelXorXfermode

9.png

參數(shù)解析:

就一個(gè)16進(jìn)制帶透明值得顏色值,至于這個(gè)值的作用,是有一個(gè)算法的: PixelXorXfermode內(nèi)部是按照" opColor ^ src ^ dst "這個(gè)異或算法運(yùn)算的, 得到一個(gè)不透明的(alpha = 255)的色彩值,設(shè)置到圖像中!好吧,這是網(wǎng)上搜的 具體我也不知道,寫(xiě)個(gè)例子試試效果唄~

代碼示例

運(yùn)行效果圖

10.png

實(shí)現(xiàn)代碼

/**
 * 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);
    }

}

本節(jié)示例代碼下載:

XfermodeDemo.zip


本節(jié)小結(jié):

好吧,滿滿的罪惡感,很漂亮的一個(gè)妹子,結(jié)果給我寫(xiě)demo寫(xiě)成了這個(gè)樣子,別怪我,11.gif嗯,對(duì)了,忘記說(shuō),Xfermode的大兒子和二兒子已經(jīng)過(guò)世(過(guò)期),在API 16后的版本,就 過(guò)期了,也就說(shuō)本節(jié)并沒(méi)什么卵用...

也不能這樣說(shuō),Apache在4.4后的版本都給閹割了,但是還是有人用著HttpClient,或者 由這個(gè)庫(kù)寫(xiě)的HTTP請(qǐng)求框架哈~當(dāng)然,這種人基本很少很少!不過(guò)學(xué)多點(diǎn)總沒(méi)壞處,是吧, 下節(jié)的三兒子PorterDuffXfermode就沒(méi)過(guò)時(shí)啦,也很重要,嗯,放心,不會(huì)又會(huì)毀照片! 嗯,就說(shuō)這么多,謝謝~