編寫自定義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è)帽子一樣,所以叫線帽
如圖所示:
第一個(gè)是無線帽思喊,第二個(gè)是圓形線帽壁酬,第三個(gè)是方形線帽。
(6)設(shè)置線段連接處樣式
setStrokeJoin(Paint.Join join)
如果不設(shè)置setStrokeJoin恨课,那么線段的連接處默認(rèn)是尖角
只有當(dāng)角度太小時(shí)舆乔,Android為了防止尖角的延長(zhǎng)線過長(zhǎng),自己做了處理剂公,尖角變成了平角希俩,如圖:
下面我來說明一下setStrokeJoin的三種樣式:
Join.MITER(結(jié)合處為尖角)
注意:
雖然設(shè)置了拐角處為尖角,但是如果角度太小纲辽,Android依然會(huì)將尖角變成平角颜武。
Join.Round(結(jié)合處為圓弧)
Join.BEVEL(結(jié)合處為平角)
(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。我們來看下圖:
miter >=b / a;
也就是說吊档,當(dāng) b/a<=miter時(shí)篙议,依然顯示尖角,如果b/a > miter怠硼,尖角就會(huì)變成平角鬼贱,這時(shí)a和b也隨之變化趾断。
如果一但從尖角變成平角,那么 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è)置繪制路徑的效果
基本代碼如下:
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是沒有任何效果的笆檀,演示圖如下
下面分別介紹Path效果
-
CornerPathEffect——圓形拐角效果
mPaint.setPathEffect(new CornerPathEffect(50));
利用半徑R=50的圓來代替原來兩條直線間的夾角。
效果如下:
- 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:開始繪制的偏移值。
效果圖如下
如果在onDraw
處添加以下兩句代碼會(huì)產(chǎn)生動(dòng)畫效果
phase ++;
invalidate();
- PathDashPathEffect——虛線效果
和DashPathEffect
類似黔州,也是虛線效果耍鬓,不同的是PathDashPathEffec
t可以讓我們自己定義路徑虛線的樣式阔籽。
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));
添加如上代碼的效果圖如下:
添加一下代碼可以實(shí)現(xiàn)動(dòng)畫效果:
phase ++;
invalidate();
- 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)度苔。
它同樣也能做出動(dòng)畫效果
if(deviation > 10){
deviation = 0;
}
deviation = deviation + 0.02f;
invalidate();
- 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));
效果如下:
- 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));
(14)setXfermode(Xfermode xfermode)
設(shè)置圖形重疊時(shí)的處理方式寇窑,如合并,取交集或并集箩张,經(jīng)常用來制作橡皮的擦除效果甩骏。
(15)setMaskFilter(MaskFilter maskfilter)
設(shè)置MaskFilter,可以用不同的MaskFilter實(shí)現(xiàn)濾鏡的效果先慷,如濾化饮笛,立體等。
如圖所示论熙,有兩種濾鏡需要我們?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)在繪制一張圖片踩验,圖片原始效果如下:
//使用NORMAL樣式
mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.NORMAL));
使用NORMAL樣式的效果圖如下:
//使用SOLID樣式
mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.SOLID));
使用SOLID樣式的效果圖如下:
//使用OUTER樣式
mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.OUTER));
使用OUTER樣式的效果圖如下:
//使用INNER樣式
mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.INNER));
使用INNER樣式的效果圖如下:
-
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);
(16)setColorFilter(ColorFilter colorfilter)(顏色過濾器)
設(shè)置顏色過濾器袭异,可以在繪制顏色時(shí)實(shí)現(xiàn)不用顏色的變換效果。
ColorFilter有三個(gè)子類炬藤,分別是LightingColorFilter
御铃、PorterDuffColorFilter
、ColorMatrixColorFilter
沈矿。
在講解這三種顏色過濾器之前上真,首先對(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三種通道組成,這張圖展示如下:
-
現(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
效果如下:
-
去除綠色
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
效果圖如下:
-
去除藍(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
效果圖如下
- 讓紅色更亮一些
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
效果圖如下
- 讓綠色更亮一些
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
效果圖如下
- 讓藍(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
效果圖如下
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);
效果如下:
如果要清除陰影層,使用
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)了~
[本章完...]