自定義View學習筆記07—Canvas繪制文字
標簽: android 自定義view canvas 繪制文字
這里我們接著上一篇筆記沒有講完的內容:用canvas繪制文字,這個在自定義View尤其是定義線性View的時候作用非常大。
我們還是依照慣例先看看API提供的關于文字繪制的方法:
//第一類:只能指定文本基線位置(基線x默認在字符串左側,基線y默認在字符串下方)
public void drawText(String text, float x, float y, Paint paint)
public void drawText(String text, int start, int end, float x, float y, Paint paint)
public void drawText(char text,int start,int end,float x,float y,Paint paint)
public void drawText(char[]text,int index,int count,float x,float y,Paint paint)
// 第二類:可以分別指定每個文字的位置
public void drawPosText(String text,float[]pos,Paint paint)
public void drawPosText(char[]text,int index,int count,float[]pos, Paint paint)
// 第三類:指定一個路徑,根據路徑繪制文字
public void drawTextOnPath(String text,Path path float hOff, float vOff,Paint paint)
public void drawTextOnPath(char[]text,int index,int count,Path path,float hOff,float vOff,Paint paint)
通過上面常用方法的參數也可看出,繪制文字也是需要畫筆的,而且文字的大小,顏色,字體,對齊方式都是由畫筆控制的。
畫筆Paint關于文本繪制涉及的常用方法:
繪制文本前的準備工作:創建畫筆paint:
private void initPaint(){
Paint mPaint = new Paint();// 創建畫筆
mPaint.setColor(Color.BLUE);// 設置顏色
mPaint.setStrokeWidth(16);//設置畫筆寬度
mPaint.setStyle(Paint.Style.FILL);// 設置樣式
mPaint.setAntiAlias(true);//防鋸齒
mPaint.setTextSize(100);// 設置字體大小
}
在構造方法中調用上述方法。
現在開始正式的文本繪制:
第一類方法drawText:
只能指定文本基線位置,基線x默認在字符串左側,基線y默認在字符串下方。
雖然一共有四個方法,但都大同小異。都是在自定位置顯示指定的字符串,只不過是要顯示的字符串的指定方式不太一樣,僅此而已。
在onDraw()方法中調用以下方法:
private void drawText(Canvas canvas){
String string = "皓月公子";
//文字的繪制以起始坐標左對齊(對齊方式也分左對齊,右對齊和居中對齊,分別對應
//Paint.Align.LEFT/RIGHT/CENTER,跟Office里面的對齊概念是一樣的。)
mPaint.setTextAlign(Paint.Align.LEFT);
Rect rect = new Rect();
//獲取文本所占用的最小矩形并將參數保存在rect中,可以通過rect.height()
//和rect.width()方法獲取,也可以通過rect.left、rect.toprect.left、rect.right
//分別獲取自行計算
mPaint.getTextBounds(string, 0, string.length(), rect);
//指定繪制字符串的起始坐標(300,,150)
canvas.drawText(string, 300, 150, mPaint);
//繪制string里面的起始位置為1,結束位置為3的指定字符串
//指定繪制字符串的起始坐標(300, 300)
canvas.drawText(string, 1, 3, 300, 300, mPaint);
}
運行效果如下:
第二類(drawPosText):
一共有兩個方法,但本質都是一回事:欲繪制的文本類型為String型或者char[]型,并為String型或者char[]型里面的每個字符指定位置坐標。由于要為每個字符指定坐標,是一件很反人類的設計,因此很少用,使用得比較少,理解就行,在此不做深究。
第三類(drawTextOnPath):
這是一個使用得很廣泛的超級大殺器,因為要用到path這個大殺器,當然咯,殺器級別的對象不能很快就上場,必須留點懸念。這個我們稍后細說。
下面看看所繪文字寬度、高度和最小矩形獲取:
注:所繪文字的寬度、高度均小于最小矩形(裝文字的容器)的寬度和高度
A、高度:
Paint.FontMetricsInt fm = paint.getFontMetricsInt();
int top = fm.top; int bottom = fm.bottom;
//所占高度
int heightString = bottom - top;
B、寬度:
//獲取到的是字符串的寬度
float widthString = mPaint.measureText(centerString);
C、最小矩形:
Rect rect = new Rect();
mPaint.getTextBounds(string, 0, string.length(), rect);
int heightView = rect.bottom - rect.top;
int widthView = rect.right - rect.left;
int L = rect.width();
int H = rect.height();
運行代碼得出:heightView = H,widthView = L;如下:
注意:
a、上面的數據中,文字的寬度widthString < 最小矩形的寬度widthView(L),文字的高度heightString <最小矩形的高度heightView(H);
b、以上代碼是基于文本繪制時基線為默認值時測出的,如果自定義View過程中設置了基線baseLineX、baseLineY,在計算的時候,應考慮基線參數:
//畫text所占的區域,baseLineY 為int型數據
Paint.FontMetricsInt fm = paint.getFontMetricsInt();
int top = baseLineY + fm.top;
int bottom = baseLineY + fm.bottom;
int width = (int)paint.measureText(text);
Rect rect = new Rect(baseLineX,top,baseLineX+width,bottom);
paint.setColor(Color.GREEN);
canvas.drawRect(rect,paint);
//畫最小矩形
Rect minRect = new Rect();
paint.getTextBounds(text,0,text.length(),minRect);
minRect.top = baseLineY + minRect.top;
minRect.bottom = baseLineY + minRect.bottom;
paint.setColor(Color.RED);
canvas.drawRect(minRect,paint);
Canvas繪制文字的學習暫告一段落。
智能推薦
Android筆記 自定義View(六):Canvas使用之繪制圖片
本章看下Canvas繪制位圖相關內容 目錄 一、繪制位圖(drawBitmap) ?二、繪制矢量圖(drawPicture) 三、總結 一、drawBitmap 繪制bitamp方法說明: java代碼: 效果: drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)方法是通過矩陣對圖片進行一些變換處理。如下: 以上是Mat...
自定義view(二)canvas與圖形繪制
自定義控件過程中,經常需要手動繪制一些圖片,文字,圖形,點,線等元素,就像畫畫需要畫布和畫筆,在程序中,canvas即畫布,paint即畫筆,畫布有自己的一些 屬性,畫筆也有自己的一些屬性。 Canvas的常用操作匯總: 畫布的主要操作 1.translate(位移) translate是坐標系移動,連續移動時,并非從原點(0,0),而是每一次移動都會相應移動坐標系,也就是以上一次移動停止的位置作...
Andorid自定義View-Canvas之畫布操作(學習筆記)
注明: 非常感謝 gcssloop 的博客,以下為我學習時的筆記記錄。 Canvas常用速查表 操作類型 相關API 備注 繪制顏色 drawColor, drawRGB, drawARGB 使用單一顏色填充整個畫布 繪制基本形狀 drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawO...
自定義View學習筆記05—Canvas下操作畫布
為什么要有畫布操作? 疑問======>>>以默認的坐標系圓點為起點,畫一條與X軸呈45°的射線,你會怎么操作? 以常規的數學思路來看,先使用三角函數計算出射線上任一點的坐標,然后調用drawLine即可。 有沒有更加簡單的方法?這個問題留在本筆記最后來解答。 現在進入操作畫布的主題: 1、位移translate(float dx, float dy): 注意:這里的位移...
猜你喜歡
自定義View學習⑤canvas變換與操作
旗艦大神開篇說這篇文章不太好理解。粗略的看了一下,我覺得還相對比較容易理解。 一、平移(translate) 在動畫里面也有這個操作 canvas中有一個函數translate()是用來實現畫布平移的,畫布的原狀是以左上角為原點,向左是X軸正方向,向下是Y軸正方向,如下圖所示 translate函數其實實現的相當于平移坐標系,即平移坐標系的原點的位置。translate()函數的原型如下: voi...
Android自定義View學習四---Canvas畫布操作
Canvas之畫布操作 內容來自:安卓自定義View進階-Canvas之畫布操作 基本操作 位移 translate是坐標系的移動,位移是基于當前位置移動,而不是每次基于屏幕左上角的(0,0)點移動 縮放(scale) 縮放提供了兩個方法,如下: 縮放的中心默認為坐標原點,而縮放中心軸就是坐標軸,第二個方法的px和py,用來控制縮放中心位置 使用第二種方法讓縮放中心位置稍微改變一下,如下: 當縮放...
自定義View學習筆記(一)
1.1 直方圖的繪制方法 首先要了解畫這個直方圖所需要哪些步驟。 1.中間的“直方圖字樣” 2.X,Y軸線 3.樣式相同的直方圖塊 首先是畫“直方圖”字樣,需要的是drawText方法,它的位置處于中下方,那么就很好畫出來。 接下來是X,Y軸,使用drawLine方法畫線。 最后就是圖塊了,這里需要計算每個圖塊的寬度和間隔的距離。再使用drawRec...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...