package com.Aina.Android; 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; } }
package com.Aina.Android; 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 Paint mPaint; private int mICount = 0; private 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, 0x000000, 0xff00ff, 255, 16); mTextUtil.InitText(); new Thread(this).start(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.BLACK); 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(); } } public boolean onKeyDown(int keyCode, KeyEvent event) { return mTextUtil.KeyDown(keyCode, event); } }
package com.Aina.Android; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; public class Test_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); } }