一。Android繪制文本對象FontMetrics介紹
?? FontMetrics對象
?? 它以四個基本坐標為基準,分別為:
?? ?FontMetrics.top
?? ?FontMetrics.ascent
?? ?FontMetrics.descent
?? ?FontMetrics.bottom
??
?? 實例JAVA代碼如下:
?? Paint textPaint = new Paint( Paint.ANTI_ALIAS_FLAG);
?? textPaint.setTextSize( 35);
?? textPaint.setColor( Color.WHITE);
?? // FontMetrics對象
?? FontMetrics fontMetrics = textPaint.getFontMetrics();
?? String text = "abcdefghijklmnopqrstu";
?? // 計算每一個坐標
?? float baseX = 0;
?? float baseY = 100;
?? float topY = baseY + fontMetrics.top;
?? float ascentY = baseY + fontMetrics.ascent;
?? float descentY = baseY + fontMetrics.descent;
?? float bottomY = baseY + fontMetrics.bottom;
?? // 繪制文本
?? canvas.drawText( text, baseX, baseY, textPaint);
?? // BaseLine描畫
?? Paint baseLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
?? baseLinePaint.setColor( Color.RED);
?? canvas.drawLine(0, baseY, getWidth(), baseY, baseLinePaint);
?? // Base描畫
?? canvas.drawCircle( baseX, baseY, 5, baseLinePaint);
?? // TopLine描畫
?? Paint topLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
?? topLinePaint.setColor( Color.LTGRAY);
?? canvas.drawLine(0, topY, getWidth(), topY, topLinePaint);
?? // AscentLine描畫
?? Paint ascentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
?? ascentLinePaint.setColor( Color.GREEN);
?? canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint);
?? // DescentLine描畫
?? Paint descentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
?? descentLinePaint.setColor( Color.YELLOW);
?? canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint);
?? // ButtomLine描畫
?? Paint bottomLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
?? bottomLinePaint.setColor( Color.MAGENTA);
?? canvas.drawLine(0, bottomY, getWidth(), bottomY, bottomLinePaint);
二。繪製文本。
1.TextUtil 類
2. MyView 類
3. DrawText? Activity.
?? FontMetrics對象
?? 它以四個基本坐標為基準,分別為:
?? ?FontMetrics.top
?? ?FontMetrics.ascent
?? ?FontMetrics.descent
?? ?FontMetrics.bottom
??
?? 實例JAVA代碼如下:
?? Paint textPaint = new Paint( Paint.ANTI_ALIAS_FLAG);
?? textPaint.setTextSize( 35);
?? textPaint.setColor( Color.WHITE);
?? // FontMetrics對象
?? FontMetrics fontMetrics = textPaint.getFontMetrics();
?? String text = "abcdefghijklmnopqrstu";
?? // 計算每一個坐標
?? float baseX = 0;
?? float baseY = 100;
?? float topY = baseY + fontMetrics.top;
?? float ascentY = baseY + fontMetrics.ascent;
?? float descentY = baseY + fontMetrics.descent;
?? float bottomY = baseY + fontMetrics.bottom;
?? // 繪制文本
?? canvas.drawText( text, baseX, baseY, textPaint);
?? // BaseLine描畫
?? Paint baseLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
?? baseLinePaint.setColor( Color.RED);
?? canvas.drawLine(0, baseY, getWidth(), baseY, baseLinePaint);
?? // Base描畫
?? canvas.drawCircle( baseX, baseY, 5, baseLinePaint);
?? // TopLine描畫
?? Paint topLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
?? topLinePaint.setColor( Color.LTGRAY);
?? canvas.drawLine(0, topY, getWidth(), topY, topLinePaint);
?? // AscentLine描畫
?? Paint ascentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
?? ascentLinePaint.setColor( Color.GREEN);
?? canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint);
?? // DescentLine描畫
?? Paint descentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
?? descentLinePaint.setColor( Color.YELLOW);
?? canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint);
?? // ButtomLine描畫
?? Paint bottomLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);
?? bottomLinePaint.setColor( Color.MAGENTA);
?? canvas.drawLine(0, bottomY, getWidth(), bottomY, bottomLinePaint);
二。繪製文本。
1.TextUtil 類
package com.wistron.test.DrawText;
import java.util.Vector;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.view.KeyEvent;
public class TextUtil {
private int mTextPosx = 0;// x坐標
private int mTextPosy = 0;// y坐標
private int mTextWidth = 0;// 繪制寬度
private int mTextHeight = 0;// 繪制高度
private int mFontHeight = 0;// 繪制字體高度
private int mPageLineNum = 0;// 每一頁顯示的行數
private int mCanvasBGColor = 0;// 背景顏色
private int mFontColor = 0;// 字體顏色
private int mAlpha = 0;// Alpha值
private int mRealLine = 0;// 字符串真實的行數
private int mCurrentLine = 0;// 當前行
private int mTextSize = 0;// 字體大小
private String mStrText = "";
private Vector mString = null;
private Paint mPaint = null;
public TextUtil(String StrText, int x, int y, int w, int h, int bgcolor,
int textcolor, int alpha, int textsize) {
mPaint = new Paint();
mString = new Vector();
this.mStrText = StrText;
this.mTextPosx = x;
this.mTextPosy = y;
this.mTextWidth = w;
this.mTextHeight = h;
this.mCanvasBGColor = bgcolor;
this.mFontColor = textcolor;
this.mAlpha = alpha;
this.mTextSize = textsize;
}
public void InitText() {
mString.clear();// 清空Vector
// 對畫筆屬性的設置
// mPaint.setARGB(this.mAlpha, Color.red(this.mFontColor), Color
// .green(this.mFontColor), Color.blue(this.mFontColor));
mPaint.setTextSize(this.mTextSize);
mPaint.setColor(Color.BLUE);
this.GetTextIfon();
}
/**
* 得到字符串信息包括行數,頁數等信息
*/
public void GetTextIfon() {
char ch;
int w = 0;
int istart = 0;
FontMetrics fm = mPaint.getFontMetrics();// 得到系統默認字體屬性
mFontHeight = (int) (Math.ceil(fm.descent - fm.top) + 2);// 獲得字體高度
mPageLineNum = mTextHeight / mFontHeight;// 獲得行數
int count = this.mStrText.length();
for (int i = 0; i < count; i++) {
ch = this.mStrText.charAt(i);
float[] widths = new float[1];
String str = String.valueOf(ch);
mPaint.getTextWidths(str, widths);
if (ch == '\n') {
mRealLine++;// 真實的行數加一
mString.addElement(this.mStrText.substring(istart, i));
istart = i + 1;
w = 0;
} else {
w += (int) Math.ceil(widths[0]);
if (w > this.mTextWidth) {
mRealLine++;// 真實的行數加一
mString.addElement(this.mStrText.substring(istart, i));
istart = i;
i--;
w = 0;
} else {
if (i == count - 1) {
mRealLine++;// 真實的行數加一
mString.addElement(this.mStrText.substring(istart,
count));
}
}
}
}
}
/**
* 繪制字符串
*
* @param canvas
*/
public void DrawText(Canvas canvas) {
for (int i = this.mCurrentLine, j = 0; i < this.mRealLine; i++, j++) {
if (j > this.mPageLineNum) {
break;
}
canvas.drawText((String) (mString.elementAt(i)), this.mTextPosx,
this.mTextPosy + this.mFontHeight * j, mPaint);
}
}
/**
* 翻頁等按鍵處理
*
* @param keyCode
* @param event
* @return
*/
public boolean KeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
if (this.mCurrentLine > 0) {
this.mCurrentLine--;
}
} else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
if ((this.mCurrentLine + this.mPageLineNum) < (this.mRealLine - 1)) {
this.mCurrentLine++;
}
}
return false;
}
}
2. MyView 類
package com.wistron.test.DrawText;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.View;
public class MyView extends View implements Runnable {
private final Paint mPaint;
private int mICount = 0;
private final TextUtil mTextUtil;
public MyView(Context context) {
super(context);
mPaint = new Paint();
String string = "測試自動換行(第1行)\n\n測試自動換行(第2行)\n測試自動換行(第3行)\n測試自動換行(第4行)\n測試自動換行(第5行)\n測試自動換行(第6行)\n測試自動換行(第7行)"
+ "生活教會了我們什麼,自己的感覺現在已經徹底的隕滅,生命中彷彿是蒸發了為自己幸福而爭的念頭,一切就這樣的循規蹈矩!";
mTextUtil = new TextUtil(string, 15, 150, 300, 80, Color.LTGRAY,
0xff00ff, 255, 16);
mTextUtil.InitText();
new Thread(this).start();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.LTGRAY);
mPaint.setAntiAlias(true);
if (mICount < 100) {
mICount++;
}
mPaint.setColor(Color.RED);
canvas.drawText("裝載進度:" + mICount + "%......", 10, 20, mPaint);
mTextUtil.DrawText(canvas);
}
@Override
public void run() {
Thread.currentThread();
while (!Thread.interrupted()) {
try {
Thread.sleep(10);
} catch (Exception ex) {
ex.printStackTrace();
Thread.currentThread().interrupt();
}
this.postInvalidate();
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return mTextUtil.KeyDown(keyCode, event);
}
}
3. DrawText? Activity.
package com.wistron.test.DrawText;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
public class DrawText extends Activity {
/** Called when the activity is first created. */
private MyView mv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mv = new MyView(this);
setContentView(mv);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
mv.onKeyDown(keyCode, event);
return super.onKeyDown(keyCode, event);
}
}
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

