一徽缚、Xfermode
Xfermode表示圖層的混合模式憨奸,用于描述兩個圖層之間進(jìn)行融合時,像素點(diǎn)進(jìn)行計算的規(guī)則猎拨。
在API16之前膀藐,Xfermode有3個子類:AvoidXfermode屠阻、PixelXorXfermode、PorterDuffXfermode额各。但在API16以后国觉,前兩個已經(jīng)過時,甚至從源碼里移除虾啦,所以我們只需學(xué)習(xí)PorterDuffXfermode
即可麻诀。
1.1、PorterDuffXfermode
PorterDuffXfermode
最早是在1984年由Porter和Duff兩人發(fā)表的論文《Compositing Digital Images》中出現(xiàn)傲醉,所以該混合模式也根據(jù)作者來命名蝇闭。
PorterDuffXfermode
構(gòu)造函數(shù)需要指定一個PorterDuff.Mode
,而PorterDuff.Mode在以下地方都會涉及:
1硬毕、ComposeShader
2呻引、Paint.setXfermode()
3、PorterDuffColorFilter
它提供18種模式可選項:
PorterDuff.Mode | 公式 |
---|---|
PorterDuff.Mode.CLEAR |
|
PorterDuff.Mode.SRC |
|
PorterDuff.Mode.DST |
|
PorterDuff.Mode.SRC_OVER |
|
PorterDuff.Mode.DST_OVER |
|
PorterDuff.Mode.SRC_IN |
|
PorterDuff.Mode.DST_IN |
|
PorterDuff.Mode.SRC_OUT |
|
PorterDuff.Mode.DST_OUT |
|
PorterDuff.Mode.SRC_ATOP |
|
PorterDuff.Mode.DST_ATOP |
|
PorterDuff.Mode.XOR |
|
PorterDuff.Mode.DARKEN |
|
PorterDuff.Mode.LIGHTEN |
|
PorterDuff.Mode.MULTIPLY |
|
PorterDuff.Mode.SCREEN |
|
PorterDuff.Mode.ADD |
|
PorterDuff.Mode.OVERLAY |
|
各種模式下的效果如下圖所示:
-
1吐咳、如果原圖和目標(biāo)圖大小一致(圖中逻悠,兩者大小均占滿整個小方格區(qū)域):
-
2、如果原圖和目標(biāo)圖大小不一致(圖中韭脊,兩者大小為可見大型恕):
這里可以發(fā)現(xiàn),兩種效果是不一樣的沪羔,谷歌官方給的是第一種饥伊,但是,通常情況應(yīng)該是第二種蔫饰,具體原因可參考該文章琅豆。比如我們畫一個矩形,應(yīng)該按第二種效果來考慮死嗦,因為源圖和目標(biāo)圖大小不一致趋距;如果畫相同大小的Bitmap,則按第一種做越除。
在實際應(yīng)用中节腐,我們可以從以下三個方面來決定使用哪種模式:
1、目標(biāo)圖像和源圖像混合摘盆,需不需要生成顏色的疊加特效翼雀。如果需要,則從顏色疊加相關(guān)模式中選擇孩擂,有Mode.ADD(飽和度相加)狼渊、Mode.DARKEN(變暗)、Mode.LIGHTEN(變亮)、Mode.MULTIPLY (正片疊底)狈邑、Mode.OVERLAY(疊加)城须、Mode.SCREEN(濾色)。
2米苹、當(dāng)不需要特效糕伐,而需要根據(jù)某張圖片的透明像素來裁剪時,就需要使用SRC相關(guān)模式或DST相關(guān)模式了蘸嘶。而SRC相關(guān)模式與DST相關(guān)模式是相通的良瞧,唯一不同的是決定當(dāng)前哪個圖像是目標(biāo)圖像和源圖像。
3训唱、當(dāng)需要清空圖像時褥蚯,使用Mode.CLEAR模式。
1.1况增、實例:
二赞庶、硬件加速
2.1、View的繪制模型
1巡通、沒有硬件加速:
invalidate the view hierarchy ------> draw the view hierarchy
2尘执、有硬件加速:
invalidate the view hierarchy ------> record and update the display list ------> draw the display list
2.2、開啟硬件加速后的異常
1宴凉、繪制不正確:可能使用了不支持硬件加速的操作, 需要關(guān)閉硬件加速或者繞過該操作
2表悬、拋出異常:可能使用了不支持硬件加速的操作弥锄, 需要關(guān)閉硬件加速或者繞過該操作
2.3、禁用GPU硬件加速
在Android系統(tǒng)中蟆沫,有4個不同級別的打開或者關(guān)閉硬件加速操作:
1籽暇、Application級別:
<application android:hardwareAccelerated="false">
默認(rèn)為true,用于控制這個app是否開啟硬件加速饭庞。
2戒悠、Activity級別:
<activity android:hardwareAccelerated="false">
3、Window級別:(只支持開啟操作)
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
4舟山、View級別:(只支持關(guān)閉操作)
view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
LAYER_TYPE_HARDWARE
绸狐,使用硬件加速(GPU)進(jìn)行繪制
LAYER_TYPE_SOFTWARE
,使用CPU進(jìn)行繪制
或者布局文件中累盗,指定以下屬性:
android:layerType="software"
2.4寒矿、檢測是否開啟硬件加速
1、view.isHardwareAccelerated()
如果返回true若债,表示view掛在一個開啟了硬件加速的Window之下符相,也就意味著,它在繪制時蠢琳,并不一定開啟了硬件加速啊终。
2镜豹、canvas.isHardwareAccelerated()
如果返回true,因為著canvas在繪制的時候啟用了硬件加速蓝牲,盡量采用此方法來判斷是否開啟了硬件加速趟脂。