起始位在 ViewRootImpl類中 performTraversals方法 在按順序 測(cè)量 布局 后執(zhí)行
performDraw()> draw()>drawSoftware()> (View)mView.draw(canvas) 在View draw中完成繪制 這里ViewGroup 沒有重寫draw 所以最終 都是調(diào)用View draw方法
View draw(Canvas canvas) 的依次執(zhí)行過程為:
1.繪制背景
2.如有必要,保存畫布的圖層以準(zhǔn)備褪色
3.繪制視圖的內(nèi)容 onDraw(canvas)
4.畫孩子
5.如有必要,繪制漸變邊緣并恢復(fù)圖層
6.繪制裝飾(例如滾動(dòng)條)
在個(gè)圖中View都是完成onDraw(canvas) 來達(dá)到各種效果
要完成繪制分兩個(gè)步驟
1.創(chuàng)建設(shè)置畫筆paint
2.canvas進(jìn)行畫
Paint 基本使用《Paint的方法主要可以抽象成兩大類》:
1. 負(fù)責(zé)設(shè)置獲取圖形繪制、路徑相關(guān)的
setStyle(Paint.Style style) 設(shè)置畫筆樣式 取值有
Paint.Style.FILL :填充內(nèi)部
Paint.Style.STROKE :僅描邊 畫線段
Paint.Style.FILL_AND_STROKE :填充內(nèi)部和描邊
setStrokeWidth(float width) 設(shè)置畫筆寬度
setAntiAlias(boolean aa) 設(shè)置畫筆是否抗鋸齒 轉(zhuǎn)角平滑 資源消耗大
setStrokeCap(Paint.Cap cap)設(shè)置線冒樣式
setStrokeJoin(Paint.Join join)設(shè)置線段連接處樣式
Join.MITER(結(jié)合處為銳角)
Join.Round(結(jié)合處為圓弧)
Join.BEVEL(結(jié)合處為直線)
setStrokeMiter(float miter) 設(shè)置筆畫的傾斜度
reset() 清空畫筆復(fù)位 恢復(fù)到默認(rèn)設(shè)置
set(Paint src) 設(shè)置一個(gè)外來Paint畫筆。相當(dāng)于克隆
setARGB(int a, int r, int g, int b) ,getAlpha() ,setAlpha(int a) ,getColor(),setColor(int color) 獲取與設(shè)置alpha值、顏色、ARGB等
setDither(boolean dither) 設(shè)定圖片是否使用抖動(dòng) 色階分界線更自然
setPathEffect(PathEffect effect)線段夾角轉(zhuǎn)彎半徑 或虛線 設(shè)置路徑各種效果
CornerPathEffect——圓形拐角效果paint.setPathEffect(new CornerPathEffect(100));
DashPathEffect( float[],int)——虛線效果 float[] 虛線樣式
setXfermode(Xfermode xfermode)設(shè)置圖形重疊時(shí)的處理方式,如合并,取交集或并集,經(jīng)常用來制作橡皮的擦除效果
setMaskFilter(MaskFilter maskfilter)設(shè)置MaskFilter,可以用不同的MaskFilter實(shí)現(xiàn)濾鏡的效果,如濾化,立體等
setColorFilter(ColorFilter colorfilter) 設(shè)置顏色過濾器,可以在繪制顏色時(shí)實(shí)現(xiàn)不用顏色的變換效果
setShader(Shader shader)設(shè)置圖像效果,使用Shader可以繪制出各種漸變效果
setShadowLayer(float radius ,float dx,float dy,int color)在圖形下面設(shè)置陰影層,產(chǎn)生陰影效果,radius為陰影的角度,dx和dy為陰影在x軸和y軸上的距離,color為陰影的顏色
2. 負(fù)責(zé)設(shè)置獲取文字相關(guān)的
getFontSpacing() 獲取字符行間距。
getLetterSpacing() setLetterSpacing(float letterSpacing) 設(shè)置和獲取字符間距
isUnderlineText() setUnderlineText(boolean underlineText) 是否有下劃線和設(shè)置下劃線。
isStrikeThruText() setStrikeThruText(boolean strikeThruText) 獲取與設(shè)置是否有文本刪除線。
getTextSize() setTextSize(float textSize) 獲取與設(shè)置文字大小,注意:Paint.setTextSize傳入的單位是px,TextView.setTextSize傳入的單位是sp,注意使用時(shí)不同分辨率處理問題。
getTypeface() setTypeface(Typeface typeface) 獲取與設(shè)置字體類型。Android默認(rèn)有四種字體樣式:BOLD(加粗)、BOLD_ITALIC(加粗并傾斜)、ITALIC(傾斜)、NORMAL(正常),我們也可以通過Typeface類來自定義個(gè)性化字體。
getTextSkewX() setTextSkewX(float skewX)獲取與設(shè)置文字傾斜,參數(shù)沒有具體范圍,官方推薦值為-0.25,值為負(fù)則右傾,為正則左傾,默認(rèn)值為0。
getTextAlign() setTextAlign(Paint.Align align)獲取與設(shè)置文本對(duì)齊方式,取值為CENTER、LEFT、RIGHT,也就是文字繪制是左邊對(duì)齊、右邊還是局中的。
breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth) 獲取一行放幾個(gè)比如文本閱讀器的翻頁(yè)效果,我們需要在翻頁(yè)的時(shí)候動(dòng)態(tài)折斷或生成一行字符串,這就派上用場(chǎng)了~
計(jì)算指定參數(shù)長(zhǎng)度能顯示多少個(gè)字符,同時(shí)可以獲取指定參數(shù)下可顯示字符的真實(shí)長(zhǎng)度,譬如:
private static final String STR = "你好!世界";
mPaint.setTextSize(50);
float[] value = new float[1];
int ret = mPaint.breakText(STR, true, 200, value);
Log.i("YYYY", "breakText="+ret+", STR="+STR.length()+", value="+value[1]);
//breakText=5, STR=8, value=195.0
void getTextBounds(char[] text, int index, int count, Rect bounds)
void getTextBounds(String text, int start, int end, Rect bounds)
獲取文本的寬高,通過bounds的Rect拿到整型。
float measureText(String text)
float measureText(CharSequence text, int start, int end)
float measureText(String text, int start, int end)
float measureText(char[] text, int index, int count)
粗略獲取文本的寬度,和上面的getTextBounds比較類似,返回浮點(diǎn)數(shù)。
int getTextWidths(String text, int start, int end, float[] widths)
int getTextWidths(String text, float[] widths)
int getTextWidths(CharSequence text, int start, int end, float[] widths)
int getTextWidths(char[] text, int index, int count, float[] widths)
精確計(jì)算文字寬度,與上面兩個(gè)類似。
最后編輯于 :2017.12.20 14:26:07
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者 【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。 平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。