Android Paint的使用

自定義控件具有很強的靈活性,可以根據你的想法畫出各種各樣的圖案,在Android中如果是自定義控件的話,Paint這個類用的還是較多的,這一篇就來簡單介紹Paint這個類的使用,先來看一下這個類的註釋

[java] view plain copy
  1. /** 
  2.  * The Paint class holds the style and color information about how to draw 
  3.  * geometries, text and bitmaps. 
  4.  */  
這個類可以畫幾何圖形,文本和bitmap。由於這個類的native方法和@hide方法比較多,這裏就挑一些在工作中可能常用到的方法來講解。先來看一下Paint的style,共有3種

Paint.Style.FILL:填充內部
Paint.Style.FILL_AND_STROKE  :填充內部和描邊
Paint.Style.STROKE  :描邊

我們看一下效果


FILL_AND_STROKE和FILL區別不是很大。在看一下Cap,也有3種類型,主要是線條的末端,爲了直觀,下面三個線條我設置的比較粗,我們看一下效果


我們看一下,其中兩條豎線是三條線條的座標的起始點和終止點,區別很明顯。再來看看Join,也是有3種類型,我們看一下


這個是畫的矩形,連接的時候用到的,效果很明顯,就不在解釋。再看下一個Align,也是有3種類型,看名字大概也能猜的出來,不過還是要來驗證一下


OK,Paint的幾種類型已經演示完了,下面主要來看一下他的方法。

//重置Paint。
reset()

//設置一些標誌,比如抗鋸齒,下劃線等等。

setFlags(int flags)

//設置抗鋸齒,如果不設置,加載位圖的時候可能會出現鋸齒狀的邊界,如果設置,邊界就會變的稍微有點模糊,鋸齒就看不到了。

setAntiAlias(boolean aa)

//設置是否抖動,如果不設置感覺就會有一些僵硬的線條,如果設置圖像就會看的更柔和一些,

setDither(boolean dither)

//這個是文本緩存,設置線性文本,如果設置爲true就不需要緩存,

setLinearText(boolean linearText)

//設置亞像素,是對文本的一種優化設置,可以讓文字看起來更加清晰明顯,可以參考一下PC端的控制面板-外觀和個性化-調整ClearType文本

setSubpixelText(boolean subpixelText)

//設置文本的下劃線

setUnderlineText(boolean underlineText)

//設置文本的刪除線

setStrikeThruText(boolean strikeThruText)

//設置文本粗體

setFakeBoldText(boolean fakeBoldText)

//對位圖進行濾波處理,如果該項設置爲true,則圖像在動畫進行中會濾掉對Bitmap圖像的優化操作,加快顯示 

setFilterBitmap(boolean filter)

//下面這幾個就不用說了,上面已經演示過

setStyle(Style style),setStrokeCap(Cap cap),setStrokeJoin(Join join),setTextAlign(Align align),

//設置畫筆顏色

setColor(int color)

//設置畫筆的透明度[0-255],0是完全透明,255是完全不透明

setAlpha(int a)

//設置畫筆顏色,argb形式alpha,red,green,blue每個範圍都是[0-255],

setARGB(int a, int r, int g, int b)

//畫筆樣式爲空心時,設置空心畫筆的寬度

setStrokeWidth(float width)

//當style爲Stroke或StrokeAndFill時設置連接處的傾斜度,這個值必須大於0,看一下演示結果

setStrokeMiter(float miter)

左上角的沒有設置setStrokeMiter,右上角setStrokeMiter(2.3f),左下角setStrokeMiter(1.7f),右下角setStrokeMiter(0f)


//這個沒整明白具體幹什麼用的

getFillPath(Path src, Path dst)

//設置着色器,用來給圖像着色的,繪製出各種漸變效果,有BitmapShader,ComposeShader,LinearGradient,RadialGradient,SweepGradient幾種,這個以後再單獨講

setShader(Shader shader)

//設置畫筆顏色過濾器,有ColorMatrixColorFilter,LightingColorFilter,PorterDuffColorFilter幾種,這個以後再單獨分析

setColorFilter(ColorFilter filter)

//設置圖形重疊時的顯示方式,下面來演示一下

setXfermode(Xfermode xfermode)

下面是我運行目錄D:\android\adt-bundle-windows\sdk\samples\android-20\legacy\ApiDemos\src\com\example\android\apis\graphics\Xfermodes類的結果


總共有16種重疊模式,而Mode類中顯示的總共有18種,下面是我自己寫的一個,只有綠色和紅色兩種圖片(沒有黑色),先畫的是綠色,後畫的是紅色,和上面有很大差距,不知道什麼原因,有時間得好好研究一下


//設置繪製路徑的效果,有ComposePathEffect,CornerPathEffect,DashPathEffect,DiscretePathEffect,PathDashPathEffect,SumPathEffect幾種,以後在單獨分析

setPathEffect(PathEffect effect)

//對圖像進行一定的處理,實現濾鏡的效果,如濾化,立體等,有BlurMaskFilter,EmbossMaskFilter幾種

setMaskFilter(MaskFilter maskfilter)

//設置字體樣式,可以是Typeface設置的樣式,也可以通過Typeface的createFromAsset(AssetManager mgr, String path)方法加載樣式

setTypeface(Typeface typeface)

//設置陰影效果,radius爲陰影角度,dx和dy爲陰影在x軸和y軸上的距離,color爲陰影的顏色 ,看一下演示效果,其中第一個是沒有陰影的,第二個設置了黑色的陰影

setShadowLayer(float radius, float dx, float dy, int shadowColor)


//設置地理位置,比如顯示中文,日文,韓文等,默認的顯示Locale.getDefault()即可,

setTextLocale(Locale locale)

//設置優雅的文字高度,這個設置可能會對FontMetrics產生影響

setElegantTextHeight(boolean elegant)

//設置字體大小

setTextSize(float textSize)

//設置字體的水平方向的縮放因子,默認值爲1,大於1時會沿X軸水平放大,小於1時會沿X軸水平縮小

setTextScaleX(float scaleX)

//設置文本在水平方向上的傾斜,默認值爲0,推薦的值爲-0.25,

setTextSkewX(float skewX)

//設置行的間距,默認值是0,負值行間距會收縮

setLetterSpacing(float letterSpacing)

//設置字體樣式,可以設置CSS樣式

setFontFeatureSettings(String settings)

//這個Paint的靜態內部類,主要用於字體的高度,以後再分析

FontMetrics

//下面幾個就是測量字體的長度了

measureText(char[] text, int index, int count),measureText(String text, int start, int end),measureText(String text),measureText(CharSequence text, int start, int end)

//下面這幾個就是剪切顯示,就是大於maxWidth的時候只截取指定長度的顯示

breakText(char[] text, int index, int count,float maxWidth, float[] measuredWidth),breakText(CharSequence text, int start, int end,boolean measureForwards,  floatmaxWidth, float[] measuredWidth),breakText(String text, boolean measureForwards,float maxWidth, float[] measuredWidth)

//提取指定範圍內的字符串,保存到widths中,

getTextWidths(char[] text, int index, int count,float[] widths),getTextWidths(CharSequence text, int start, int end, float[] widths),getTextWidths(String text, int start, int end, float[] widths),getTextWidths(String text, float[] widths)

//獲取文本繪製的路徑,提取到Path中,

getTextPath(char[] text, int index, int count, float x, float y, Path path),getTextPath(String text, int start, int end, float x, float y, Path path)

//得到文本的邊界,上下左右,提取到bounds中,可以通過這計算文本的寬和高

getTextBounds(String text, int start, int end, Rect bounds) ,getTextBounds(char[] text, int index, int count, Rect bounds)

OK,剩下的一些就是@hide或是native,或者是get方法,這裏就不在一一敘述。





轉自http://blog.csdn.net/abcdef314159



發佈了16 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章