高級(jí)UI<第十四篇>:Paint基本使用

編寫自定義View必然會(huì)在onDraw(Canvas canvas)方法里面實(shí)現(xiàn)忍弛,Canvas是圖層荡澎,用來顯示圖像庭瑰,而圖像的形成是由一個(gè)畫筆勾勒出來的,這里所說的畫筆就是Paint碳想。

(1)構(gòu)造方法和flag標(biāo)志
//創(chuàng)建默認(rèn)設(shè)置的畫筆
public Paint() 
//創(chuàng)建指定標(biāo)記的畫筆烧董,類似于給畫筆取了個(gè)名字
public Paint(int flags) 
//創(chuàng)建和現(xiàn)有畫筆屬性相同的畫筆
public Paint(Paint paint) 

其中第二個(gè)構(gòu)造方法的參數(shù)flags代表Paint標(biāo)志,下面列出Paint的標(biāo)志(這個(gè)一般只要了解就行了胧奔,開發(fā)中Paint標(biāo)志用到的很少逊移,大部分)

//抗鋸齒標(biāo)志,對(duì)應(yīng)的方法是mPaint.setAntiAlias(true)龙填,一些圖畫出來之后可以很明顯的看出鋸齒的存在胳泉,加上這句話可以基本消除鋸齒
public static final int ANTI_ALIAS_FLAG = 1;
//使位圖過濾的位掩碼標(biāo)志(對(duì)位圖進(jìn)行濾波),對(duì)應(yīng)的方法是mPaint.setFilterBitmap(true)岩遗,可以消除bitmap的濾波
public static final int FILTER_BITMAP_FLAG = 2;
//使位圖進(jìn)行有利的抖動(dòng)的位掩碼標(biāo)志(抖動(dòng)處理)扇商,對(duì)應(yīng)的方法是mPaint.setDither(true),可以讓圖像看起來更加柔和
public static final int DITHER_FLAG = 4;
//給文字添加下劃線喘先,對(duì)應(yīng)的方法是mPaint.setUnderlineText(true)
public static final int UNDERLINE_TEXT_FLAG = 8;
//給文字添加刪除線钳吟,對(duì)應(yīng)的方法是mPaint.setStrikeThruText(true)
public static final int STRIKE_THRU_TEXT_FLAG = 16;
//文字加粗,對(duì)應(yīng)的方法是mPaint1.setFakeBoldText(true)
public static final int FAKE_BOLD_TEXT_FLAG = 32;
//使文本平滑線性擴(kuò)展的油漆標(biāo)志
public static final int LINEAR_TEXT_FLAG = 64;
//使文本的亞像素定位的繪圖標(biāo)志
public static final int SUBPIXEL_TEXT_FLAG = 128;
//遺棄的畫筆標(biāo)志窘拯,不用管
public static final int DEV_KERN_TEXT_FLAG = 256;
//繪制文本時(shí)允許使用位圖字體的繪圖標(biāo)志
public static final int EMBEDDED_BITMAP_TEXT_FLAG = 1024;
//畫筆隱藏模式關(guān)閉
public static final int HINTING_OFF = 0;
//畫筆隱藏模式打開
public static final int HINTING_ON = 1;
(2)設(shè)置畫筆的樣式
setStyle(Paint.Style style) 

設(shè)置畫筆樣式红且,取值有

Paint.Style.FILL :填充內(nèi)部
Paint.Style.FILL_AND_STROKE :填充內(nèi)部和描邊
Paint.Style.STROKE :僅描邊、
(3)設(shè)置畫筆的寬度
setStrokeWidth(float width) 
(4)設(shè)置畫筆是否抗鋸齒
setAntiAlias(boolean aa) 
(5)設(shè)置線冒樣式
setStrokeCap(Paint.Cap cap)

設(shè)置線冒樣式涤姊,取值有

Cap.ROUND(圓形線冒)
Cap.SQUARE(方形線冒)
Paint.Cap.BUTT(無線冒) 

注意:冒多出來的那塊區(qū)域就是線帽暇番!就相當(dāng)于給原來的直線加上一個(gè)帽子一樣,所以叫線帽

如圖所示:

圖片.png

第一個(gè)是無線帽思喊,第二個(gè)是圓形線帽壁酬,第三個(gè)是方形線帽。

(6)設(shè)置線段連接處樣式
setStrokeJoin(Paint.Join join)

如果不設(shè)置setStrokeJoin恨课,那么線段的連接處默認(rèn)是尖角


圖片.png

只有當(dāng)角度太小時(shí)舆乔,Android為了防止尖角的延長(zhǎng)線過長(zhǎng),自己做了處理剂公,尖角變成了平角希俩,如圖:

圖片.png

下面我來說明一下setStrokeJoin的三種樣式:

Join.MITER(結(jié)合處為尖角)
圖片.png

注意: 雖然設(shè)置了拐角處為尖角,但是如果角度太小纲辽,Android依然會(huì)將尖角變成平角颜武。

Join.Round(結(jié)合處為圓弧)
圖片.png
Join.BEVEL(結(jié)合處為平角) 
圖片.png
(7)設(shè)置 MITER 型拐角的延長(zhǎng)線的最大值

這個(gè)方法是對(duì)于 setStrokeJoin() 的一個(gè)補(bǔ)充,它用于設(shè)置 MITER 型拐角的延長(zhǎng)線的最大值拖吼。(如果沒有設(shè)置setStrokeJoin鳞上,則拐角默認(rèn)是尖角)

setStrokeMiter(float miter) 

miter的默認(rèn)值是4。我們來看下圖:

圖片.png
miter >=b / a;

也就是說吊档,當(dāng) b/a<=miter時(shí)篙议,依然顯示尖角,如果b/a > miter怠硼,尖角就會(huì)變成平角鬼贱,這時(shí)a和b也隨之變化趾断。

圖片.png

如果一但從尖角變成平角,那么 miter = b / a吩愧。

當(dāng)我們?cè)O(shè)置miter時(shí)芋酌,比如:從默認(rèn)值4改成2

    mPaint.setStrokeMiter(2);

那么miter =2, b / a的最大值就是2雁佳,如果 b / a超過2脐帝,那么尖角就會(huì)變成平角。

(8)清空畫筆復(fù)位
void reset() 

重置 Paint 的所有屬性為默認(rèn)值糖权。相當(dāng)于重新 new 一個(gè)堵腹。

(9)設(shè)置一個(gè)外來Paint畫筆
void set(Paint src) 
(10)獲取與設(shè)置alpha值、顏色星澳、ARGB
setARGB(int a, int r, int g, int b) 
getAlpha() 
setAlpha(int a) 
getColor() 
setColor(int color)
(11)獲取與設(shè)置是否使用抗鋸齒功能
isAntiAlias() 
setAntiAlias(boolean aa) 

會(huì)消耗較大資源疚顷,繪制圖形速度會(huì)變慢,一般會(huì)開啟禁偎。設(shè)置后會(huì)平滑一些
final boolean isDither()

(12)獲取與設(shè)定是否使用圖像抖動(dòng)處理
setDither(boolean dither) 

會(huì)使繪制出來的圖片顏色更加平滑和飽滿腿堤、圖像更加清晰。

(13)setPathEffect(PathEffect effect)

設(shè)置繪制路徑的效果

圖片.png

基本代碼如下:

    setLayerType(View.LAYER_TYPE_SOFTWARE, null);//關(guān)閉硬件加速

    mPaint.setColor(Color.BLACK);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(5);

    canvas.drawLine(0, 200, canvas.getWidth(), 200, mPaint);
    canvas.drawLine(200, 0, 200, canvas.getHeight(), mPaint);

    canvas.translate(200, 200);//將畫布移動(dòng)到(100如暖,100)位置

    mPaint.setPathEffect(new PathEffect());
    mPaint.setColor(Color.BLUE);

    Path path = new Path();
    path.moveTo(-180, 50);
    path.lineTo(-150, -50);
    path.lineTo(-120, -10);
    path.lineTo(-100, -70);
    path.lineTo(-80, -40);
    path.lineTo(-40, 10);
    path.lineTo(-20, -10);
    path.lineTo(0, 50);
    path.lineTo(20, -20);
    path.lineTo(50, 70);
    path.lineTo(100, 10);
    path.lineTo(120, -10);
    path.lineTo(150, 60);
    path.lineTo(200, -70);
    path.lineTo(220, -10);
    path.lineTo(250, 0);
    path.lineTo(280, -70);
    path.lineTo(300, 70);
    path.lineTo(330, 10);
    path.lineTo(360, -100);
    path.lineTo(380, 10);
    path.lineTo(400, -70);
    canvas.drawPath(path, mPaint);

    mPaint.reset();

此時(shí)Path是沒有任何效果的笆檀,演示圖如下

圖片.png

下面分別介紹Path效果

  • CornerPathEffect——圓形拐角效果

      mPaint.setPathEffect(new CornerPathEffect(50));
    

    利用半徑R=50的圓來代替原來兩條直線間的夾角。

效果如下:

圖片.png
  • DashPathEffect——虛線效果
//畫同一條線段,偏移值為phase  
mPaint.setPathEffect(new DashPathEffect(new float[]{10,5,6,15},phase));

intervals[]:表示組成虛線的各個(gè)線段的長(zhǎng)度盒至;整條虛線就是由intervals[]中這些基本線段循環(huán)組成的酗洒。比如,我們定義new float[] {20,10}枷遂;那這個(gè)虛線段就是由兩段線段組成的樱衷,第一個(gè)可見的線段長(zhǎng)為20,每二個(gè)線段不可見酒唉,長(zhǎng)度為10矩桂;
phase:開始繪制的偏移值。

效果圖如下

圖片.png

如果在onDraw處添加以下兩句代碼會(huì)產(chǎn)生動(dòng)畫效果

    phase ++;
    invalidate();
3.gif
  • PathDashPathEffect——虛線效果

DashPathEffect類似黔州,也是虛線效果耍鬓,不同的是PathDashPathEffect可以讓我們自己定義路徑虛線的樣式阔籽。

PathDashPathEffect(Path shape, float advance, float phase, Style style)

shape:虛線點(diǎn)的填充圖形
advance:shape和shape之間的間隔
phase:開始繪制的偏移量流妻,結(jié)合invalidate()同樣有動(dòng)畫效果
style:虛線連接處的樣式,現(xiàn)有三種樣式
PathDashPathEffect.Style.MORPH: 圖形會(huì)以發(fā)生拉伸或壓縮等變形的情況與下一段相連接
PathDashPathEffect.Style.ROTATE: 線段連接處的圖形轉(zhuǎn)換以旋轉(zhuǎn)到與下一段移動(dòng)方向相一致的角度進(jìn)行連接
PathDashPathEffect.Style.TRANSLATE: 圖形會(huì)以位置平移的方式與下一段相連接

DashPathEffect可以設(shè)置虛線不同線段的長(zhǎng)度笆制,但是PathDashPathEffect不行绅这,PathDashPathEffect的優(yōu)勢(shì)在于可以設(shè)置虛線的圖形。

    Path shape = new Path();
    RectF rectF = new RectF();
    rectF.left = 0;
    rectF.top = 0;
    rectF.right = 10;
    rectF.bottom = 10;
    shape.addCircle(0, 0, 5, Path.Direction.CW);
    mPaint.setPathEffect(new PathDashPathEffect(shape, 20, phase, PathDashPathEffect.Style.TRANSLATE));

添加如上代碼的效果圖如下:

圖片.png

添加一下代碼可以實(shí)現(xiàn)動(dòng)畫效果:

    phase ++;
    invalidate();
4.gif
  • DiscretePathEffect——離散路徑效果
DiscretePathEffect(float segmentLength, float deviation)

其構(gòu)造方法有兩個(gè)參數(shù):

segmentLength: 每隔segmentLength都會(huì)有一個(gè)突出點(diǎn)在辆;

deviation: 突出點(diǎn)的偏移量证薇;

mPaint.setPathEffect(new DiscretePathEffect(3, 10));

每隔距離為3的地方都會(huì)出現(xiàn)偏移量為10的突出點(diǎn)度苔。

圖片.png

它同樣也能做出動(dòng)畫效果

    if(deviation > 10){
        deviation = 0;
    }

    deviation = deviation + 0.02f;

    invalidate();
5.gif
  • ComposePathEffect——組合路徑效果
ComposePathEffect(PathEffect outerpe, PathEffect innerpe)

組合方式是:先將路徑變成innerpe的效果,再去復(fù)合outerpe的路徑效果浑度,即:outerpe(innerpe(Path))

    PathEffect dashPathEffect= new DashPathEffect(new float[]{10,5,6,15},5);

    PathEffect discretePathEffect = new DiscretePathEffect(3, 10);

    mPaint.setPathEffect(new ComposePathEffect(dashPathEffect, discretePathEffect));

效果如下:

圖片.png
  • SumPathEffect——疊加路徑效果
SumPathEffect(PathEffect first, PathEffect second)

組合方式是:將兩種合二為一

    PathEffect dashPathEffect= new DashPathEffect(new float[]{10,5,6,15},5);

    PathEffect discretePathEffect = new DiscretePathEffect(3, 10);

    mPaint.setPathEffect(new SumPathEffect(dashPathEffect, discretePathEffect));
圖片.png
(14)setXfermode(Xfermode xfermode)

設(shè)置圖形重疊時(shí)的處理方式寇窑,如合并,取交集或并集箩张,經(jīng)常用來制作橡皮的擦除效果甩骏。

高級(jí)UI<第十六篇>:Xfermode 詳解

(15)setMaskFilter(MaskFilter maskfilter)

設(shè)置MaskFilter,可以用不同的MaskFilter實(shí)現(xiàn)濾鏡的效果先慷,如濾化饮笛,立體等。

圖片.png

如圖所示论熙,有兩種濾鏡需要我們?nèi)?shí)驗(yàn)

  • BlurMaskFilter-----模糊遮罩濾鏡 (改變圖像的透明度值來實(shí)現(xiàn)的)
BlurMaskFilter(float radius, Blur style)

radius: 半徑從原始遮罩延伸模糊的半徑福青;
style: 模糊樣式;

模糊樣式可分為以下四種:

NORMAL: 在原始邊界內(nèi)外模糊脓诡。
SOLID: 在邊界內(nèi)繪制實(shí)體无午,在邊界外模糊。
OUTER: 在邊界內(nèi)不繪制任何內(nèi)容祝谚,在邊界外模糊指厌。
INNER: 在邊界內(nèi)模糊,在邊界外不繪制任何內(nèi)容踊跟。

現(xiàn)在繪制一張圖片踩验,圖片原始效果如下:

圖片.png
//使用NORMAL樣式
mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.NORMAL));

使用NORMAL樣式的效果圖如下:

圖片.png
//使用SOLID樣式
mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.SOLID));

使用SOLID樣式的效果圖如下:

圖片.png
//使用OUTER樣式
mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.OUTER));

使用OUTER樣式的效果圖如下:

圖片.png
//使用INNER樣式
mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.INNER));

使用INNER樣式的效果圖如下:

圖片.png
  • EmbossMaskFilter----浮雕遮罩濾鏡(類似于燈光照射效果)

      //指定光源的位置,長(zhǎng)度為xxx的數(shù)組標(biāo)量[x,y,z]
      float[] direction = new float[] { 1, 1, 1 };
      // 環(huán)境光的因子 (0~1)商玫,越接近0箕憾,環(huán)境光越暗
      float light = .03f;
      // 鏡面反射系數(shù) 越接近0,鏡面反射越強(qiáng)
      float specular = 60;
      //模糊半徑 值越大拳昌,模糊效果越明顯
      float blur = 80f;
    
      EmbossMaskFilter emboss = new EmbossMaskFilter(direction, light, specular, blur);
      mPaint.setMaskFilter(emboss);
      canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.pic_shi), 0, 0, mPaint);
    
圖片.png
(16)setColorFilter(ColorFilter colorfilter)(顏色過濾器)

設(shè)置顏色過濾器袭异,可以在繪制顏色時(shí)實(shí)現(xiàn)不用顏色的變換效果。

ColorFilter有三個(gè)子類炬藤,分別是LightingColorFilter御铃、PorterDuffColorFilterColorMatrixColorFilter沈矿。

在講解這三種顏色過濾器之前上真,首先對(duì)RGB和ARGB做個(gè)普及。

顏色有三個(gè)通道羹膳,分別是R(紅色)睡互、G(綠色)、B(藍(lán)色),在Android中就珠,我們通常使用16進(jìn)制表示一個(gè)RBG寇壳,比如:
紅色:#ff0000
綠色:#00ff00
藍(lán)色:#0000ff
黃色:#ffff00

該16進(jìn)制有6為,前兩位代表紅色通道妻怎,中間兩位代表綠色通道壳炎,后面兩位代表藍(lán)色通道。

如果加上透明度的話逼侦,就是所謂的ARGB冕广,ARGB中的A是alpha(透明度)的意思,用8位16進(jìn)制表示偿洁,比如:

100%透明度的紅色:#ffff0000
0%透明度的紅色:#00ff0000

其中前兩位代表透明度撒汉,#ff代表不透明,#00代表完全透明涕滋。

關(guān)于透明度和對(duì)應(yīng)的顏色值睬辐,請(qǐng)看下表

透明度 顏色(16進(jìn)制)
100% FF
95% F2
90% E6
85% D9
80% CC
75% BF
70% B3
65% A6
60% 99
55% 8C
50% 80
45% 73
40% 66
35% 59
30% 4D
25% 40
20% 33
15% 26
10% 1A
5% 0D
0% 00

下面開始講解三種顏色過濾器。

  • LightingColorFilter

這個(gè) LightingColorFilter 是用來模擬簡(jiǎn)單的光照效果的宾肺。其構(gòu)造方法如下:

LightingColorFilter(@ColorInt int mul, @ColorInt int add)

創(chuàng)建一個(gè)顏色過濾器溯饵,將RGB通道乘以一種顏色,然后添加第二種顏色锨用。mul和add的alpha分量參數(shù)被忽略丰刊。

【解析開始】:

假如有一張圖,這張圖的色彩由R增拥、G啄巧、B三種通道組成,這張圖展示如下:

圖片.png
  1. 現(xiàn)在我想去除紅色

    mPaint.setColorFilter(new LightingColorFilter(Color.parseColor("#00ffff"), Color.parseColor("#000000")));

其計(jì)算方式如下:

R' = R * 0x00 / 0xff + 0x0 = R  
G' = G * 0xff / 0xff + 0x0 = G 
B' = B * 0xff / 0xff + 0x0 = B 

效果如下:

圖片.png
  1. 去除綠色

    mPaint.setColorFilter(new LightingColorFilter(Color.parseColor("#ff00ff"), Color.parseColor("#000000")));

其計(jì)算方式如下:

R' = R * 0xff / 0xff + 0x0 = R  
G' = G * 0x00 / 0xff + 0x0 = G 
B' = B * 0xff / 0xff + 0x0 = B 

效果圖如下:

圖片.png
  1. 去除藍(lán)色

    mPaint.setColorFilter(new LightingColorFilter(Color.parseColor("#ffff00"), Color.parseColor("#000000")));

其計(jì)算方式如下:

R' = R * 0xff / 0xff + 0x0 = R  
G' = G * 0xff / 0xff + 0x0 = G 
B' = B * 0x00 / 0xff + 0x0 = B 

效果圖如下

圖片.png
  1. 讓紅色更亮一些
mPaint.setColorFilter(new LightingColorFilter(Color.parseColor("#ffffff"), Color.parseColor("#300000")));

其計(jì)算方式如下:

R' = R * 0xff / 0xff + 0x30 = R  
G' = G * 0xff / 0xff + 0x0 = G 
B' = B * 0xff / 0xff + 0x0 = B 

效果圖如下

圖片.png
  1. 讓綠色更亮一些
mPaint.setColorFilter(new LightingColorFilter(Color.parseColor("#ffffff"), Color.parseColor("#003000")));

其計(jì)算方式如下:

R' = R * 0xff / 0xff + 0x0 = R  
G' = G * 0xff / 0xff + 0x30 = G 
B' = B * 0xff / 0xff + 0x0 = B 

效果圖如下

圖片.png
  1. 讓藍(lán)色更亮一些
mPaint.setColorFilter(new LightingColorFilter(Color.parseColor("#ffffff"), Color.parseColor("#000030")));

其計(jì)算方式如下:

R' = R * 0xff / 0xff + 0x0 = R  
G' = G * 0xff / 0xff + 0x0 = G 
B' = B * 0xff / 0xff + 0x30 = B 

效果圖如下

圖片.png
  • PorterDuffColorFilter
mPaint.setColorFilter(new PorterDuffColorFilter(Color.parseColor("#ff0000"), PorterDuff.Mode.ADD));
canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.pic_shi), 0, 0, mPaint);

這個(gè) PorterDuffColorFilter 的作用是使用一個(gè)指定的顏色和一種指定的 PorterDuff.Mode 來與繪制對(duì)象進(jìn)行合成掌栅。它的構(gòu)造方法是 PorterDuffColorFilter(int color, PorterDuff.Mode mode) 其中的 color 參數(shù)是指定的顏色秩仆, mode 參數(shù)是指定的 Mode。同樣也是 PorterDuff.Mode 猾封,不過和 ComposeShader 不同的是澄耍,PorterDuffColorFilter 作為一個(gè) ColorFilter,只能指定一種顏色作為源晌缘,而不是一個(gè) Bitmap齐莲。

有關(guān)PorterDuff.Mode的使用可以參考:高級(jí)UI<第十六篇>:Xfermode 詳解

  • ColorMatrixColorFilter

ColorMatrixColorFilter 使用一個(gè) ColorMatrix 來對(duì)顏色進(jìn)行處理。 ColorMatrix 這個(gè)類磷箕,內(nèi)部是一個(gè) 4x5 的矩陣:

[ a, b, c, d, e,
  f, g, h, i, j,
 k, l, m, n, o,
 p, q, r, s, t ]

通過計(jì)算选酗, ColorMatrix 可以把要繪制的像素進(jìn)行轉(zhuǎn)換。對(duì)于顏色 [R, G, B, A] 搀捷,轉(zhuǎn)換算法是這樣的:

R’ = a*R + b*G + c*B + d*A + e;  
G’ = f*R + g*G + h*B + i*A + j;  
B’ = k*R + l*G + m*B + n*A + o;  
A’ = p*R + q*G + r*B + s*A + t; 

具體可以參考這篇博客高級(jí)UI<第十八篇>:圖像處理之顏色矩陣

(17)setShader(Shader shader)(著色器星掰、渲染器)

有關(guān)設(shè)置Android渲染器,請(qǐng)參考我的另外幾篇博客
高級(jí)UI<第十九篇>:Android之高級(jí)渲染Shader
高級(jí)UI<第二十篇>:使用LinearGradient實(shí)現(xiàn)文字輪播
高級(jí)UI<第二十一篇>:使用SweepGradient實(shí)現(xiàn)雷達(dá)掃描效果

(18)setShadowLayer(float radius ,float dx,float dy,int color);

在圖形下面設(shè)置陰影層嫩舟,產(chǎn)生陰影效果氢烘,radius為陰影的模糊范圍,dx和dy為陰影的偏移量家厌,color為陰影的顏色 播玖。

    mPaint.setShadowLayer(50, 0, 0, Color.RED);

效果如下:

圖片.png

如果要清除陰影層,使用

    mPaint.clearShadowLayer();

需要特別注意的是:

  • 在硬件加速開啟的情況下饭于, setShadowLayer() 只支持文字的繪制蜀踏,文字之外的繪制必須關(guān)閉硬件加速才能正常繪制陰影。
  • 如果 shadowColor 是半透明的掰吕,陰影的透明度就使用 shadowColor 自己的透明度果覆;而如果 shadowColor 是不透明的,陰影的透明度就使用 paint 的透明度殖熟。
(19)文字相關(guān)

文字相關(guān)的比較簡(jiǎn)單局待,這里就不一一介紹了。

float getFontSpacing() 
獲取字符行間距菱属。

float getLetterSpacing() 
void setLetterSpacing(float letterSpacing) 
設(shè)置和獲取字符間距
        
final boolean isUnderlineText() 
void setUnderlineText(boolean underlineText) 
是否有下劃線和設(shè)置下劃線钳榨。

final boolean isStrikeThruText() 
void setStrikeThruText(boolean strikeThruText) 
獲取與設(shè)置是否有文本刪除線。
        
float getTextSize() 
void setTextSize(float textSize) 
獲取與設(shè)置文字大小纽门,注意:Paint.setTextSize傳入的單位是px薛耻,TextView.setTextSize傳入的單位是sp,注意使用時(shí)不同分辨率處理問題赏陵。
        
Typeface getTypeface() 
Typeface setTypeface(Typeface typeface) 
獲取與設(shè)置字體類型饼齿。Android默認(rèn)有四種字體樣式:BOLD(加粗)、BOLD_ITALIC(加粗并傾斜)蝙搔、ITALIC(傾斜)候醒、NORMAL(正常),我們也可以通過Typeface類來自定義個(gè)性化字體杂瘸。
        
float getTextSkewX() 
void setTextSkewX(float skewX) 
獲取與設(shè)置文字傾斜倒淫,參數(shù)沒有具體范圍,官方推薦值為-0.25败玉,值為負(fù)則右傾敌土,為正則左傾,默認(rèn)值為0运翼。
        
Paint.Align getTextAlign() 
void setTextAlign(Paint.Align align) 
獲取與設(shè)置文本對(duì)齊方式返干,取值為CENTER、LEFT血淌、RIGHT矩欠,也就是文字繪制是左邊對(duì)齊财剖、右邊還是局中的。

setSubpixelText(boolean subpixelText)
設(shè)置自像素癌淮。如果該項(xiàng)為true躺坟,將有助于文本在LCD屏幕上的顯示效果。
固定的幾個(gè)范圍:320*480乳蓄,480*800咪橙,720*1280,1080*1920等等虚倒;那么如何在同樣的分辨率的顯示器中增強(qiáng)顯示清晰度呢美侦?
亞像素的概念就油然而生了,亞像素就是把兩個(gè)相鄰的兩個(gè)像素之間的距離再細(xì)分魂奥,再插入一些像素菠剩,這些通過程序加入的像素就是亞像素。在兩個(gè)像素間插入的像素個(gè)數(shù)是通過程序計(jì)算出來的耻煤,一般是插入兩個(gè)赠叼、三個(gè)或四個(gè)。
所以打開亞像素顯示违霞,是可以在增強(qiáng)文本顯示清晰度的嘴办,但由于插入亞像素是通過程序計(jì)算而來的,所以會(huì)耗費(fèi)一定的計(jì)算機(jī)性能买鸽。
        
int breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth) 
比如文本閱讀器的翻頁效果涧郊,我們需要在翻頁的時(shí)候動(dòng)態(tài)折斷或生成一行字符串,這就派上用場(chǎng)了~

[本章完...]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末眼五,一起剝皮案震驚了整個(gè)濱河市妆艘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌看幼,老刑警劉巖批旺,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異诵姜,居然都是意外死亡汽煮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門棚唆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暇赤,“玉大人,你說我怎么就攤上這事宵凌⌒遥” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵瞎惫,是天一觀的道長(zhǎng)溜腐。 經(jīng)常有香客問我译株,道長(zhǎng),這世上最難降的妖魔是什么挺益? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任歉糜,我火速辦了婚禮,結(jié)果婚禮上矩肩,老公的妹妹穿的比我還像新娘现恼。我一直安慰自己肃续,他們只是感情好黍檩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著始锚,像睡著了一般刽酱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞧捌,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天棵里,我揣著相機(jī)與錄音,去河邊找鬼姐呐。 笑死殿怜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的曙砂。 我是一名探鬼主播头谜,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鸠澈!你這毒婦竟也來了柱告?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤笑陈,失蹤者是張志新(化名)和其女友劉穎际度,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涵妥,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乖菱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蓬网。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片块请。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拳缠,靈堂內(nèi)的尸體忽然破棺而出墩新,到底是詐尸還是另有隱情,我是刑警寧澤窟坐,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布海渊,位于F島的核電站绵疲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏臣疑。R本人自食惡果不足惜盔憨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讯沈。 院中可真熱鬧郁岩,春花似錦、人聲如沸缺狠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挤茄。三九已至如叼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間穷劈,已是汗流浹背笼恰。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歇终,地道東北人社证。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像评凝,于是被迫代替她去往敵國和親追葡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345