1. 實作字型垂直居中
(1)x 軸居中:
x軸居中.png
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//拿到字元串的寬度
float stringWidth = mPaint.measureText(text);
float x =(getWidth()-stringWidth)/2;
canvas.drawText(text, x ,getHeight()/2 ,mPaint);
}
利用measureText(String text)這個方法,很容易拿到要繪制文字的寬度,再根據(getWidth()-stringWidth)/2簡單計算,就可以得到在X軸起始繪制坐标
(2)y 軸居中:
image.png
想要在Y軸居中,就要确定出繪制文字baseline時的所在Y軸的坐标。
在Android中,和文字高度相關的資訊都存在FontMetrics對象中。
确定 Y軸 中心:
y軸位置确定圖.png
由于文字繪制是從baseline開始,是以想要文字的正中心和DrawTextView的中心重合,baseline就不能和getHeight()/2重合,而且baseline要在getHeight()/2下方。
但要在下方多少?就是2号線和3号線之間的距離。
|ascent|=descent+ 2 * ( 2号線和3号線之間的距離 )
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 文字的x軸位置
float stringWidth = paint.measureText(text);
float x =(getWidth()-stringWidth)/2;
//文字的y軸坐标
Paint.FontMetrics fontMetrics = paint.getFontMetrics();
float y = getHeight() / 2 + (Math.abs(fontMetrics.ascent) - fontMetrics.descent) / 2;
canvas.drawText(text, x ,y ,paint);
}
2. 其他方法
2.1 setTextAlign(Align align) 設定對齊方式
Paint.Align.LEFT 左對齊
Paint.Align.CENTER 中心對齊,繪制從
Paint.Align.RIGHT 右對齊
這個方法影響的是兩端的繪制起始。LEFT就是從左端開始,是以使用這三個屬性時,在drawText(test,x,y,paint);要注意x坐标,否則,繪制會出現錯亂
LEFT對應0,CENTER對應getWidth()/2, RIGHT對應getWidth()
2.2 setStyle() 設定畫筆樣式
Paint.Style.FILL 隻繪制圖形内容
Paint.Style.STROKE 隻繪制圖形輪廓(描邊)
Paint.Style.FILL_AND_STROKE 既繪制輪廓也繪制内容
Paint.Style.STROKE.png
2.3 setFlags(int flags) 設定畫筆的flag
ANTI_ALIAS_FLAG 抗鋸齒
DITHER_FLAG 防抖動
2.4 PathEffect setPathEffect(PathEffect effect) 設定路徑效果
7種路徑效果.png
需要注意的是,繪制路徑時,pathPaint.setStyle(Paint.Style.STROKE)畫筆的風格要空心,否則,後果畫出的不是線,而是一個不規則的區域。
這7種路徑效果,暫時還不能區分,先暫時知道有這麼7種效果,等到實作具體需求了再深入了解
CornerPathEffect 拐角處變圓滑
DashPathEffect 可以用來繪制虛線,用一個數組來設定各個點之間的間隔,phase控制繪制時數組的偏移量
PathDashPathEffect 和DashPathEffect類似 ,可以設定顯示的點的圖形,例如圓形的點
DisCreatePathEffect 線段上會有許多雜點
ComposePathEffect 組合兩個PathEffect,将兩個組合成一個效果
3 其他
剩下的方法,試一下就曉得效果了
setTextScaleX(float f) 設定縮放,0f到1f為縮小,大于1f為放大
setUnderlineText(booelan b) 設定下劃線
setStrikeThruText (boolean strikeThruText) 設定文本删除線
setTextSize(float f) 設定文字字型大小
getFontSpacing()得到行間距
descent()得到descent的值
ascent() 得到asccent的值
getLetterSpacing() 字母間距
關于字型的常用的方法差不多就這些了。漏掉的,用到了再補充。