Android Paint高級進階使用以及圖像混合模式Xfremode的使用

1、概念:畫筆民逼,保存了繪制幾何圖形涮帘,文本和位圖的樣式和顏色信息

2调缨、常用api:主要如顏色,效果和文本相關等

Paint常用屬性和設置


還有一個方法:可以通過FontMetrics 獲取字體的各種屬性

Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();

以下是字體屬性的圖解


下面主要介紹幾種渲染效果(線性、環(huán)形伤哺、掃描默责、位圖咸包、組合)


一烂瘫、線性渲染


運行效果:


二坟比、環(huán)形渲染


運行效果


三葛账、掃描渲染


運行效果:


四籍琳、位圖渲染


運行效果


上面效果是tileX,tileY 都為Shader.TileMode.CLAMP時的效果;

現在設置tileX,tileY 都為都為Shader.TileMode.CLAMP势誊,寬高設置為原圖兩倍谣蠢,效果如下


Shader.TileMode.CLAMP效果是將bitmap右邊和下邊超出的范圍按bitmap最后一個像素拉伸眉踱;

Shader.TileMode.REPEAT效果是將超出范圍按原圖重復繪制如圖:


Shader.TileMode.MIRROR效果是將超出范圍按鏡面效果繪制


五勋锤、組合渲染


運行效果


下面詳細分析一下18種圖層混合模式

首先找到Google官方對圖層混合模式的簡單實例先學習一下叁执;


ApiDemos/app/src/main/java/com/example/android/apis/graphics/Xfermodes.java類中就是具體的實例

將源碼導入工程運行


這里只有16中模式依次為


這里先插播一個概念谈宛,什么是圖層混合吆录?

圖層混合就是將所繪制的圖形的像素與Canvas中對應位置的像素按照一定規(guī)則進行混合,形成新的像素值哀卫,從而更新Canvas中最終的像素顏色值撬槽。

下面研究一下PorterDuffXfermode使用及工作原理詳解

這里再插播兩個概念硬件加速和離屏渲染

硬件加速:一般在View繪制時我們需要禁止硬件加速,至于為什么要禁止共啃,這個和你的繪制操作有關系暂题,請自行百度,這里簡單解釋就是繪制時Canvas的某些API不支持硬件加速纵苛,但是Android4.0后系統(tǒng)是模式開啟的,如果不關閉會導致界面顯示有問題幔虏;

關閉方式:view.setLayerType(LAYER_TYPE_SOFTWARE, null);

離屏渲染:OpenGL的中贝椿,GPU屏幕渲染有兩種方式烙博。

屏幕渲染(當前屏幕渲染)指的是GPU的渲染操作是在當前用于顯示的屏幕緩沖區(qū)進行。

離屏渲染(離屏渲染)指的是在GPU在當前屏幕緩沖區(qū)以外開辟一個緩沖區(qū)進行渲染操作铺根。

當使用圓角乔宿,陰影,遮罩的時候掂林,圖層屬性的混合體被指定為在未預合成之前(下一個HSync信號開始前)不能直接在屏幕中繪制坝橡,所以就需要屏幕外渲染。這里也是簡單的解釋锣杂,想具體了解請自行百度查找資料番宁;

設置離屏渲染的兩種方式:

(一)

setLayerType(LAYER_TYPE_HARDWARE,mPaint);// 使用GPU來緩沖

setLayerType(LAYER_TYPE_SOFTWARE,mPaint);// 使用一個Bitmap來緩沖

(二)

int saveId = canvas.saveLayer(0, 0, getWidth(), getHeight(), mPaint);//在繪制之前保存蝶押,繪制完成后恢復

canvas.restoreToCount(saveId);

一般使用(二),如



下面先簡單介紹下圖層混合模式(PorterDuffXfermode)

該類有且只有一個含參的構造方法PorterDuffXfermode(PorterDuff.Mode mode),雖說構造方法的簽名列表里只有一個PorterDuff.Mode的參數离陶,但是它可以實現很多酷斃的圖形效果P铺础哀军!而PorterDuffXfermode就是圖形混合模式的意思打却,其概念最早來自于SIGGRAPH的Tomas Proter和Tom Duff谎倔,混合圖形的概念極大地推動了圖形圖像學的發(fā)展片习,延伸到計算機圖形圖像學像Adobe和AutoDesk公司著名的多款設計軟件都可以說一定程度上受到影響,而我們PorterDuffXfermode的名字也來源于這倆人的人名組合PorterDuff藕咏。

示例圖:


18種模式簡單介紹:

ADD:飽和相加,對圖像飽和度進行相加,不常用

  CLEAR:清除圖像

  DARKEN:變暗,較深的顏色覆蓋較淺的顏色孽查,若兩者深淺程度相同則混合

  DST:只顯示目標圖像

  DST_ATOP:在源圖像和目標圖像相交的地方繪制【目標圖像】盲再,在不相交的地方繪制【源圖 ? ? 像】,相交處的效果受到源圖像和目標圖像alpha的影響

  DST_IN:只在源圖像和目標圖像相交的地方繪制【目標圖像】济榨,繪制效果受到源圖像對應地方透明度影響

  DST_OUT:只在源圖像和目標圖像不相交的地方繪制【目標圖像】绿映,在相交的地方根據源圖像的alpha進行過濾,源圖像完全不透明則完全過濾丐一,完全透明則不過濾

  DST_OVER:將目標圖像放在源圖像上方

  LIGHTEN:變亮淹冰,與DARKEN相反,DARKEN和LIGHTEN生成的圖像結果與Android對顏色值深淺的定義有關

  MULTIPLY:正片疊底柠衍,源圖像素顏色值乘以目標圖像素顏色值除以255得到混合后圖像像素顏色值

  OVERLAY:疊加

  SCREEN:濾色晶乔,色調均和,保留兩個圖層中較白的部分正罢,較暗的部分被遮蓋

  SRC:只顯示源圖像

  SRC_ATOP:在源圖像和目標圖像相交的地方繪制【源圖像】,在不相交的地方繪制【目標圖像】履怯,相交處的效果受到源圖像和目標圖像alpha的影響

  SRC_IN:只在源圖像和目標圖像相交的地方繪制【源圖像】

  SRC_OUT:只在源圖像和目標圖像不相交的地方繪制【源圖像】,相交的地方根據目標圖像的對應地方的alpha進行過濾柠硕,目標圖像完全不透明則完全過濾疹味,完全透明則不過濾

  SRC_OVER:將源圖像放在目標圖像上方

  XOR:在源圖像和目標圖像相交的地方之外繪制它們,在相交的地方受到對應alpha和色值影響诫咱,如果完全不透明則相交處完全不繪制

下面列舉一些網上很好的相關博客以及開源的庫

Android Xfermode 實戰(zhàn) 實現圓形坎缭、圓角圖片(鴻洋)

https://blog.csdn.net/lmj623565791/article/details/42094215

Android Paint之 setXfermode PorterDuffXfermode 講解

https://blog.csdn.net/tianjian4592/article/details/44783283

一個開源庫:

https://github.com/MostafaGazar/CustomShapeImageView

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末签钩,一起剝皮案震驚了整個濱河市铅檩,隨后出現的幾起案子,更是在濱河造成了極大的恐慌拾给,老刑警劉巖兔沃,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乒疏,死亡現場離奇詭異,居然都是意外死亡窍侧,警方通過查閱死者的電腦和手機转绷,發(fā)現死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門暇咆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人其骄,你說我怎么就攤上這事扯旷。” “怎么了毯炮?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵桃煎,是天一觀的道長大刊。 經常有香客問我,道長葫辐,這世上最難降的妖魔是什么伴郁? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任焊傅,我火速辦了婚禮,結果婚禮上鹏倘,老公的妹妹穿的比我還像新娘顽爹。我一直安慰自己,他們只是感情好捏题,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布公荧。 她就那樣靜靜地躺著同规,像睡著了一般窟社。 火紅的嫁衣襯著肌膚如雪灿里。 梳的紋絲不亂的頭發(fā)上程腹,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天寸潦,我揣著相機與錄音,去河邊找鬼见转。 笑死斩箫,一個胖子當著我的面吹牛,可吹牛的內容都是我干的赊抖。 我是一名探鬼主播寨典,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼耸成,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弦追?” 一聲冷哼從身側響起花竞,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤约急,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后牵辣,有當地人在樹林里發(fā)現了一具尸體奴饮,經...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年近她,在試婚紗的時候發(fā)現自己被綠了膳帕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片危彩。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡泳桦,死狀恐怖,靈堂內的尸體忽然破棺而出谒府,到底是詐尸還是另有隱情浮毯,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站饰迹,受9級特大地震影響,放射性物質發(fā)生泄漏锹淌。R本人自食惡果不足惜赠制,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一钟些、第九天 我趴在偏房一處隱蔽的房頂上張望厘唾。 院中可真熱鬧,春花似錦抚垃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岛蚤,卻和暖如春懈糯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背她紫。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工贿讹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留够掠,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像袁勺,于是被迫代替她去往敵國和親期丰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內容