詳解Paint的各種set方法

 

一、前言

  我們用set方法來設置畫筆的樣式,類似於我們挑選畫筆畫畫的過程。由於上面有些方法不支持硬件加速,所以在高版本系統中可能會沒有效果。因此,我們首先來看看官方廢棄的方法。

下圖來自:https://developer.android.com/guide/topics/graphics/hardware-accel.html#unsupported

當你要使用打叉的方法時,請關閉硬件加速。關閉的方法有兩種:

(1)在application配置文件中關閉硬件加速:

複製代碼
 <application
        android:allowBackup="true"
        android:hardwareAccelerated="false"  
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

    ……    
複製代碼

(2)在自定義view中調用方法來關閉:

setLayerType(LAYER_TYPE_SOFTWARE, null); 

注意:因爲在配置文件中關閉會讓整個應用程序無法使用硬件加速的特性,所以強烈建議用第二種方式進行關閉。

 

 

二、詳細解讀各種set方法

set(Paint src)

顧名思義爲當前畫筆設置一個畫筆,說白了就是把另一個畫筆的屬性設置Copy給我們的畫筆,不累贅了

 

setAlpha(int a); 

設置繪製圖形的透明度,設置範圍是[0..255]

 

setAntiAlias(boolean aa)

打開抗鋸齒。抗鋸齒是依賴於算法的,算法決定抗鋸齒的效率,在我們繪製棱角分明的圖像時,比如一個矩形、一張位圖,我們不需要打開抗鋸齒。

 

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

設置繪製的顏色,a代表透明度,r,g,b代表顏色值。

 

setColor(int color)

設置繪製的顏色,使用顏色值來表示,該顏色值包括透明度和RGB顏色。 

 

setColorFilter(ColorFilter filter)

設置顏色過濾,這個方法需要我們傳入一個ColorFilter參數同樣也會返回一個ColorFilter實例。如需詳細瞭解,請參考:

詳解Paint的setColorFilter(ColorFilter filter)

 

setDither(boolean dither)

設定是否使用圖像抖動處理,會使繪製出來的圖片顏色更加平滑和飽滿,圖像更加清晰。這玩意用來設置我們在繪製圖像時的抗抖動,也稱爲遞色,那什麼叫抗抖動呢?在Android中我確實不好拿出一個明顯的例子,我就在PS裏模擬說明一下:

大家看到的這張七彩漸變圖是一張RGB565模式下圖片,即便圖片不是很大我們依然可以很清晰地看到在兩種顏色交接的地方有一些色塊之類的東西感覺很不柔和,因爲在RGB模式下只能顯示2^16=65535種色彩,因此很多豐富的色彩變化無法呈現,而Android呢爲我們提供了抗抖動這麼一個方法,它會將相鄰像素之間顏色值進行一種“中和”以呈現一個更細膩的過渡色:

 

setElegantTextHeight(boolean elegant)
 
具體效果未知,個人測試後出現了沒有此方法的異常,百度無果。故,暫時不推薦使用。
 
 

setFakeBoldText (boolean fakeBoldText)

設置文本仿粗體。注意設置在小字體上效果會非常差。

 

setFilterBitmap(boolean filter)

如果該項設置爲true,則圖像在動畫進行中會濾掉對Bitmap圖像的優化操作,加快顯示速度,本設置項依賴於dither和xfermode的設置。

 

setFlags (int flags)

設置標誌,還是對paint進行樣式的設置。而且,這裏設置的flag可以放在paint的初始化中,比如:

// 實例化畫筆並打開抗鋸齒
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);  

 

setFontFeatureSettings(String settings)
設置字體的樣式,這個樣式和CSS樣式很類似。樣式可以爲null,可以參考:http://dev.w3.org/csswg/css-fonts/#propdef-font-feature-settings
 
setHinting(int mode)
 
設置畫筆的隱藏模式。可以是HINTING_OFF or HINTING_ON之一。

 

setLetterSpacing(float letterSpacing)

設置行間距,默認是0.

 

setLinearText (boolean linearText)

設置是否打開線性文本標識,這玩意對大多數人來說都很奇怪不知道這玩意什麼意思。想要明白這東西你要先知道文本在Android中是如何進行存儲和計算的。在Android中文本的繪製需要使用一個bitmap作爲單個字符的緩存,既然是緩存必定要使用一定的空間,我們可以通過setLinearText (true)告訴Android我們不需要這樣的文本緩存。

 

setMaskFilter(MaskFilter maskfilter)

setMaskFilter(MaskFilter maskfilter)是paint中的方法,它可以用來對圖像進行一定的處理。如需詳細瞭解,請參考:

詳解Paint的setMaskFilter(MaskFilter maskfilter)

 

setPathEffect(PathEffect effect)

設置繪製路徑的效果,如點畫線等 。如需詳細瞭解,請參考:

詳解Paint的setPathEffect(PathEffect effect)

 

setRasterizer (Rasterizer rasterizer)

設置光柵,光柵這東西涉及太多太多物理知識。該方法同樣不支持HW在API 21中被遺棄了,所以不推薦使用。

 

setShader(Shader shader)

的設置着色方案,Shader在三維軟件中我們稱之爲着色器,其作用是來給圖像着色。詳細使用方式,請參考:

詳解Paint的setShader(Shader shader)

 

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

radius表示陰影的擴散半徑;dx和dy表示陰影平面上的偏移值;shadowColor就不說了陰影顏色。

注意:這個方法不支持硬件加速,所以我們要測試時必須先關閉硬件加速。

該方法爲我們繪製的圖形添加一個陰影層效果:

複製代碼
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 關閉單個view的硬件加速
        setLayerType(LAYER_TYPE_SOFTWARE, null); 
        // 先繪製位圖  
        mPaint.setColor(Color.RED);
        // 設置陰影效果
        mPaint.setShadowLayer(10, 3, 3, Color.DKGRAY);  
        // 畫一個矩形  
        canvas.drawRect(200, 200, 600, 600, mPaint);  
    }
複製代碼

BlurMaskFilter可以模擬類似效果,跟BlurMaskFilter比起來setShadowLayer()方法是不是更簡捷呢?但是BlurMaskFilter能做的setShadowLayer卻不一定能做到哦!

 

setStrokeCap(Paint.Cap cap)

該方法用來設置我們畫筆的筆觸風格,比如:ROUND,表示是圓角的筆觸。那麼什麼叫筆觸呢,其實很簡單,就像我們現實世界中的筆,如果你用圓珠筆在紙上戳一點,那麼這個點一定是個圓,即便很小,它代表了筆的筆觸形狀,如果我們把一支鉛筆筆尖削成方形的,那麼畫出來的線條會是一條彎曲的“矩形”,這就是筆觸的意思。除了ROUND,Paint.Cap還提供了另外兩種類型:SQUARE和BUTT

 

setStrokeJoin(Paint.Join join)

這個方法用於設置接合處的形態,就像你用代碼畫了一條線,但是這條線其實是由無數條小線拼接成的,拼接處的形狀就由該方法指定。可選參數是:BEVEL,MITER,ROUND。

mPaint.setStrokeJoin(Paint.Join.ROUND);

 

setStrokeWidth(float width);

當畫筆樣式(style)爲STROKE或FILL_OR_STROKE時(空心樣式時),設置筆刷的粗細度。

 

setStrokeMiter(float miter )

設置筆畫的傾斜度,取值:>=0。如:小時候用的鉛筆,削的時候斜與垂直削出來的筆尖效果是不一樣的。主要是用來設置筆觸的連接處的樣式。可以和setStrokeJoin()來比較比較。

 
setStyle(Style style)
置畫筆樣式,如果不設置,默認是全部填充(FILL)。可選項爲:FILL,FILL_OR_STROKE,或STROKE 

 畫筆樣式分三種: 
 1.Paint.Style.STROKE:描邊
 2.Paint.Style.FILL_AND_STROKE:描邊並填充 
 3.Paint.Style.FILL:填充

 
setSubpixelText(boolean subpixelText)
 
設置自像素。如果該項爲true,將有助於文本在LCD屏幕上的顯示效果。
 
 
setXfermode(Xfermode xfermode)
設置圖像的混合模式,詳細使用方式請參考:
 

——————————————————————————————————————

注意:下方的方法僅僅是簡要的介紹,如果想要詳細瞭解,請移步:

 

用TextPaint來繪製文字

 

setStrikeThruText (boolean strikeThruText)

設置文本刪除線。

 

setTextAlign (Paint.Align align)

設置文本的對齊方式,可供選的方式有三種:CENTER,LEFT和RIGHT。

 

setTextLocale (Locale locale)

設置地理位置,這裏如果你要使用,直接傳入Locale.getDefault()即可。它用來設置文本的區域比如中文、日文等。

 

setTextScaleX (float scaleX)

將文本沿X軸水平縮放,默認值爲1,當值大於1會沿X軸水平放大文本,當值小於1會沿X軸水平縮放文本

 

setTextSize (float textSize)

設置文字的大小,但是要注意該值必需大於零。

 

setTextSkewX(float skewX)

設置文本在水平方向上的傾斜。這個傾斜值沒有具體的範圍,但是官方推崇的值爲-0.25可以得到比較好的傾斜文本效果,值爲負右傾值爲正左傾,默認值爲0。

 

setTypeface (Typeface typeface)

設置文本字體樣式。

 

setUnderlineText(boolean underlineText)

設置文字的下劃線。

 

 

參考自:

http://www.cnblogs.com/tianzhijiexian/p/4297664.html

http://blog.csdn.net/aigestudio/article/details/41447349

https://code.csdn.net/snippets/505646/

http://bbs.51cto.com/thread-835441-1.html

http://blog.csdn.net/xanxus46/article/details/7883554

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章