UI繪制流程 Draw Paint基本屬性(四)

起始位在 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è)類似叠赐。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欲账,一起剝皮案震驚了整個(gè)濱河市屡江,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赛不,老刑警劉巖惩嘉,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異踢故,居然都是意外死亡文黎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門殿较,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耸峭,“玉大人,你說我怎么就攤上這事淋纲±湍郑” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵洽瞬,是天一觀的道長(zhǎng)本涕。 經(jīng)常有香客問我,道長(zhǎng)伙窃,這世上最難降的妖魔是什么菩颖? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮为障,結(jié)果婚禮上晦闰,老公的妹妹穿的比我還像新娘。我一直安慰自己产场,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布舞竿。 她就那樣靜靜地躺著京景,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骗奖。 梳的紋絲不亂的頭發(fā)上确徙,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音执桌,去河邊找鬼鄙皇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仰挣,可吹牛的內(nèi)容都是我干的伴逸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼膘壶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼错蝴!你這毒婦竟也來了洲愤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤顷锰,失蹤者是張志新(化名)和其女友劉穎柬赐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體官紫,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肛宋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了束世。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酝陈。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖良狈,靈堂內(nèi)的尸體忽然破棺而出后添,到底是詐尸還是另有隱情,我是刑警寧澤薪丁,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布遇西,位于F島的核電站,受9級(jí)特大地震影響严嗜,放射性物質(zhì)發(fā)生泄漏粱檀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一漫玄、第九天 我趴在偏房一處隱蔽的房頂上張望茄蚯。 院中可真熱鬧,春花似錦睦优、人聲如沸渗常。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)皱碘。三九已至,卻和暖如春隐孽,著一層夾襖步出監(jiān)牢的瞬間癌椿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工菱阵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留踢俄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓晴及,卻偏偏與公主長(zhǎng)得像都办,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353