當前位置:
首頁 > 知識 > Paint API之 Xfermode與PorterDuff詳解

Paint API之 Xfermode與PorterDuff詳解

大兒子:AvoidXfermode


嗯,和前面學的MaskFilter的兩個子類一樣,不支持硬體加速,所以如果是API 14以上的版本, 需要關閉硬體加速才會有效果!怎麼關自己看上一節哈~

我們來看看他給我們提供的構造方法!官方API文檔:AvoidXfermode

Paint API之 Xfermode與PorterDuff詳解


參數有三個,依次是:

opColor:一個十六進位的帶透明度的顏色值,比如0x00C4C4;

tolerance:容差值,如果你學過PS可能用過魔棒工具,就是設置選取顏色值的範圍,比如 容差為0,你選的是純黑的小點,當容差調為40的時候,範圍已經擴大到大塊黑色這樣!如果 還不是很明白,等下我們寫寫代碼就知道了!

mode:AvoidXfermode模式,有兩種:TARGETAVOID


模式1:AvoidXfermode.Mode.TARGET


該模式會判斷畫布上是否有與我們設置顏色值不一樣的顏色,如果有的話,會把這些區域 染上一層畫筆定義的顏色,其他地方不染色!下面我們寫代碼演示下,順便讓大家感覺下 這個容差值!

使用代碼示例

運行效果圖

嗯,先上下原圖,素材來自gank.io

Paint API之 Xfermode與PorterDuff詳解

接下來我們隨便把牆上某個地方的顏色用顏色取色器取下,然後寫一個簡單的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);
}
}

運行後的效果

Paint API之 Xfermode與PorterDuff詳解

看到牆上那堆姨媽紅了沒,效果杠杠的,這裡我們的容差值並沒有發揮作用,我們改一改,把 妹子的白衣服變成姨媽紅!

我們把上面構造AvoidXfermode的內容改成:

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

然後,妹子身上的白衣服就變成姨媽紅了...

Paint API之 Xfermode與PorterDuff詳解

,滿滿的罪惡感...

Paint API之 Xfermode與PorterDuff詳解



模式2:AvoidXfermode.Mode.AVOID

和上面的TARGET模式相反,上面是顏色一樣才改變顏色,這裡是顏色不一樣反而改變顏色, 而容差值同樣帶來相反的結果,容差值為0時,只有當圖片中的像素顏色值與設置的顏色值完全不一樣 的時候才會被染色,而當容差值達到最大值255的時候,稍微有一點顏色不一樣就會被染色! 我們只需簡單的修改上面的例子就可以了,同一是修改下構造AvoidXfermode的內容! 我們改成下面這句:

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

運行效果圖

Paint API之 Xfermode與PorterDuff詳解



二兒子:PixelXorXfermode


這個則是另一種圖像混排模式,比起大兒子更簡單,他的構造方法如下:

官方API文檔:PixelXorXfermode

Paint API之 Xfermode與PorterDuff詳解


參數解析:

就一個16進位帶透明值得顏色值,至於這個值的作用,是有一個演算法的: PixelXorXfermode內部是按照" opColor ^ src ^ dst "這個異或演算法運算的, 得到一個不透明的(alpha = 255)的色彩值,設置到圖像中!好吧,這是網上搜的 具體我也不知道,寫個例子試試效果唄~

代碼示例

運行效果圖

Paint API之 Xfermode與PorterDuff詳解

實現代碼

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


本節示例代碼下載:

XfermodeDemo.zip



本節小結:


好吧,滿滿的罪惡感,很漂亮的一個妹子,結果給我寫demo寫成了這個樣子,別怪我,

Paint API之 Xfermode與PorterDuff詳解


嗯,對了,忘記說,Xfermode的大兒子和二兒子已經過世(過期),在API 16後的版本,就 過期了,也就說本節並沒什麼卵用...

Paint API之 Xfermode與PorterDuff詳解

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Docker 使用容器來創建鏡像
Redis 數據結構詳解

TAG:程序員小新人學習 |