需求:
- 實現將文字轉換爲圖片。
- 圖片爲聊天框形式。
- 用戶可以選擇文字字體,選擇顏色。
- 聊天框自適應文字。
實現方法:
- 方案一:使用canvas繪製圖片,使用staticLayout自動換行繪製文字,聊天框採取canvas畫一個矩形,讓矩形自適應文字
- 方案二:使用canvas繪製圖片,使用StaticLayout自動換行繪製文字,聊天框採取氣泡形狀圖片背景,圖片自適應文字。
方案一
1.學習canvans
首先放幾個寫的很好的博客
- canvans之繪製基本形狀。其中包括用canvans去繪製顏色,用畫筆繪製點,線,形狀。介紹的十分詳細。
- Canvans的畫布操作 。這裏主要講解了canvans的兩個函數:translate(位移)與scale(縮放)。
- Canvans之文字圖片
- 在Canvans上繪製圓角矩形並添加文字
- Android字體度量(FontMetrics)
需求中需要繪製矩形,所以詳細寫一下繪製圓角矩形。首先是繪製矩形,其中包含五個參數,分別是矩形的左右上下與繪製所用的畫筆。這裏的左右的基準是以左上角原點爲基準的,遇到了一個坑,之後會說。簡單說一下rect和rectf的區別,精度不同,rect是int型,rectf是float型。
// 第一種
canvas.drawRect(100,100,800,400,mPaint);
// 第二種
Rect rect = new Rect(100,100,800,400);
canvas.drawRect(rect,mPaint);
// 第三種
RectF rectF = new RectF(100,100,800,400);
canvas.drawRect(rectF,mPaint);
接下來是圓角矩形的繪製。這裏主要復現了第四個博客做的事情,然後查閱了第五個博客FontMetrics類的參數。我實現的是繪製一個在屏幕中居中的矩形,然後文字在矩形上下左右居中,同時矩形大小要隨文字的多少變換。整體效果見下圖。
int width=getWidth();
int textsize=40;
String text = "哈哈啊哈哈哈哈哈哈哈";
int textwidth=text.length()*textsize;
float startX = width/2-textwidth/2 ;
float startY = 100 ;
float endX = width/2+textwidth/2 ;
float endY = 200 ;
RectF rectF = new RectF(startX, startY, endX, endY);
//20是圓角半徑
canvas.drawRoundRect(rectF, 20, 20, paint);
接下來要用畫筆Paint使用drawText()函數來繪製文字,代碼如下:
paint.setTextSize(textsize);//設置畫筆的大小
Paint.FontMetrics fontMetrics=paint.getFontMetrics();
float baseline = (rectF.bottom + rectF.top -fontMetrics.bottom - fontMetrics.top) / 2;
canvas.drawText(text,(endX-startX)/2+startX-textwidth/2,baseline,paint);
這裏要說的比較多,首先是Paint.FontMetrics,它可以理解爲一個字體度量。通過getFontMetrics()方法獲取,其包含幾個字符屬性參數(top,ascent,descent,bottom)。這幾個屬性參數都是距離baseline的距離。
值得一提的是,我閱讀源碼時,有這樣一段話,大概意思是值向下增加,值向上減少。其實就是說,ascent與top的值是負的,descent與bottom的值是正的。ascent和descent是一個字體的建議距離(最高,最低)。