Xfermode有3個(gè)子類,我們主要用PorterDuffXfermode這個(gè)類嘲更,他只有一個(gè)構(gòu)造方法
public PorterDuffXfermode(PorterDuff.Mode mode) {
porterDuffMode = mode.nativeInt;
}
PorterDuff.Mode是一個(gè)enum類,里面有多種模式,可以讓我們實(shí)現(xiàn)不同的效果纤勒,其中每個(gè)mode都是由Sa,Sc隆檀,Da摇天,Dc四個(gè)決定的粹湃。
Sa:全稱為Source alpha,表示源圖的Alpha通道泉坐;
Sc:全稱為Source color为鳄,表示源圖的顏色;
Da:全稱為Destination alpha腕让,表示目標(biāo)圖的Alpha通道济赎;
Dc:全稱為Destination color,表示目標(biāo)圖的顏色.
每種模式代表什么樣的效果记某,下面看看一張圖就大概明白了司训,這個(gè)圖片來(lái)自這篇文章
http://ssp.impulsetrain.com/porterduff.html
PorterDuff.Mode.png
下面看看基本用法:
private void initXfermode() {
// 初始化
mXfermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 存為新圖層
int saveLayerCount = canvas.saveLayer(0, 0, mTotalWidth, mTotalHeight, mBitPaint,
Canvas.ALL_SAVE_FLAG)
// 繪制源圖形
canvas.drawRect(mSourceRect, mPaint);
// 設(shè)置混合模式
mPaint.setXfermode(mXfermode);
// 繪制目標(biāo)圖
canvas.drawRect(mDesRect, mPaint);
// 清除混合模式
mPaint.setXfermode(null);
// 恢復(fù)保存的圖層;
canvas.restoreToCount(saveLayerCount);
}
最后提一下硬件加速:
Api14之后默認(rèn)開(kāi)啟了硬件加速液南,硬件加速使用DisplayList來(lái)幫助渲染壳猜,不需要每次重繪都執(zhí)行大量的代碼。硬件加速使用OpenGL滑凉,會(huì)占用更多內(nèi)存统扳,并且增加耗電量,同時(shí)還有一些api是不支持硬件加速的畅姊,官方也提供了4個(gè)級(jí)別給開(kāi)發(fā)者控制硬件加速咒钟,不支持的api和4個(gè)級(jí)別的控制,見(jiàn)官方文檔若未,寫(xiě)的很詳細(xì)
https://developer.android.com/guide/topics/graphics/hardware-accel.html