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
一個開源庫: