xfermode是畫筆的乙個屬性,有點類似於ps中的圖層,有乙個底層圖層,和乙個頂層圖層,通過兩個圖層疊放層次的不同,可以做出很多好玩的效果。
谷歌官方的apidemo中生成了兩個圖層的各種疊放次序效果:
是不是有點摸不著頭腦,讓我們列個**來解釋一下吧:
屬性名屬性常量
屬性說明
clear
porterduff.mode.clear
所有的圖層都不會在畫布上展示
srcporterduff.mode.src
只顯示頂層圖層的影象
dstporterduff.mode.dst
只顯示底層圖層的影象
srcover
porterduff.mode.src_over
顯示所有圖層,頂層圖層位於底層圖層上面(預設效果)
dstover
porterduff.mode.dst_over
顯示所有圖層,底層圖層位於頂層圖層上面
srcin
porterduff.mode.src_in
顯示兩個圖層的交集,頂層圖層位於底層圖層上面
dstin
porterduff.mode.dst_in
顯示兩個圖層的交集,底層圖層位於頂層圖層上面
srcout
porterduff.mode.src_out
顯示兩個圖層的部分非交集,只顯示頂層圖層的非交集部分
dstout
porterduff.mode.dst_out
顯示兩個圖層的部分非交集,只顯示底層圖層的非交集部分
srctop
porterduff.mode.src_atop
顯示底層圖層和兩個圖層的交集部分,頂層位於底層圖層的上面
dsttop
porterduff.mode.dst_atop
顯示頂層圖層和兩個圖層的交集部分,底層圖層位於頂層圖層上面
xorporterduff.mode.xor
顯示兩個圖層的完整非交集
darken
porterduff.mode.darken
顯示所有圖層,頂層位於底層圖層上面,相交部位變暗
lighten
porterduff.mode.lighten
顯示所有圖層,頂層位於底層圖層上面,相交部位變暗
multiply
porterduff.mode.multiply
顯示兩個圖層的交集,顏色變換類似於ps中的「正片疊底」效果
screen
porterduff.mode.screen
顯示兩個圖層的並集,顏色變換類似於ps中的「濾色」效果
tips:正片疊低效果就是把兩個圖層中的顏色進行疊加,這樣暗的部分會被加強;
濾色效果也是對兩個圖層中的顏色進行疊加,但亮的部分會被加強。
原理:雖然上面的**中將xfermode解釋成圖層的並集交集的疊放,但事實上系統是通過對sa(source alpha,src的透明度)、da(destination alpha,dat的透明度)、sc(source color,src的顏色)、dc(destination color,dat的透明度),四個值來進行運算來達到變換的效果。
我們可以在原始碼中看到相應的運算公式:
/** [0, 0] */
clear (0),
/** [sa, sc] */
src (1),
/** [da, dc] */
dst (2),
/** [sa + (1 - sa)*da, rc = sc + (1 - sa)*dc] */
src_over (3),
/** [sa + (1 - sa)*da, rc = dc + (1 - da)*sc] */
dst_over (4),
/** [sa * da, sc * da] */
src_in (5),
/** [sa * da, sa * dc] */
dst_in (6),
/** [sa * (1 - da), sc * (1 - da)] */
src_out (7),
/** [da * (1 - sa), dc * (1 - sa)] */
dst_out (8),
/** [da, sc * da + (1 - sa) * dc] */
src_atop (9),
/** [sa, sa * dc + sc * (1 - da)] */
dst_atop (10),
/** [sa + da - 2 * sa * da, sc * (1 - da) + (1 - sa) * dc] */
xor (11),
/** [sa + da - sa*da,
sc*(1 - da) + dc*(1 - sa) + min(sc, dc)] */
darken (12),
/** [sa + da - sa*da,
sc*(1 - da) + dc*(1 - sa) + max(sc, dc)] */
lighten (13),
/** [sa * da, sc * dc] */
multiply (14),
/** [sa + da - sa * da, sc + dc - sc * dc] */
screen (15),
/** saturate(s + d) */
add (16),
overlay (17);
使用的時候我們需要設定兩個圖來進行疊加:
setlayertype(layer_type_software, null); //關閉硬體加速
mbitmap = bitmapfactory.decoderesource(getresources(), r.drawable.ms);
mout = bitmap.createbitmap(mbitmap.getwidth(), mbitmap.getheight(), bitmap.config.argb_8888);
canvas canvas = new canvas(mout);
mpaint = new paint(paint.anti_alias_flag);
rectf rt = new rectf();
rt.left = 0; //矩形的左起點
rt.top = 0; //矩形的頂部起點
rt.right = mbitmap.getwidth(); //矩形的右終點
rt.bottom = mbitmap.getheight(); //矩形的底部終點
//dat
canvas.drawroundrect(rt, 50, 50, mpaint);
//設定xfermode
mpaint.setxfermode(new porterduffxfermode(porterduff.mode.src_in));
//src
canvas.drawbitmap(mbitmap, 0, 0, mpaint);
//還原xfermode
通過上面的**我們就將本來是直角的**,變成了圓角矩形。
引用宣告:慕課網《android影象處理-變」換」莫測的影象》————eclipse_xu
memcached 的使用及原理
overview 什麼是memcached?memcached是國外社群 livejournal 的開發團隊開發的高效能的分布式記憶體快取伺服器。一般的使用目的是,通過快取資料庫查詢結果,減少資料庫訪問次數,以提高動態web應用的速度 提高可擴充套件性。livejournal 團隊開發了包括 mem...
token的原理及使用
一 登陸的驗證流程 當使用者請求登陸的時候,如果沒有問題,我們在服務端生成一條記錄,這個記錄可以說明一下登陸的使用者是誰,然後把這條記錄的id號傳送給客戶端,客戶端收到以後把這個id號儲存在cookie裡,下次這個使用者再次向服務端發 送請求的時候,可以帶著這個cookie,這樣服務端會驗證乙個這個...
Token的原理及使用
首先,當使用者請求登入的時候如果沒有問題,我們會在服務端生成一條記錄,在這個記錄裡面有登陸的使用者是誰,然後服務端會把id號傳送給客戶端,客戶端收到這個id後會把他儲存在cookie裡面,下次使用者再向伺服器傳送請求的 時候可以帶著這個cookie,這樣服務端會驗證一下cookie裡面的資訊,看能否...