`
Aina_hk55HK
  • 浏览: 388583 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android DrawText字符串的绘制

阅读更多
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);
	}
    
}
分享到:
评论
2 楼 awen_PC 2011-03-12  
    这个是可以实现。但是字体背景颜色好像实现不了的吧,只能实现字体本身颜色的改变和设定画布颜色改变。不过显示字体窗口的背景颜色不会变即跟画布一个色。你试试,是这样的嘛么?要是想让字体显示窗口内部背景的颜色和画布颜色区分开来怎么弄?谢谢!
1 楼 xiaor186 2010-07-04  
啊呀,老大,你好牛比阿,这正是我一直在寻找的东西呢。可惜没有把程序的下载包上传上来,这么说到不是我懒,只是那样的话我在学习时会少花点时间来自己打这些程序了。


谢谢了

相关推荐

    android 字符串绘制示例

    字符串绘制主要通过`Canvas.drawText()`方法实现。此方法接收四个参数:要绘制的字符串、起始X坐标、起始Y坐标和Paint对象。Paint对象用来设置文字的颜色、大小、字体等属性。 1. **Paint对象**:在Android中,`...

    基于android平台的图片上绘制字符串演示程序

    我们可以使用`Canvas`的`drawText()`方法,将字符串绘制到指定的坐标上。这个方法需要传入要绘制的文本、起始X坐标、起始Y坐标以及可选的Paint对象。Paint对象定义了文本的颜色、字体大小、样式等属性,可以根据需求...

    计算字符串的宽度(width)

    在编程领域,尤其是在UI设计和文本处理中,计算字符串的宽度是一个重要的任务。这涉及到文本渲染,特别是当我们在不同平台上(如Windows、Windows Mobile等)使用不同字体和大小时,需要确保界面布局的准确性和美观...

    Android Canvas的drawText()与文字居中方案详解

    自定义View是绘制文本有三类方法 // 第一类 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...

    源码

    `drawText()`方法不仅限于绘制简单的字符串,还可以处理Unicode字符,甚至支持复杂的文本布局,如换行、对齐方式和多语言文本。为了实现这些更高级的功能,你需要利用`Layout`类和`StaticLayout`或`DynamicLayout`。...

    自定义TextView实现竖直跑马灯效果,特殊字符串改变颜色

    为了使某些字符串颜色不同,我们可以将文本拆分为多个部分,分别设置颜色后绘制。可以使用正则表达式匹配特定字符串,然后用SpannableString和SpannableStringBuilder来处理颜色变化。 自定义TextView实现竖直跑马...

    Android实现文字转图片

    5. **绘制文字**:最后,在Canvas上使用`drawText()`方法绘制文字。 ```java String text = "这是要转换成图片的文字"; float x = 50; // 文字起始x坐标 float y = 50 + paint.getFontMetrics().descent - paint....

    Android双色配置TextView功能类demo

    3. **绘制文本**:重写TextView的`onDraw()`方法,遍历ColorPhrase对象,使用`canvas.drawText()`方法逐个绘制子字符串,每个子字符串使用其对应的颜色。 4. **设置颜色**:颜色值可以是预定义的Android系统颜色...

    Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)

    6. **文字(Text)**:`canvas.drawText()`用于在指定位置绘制文本,需要文本字符串,X和Y坐标,以及用于绘制的Paint对象,可以设置字体大小、颜色、样式等属性。 7. **矩形(Rectangle)**:`canvas.drawRect()`可以...

    自定义控件文本绘制

    - `text`:要绘制的字符串。 - `x`:文本的起始X坐标。 - `y`:文本的起始Y坐标,通常称为基线。 - `paint`:包含文本颜色、字体大小、样式等信息的`Paint`对象。 ### 2. 文字基线 基线是绘制文本时的一个关键概念...

    Android 绘制带数字进度条形进度条.zip

    // 获取当前进度值并格式化为字符串 String progressText = String.format(Locale.getDefault(), "%d%%", (int) (getProgress() * 100 / getMax())); // 计算数字在进度条中的位置 float textWidth = ...

    android canvas drawText()文字居中效果

    - `text`:要绘制的文本字符串。 - `x`:文本的起始绘制点的x坐标。 - `y`:文本的起始绘制点的y坐标。 - `paint`:包含颜色、字体大小、样式等信息的Paint对象。 在Android中,文本的绘制是基于基线的,基线是一条...

    Android 安卓文本矩阵MatrixText应用例子.rar

    2. 文本矩阵生成:创建一个方法来生成文本矩阵,这可能涉及到字符串分割、行列计算等。 3. 绘制逻辑:在onDraw()方法中,根据生成的文本矩阵,调用Canvas的drawText()方法在指定位置绘制每个字符。 4. 布局管理:...

    Android自定义组件-MultiTextView(更新)

    在`MultiTextView`中,我们需要重写`onMeasure()`方法来精确控制组件的尺寸,并在`onDraw()`方法中绘制各个字符串: ```java @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { ...

    时间 android 自定义时钟

    Android系统提供了许多内置的API来处理时间,例如`java.util.Calendar`类用于获取和操作日期和时间,`java.text.SimpleDateFormat`用于格式化日期和时间字符串。然而,这些API并不直接用于在屏幕上绘制时钟。 要...

    基于Android日历及记事功能完整实现.pdf

    应用中的各种静态资源,如字符串、颜色、尺寸和图片资源等,通常都放置在res目录下的对应文件中。比如,文档中的“@color/calendar_background”和“@drawable/calendar_bak”分别表示颜色资源和图片资源的引用。...

    Android画图学习总结(五)——Paint_玉树临疯_ 京华志

    - `text`:待绘制的字符串。 - `start` 和 `end`:用于指定字符串的子串范围。 - `x` 和 `y`:文本的起始绘制位置坐标。 - `paint`:用于绘制文本的Paint对象。 2. **void drawText(char[] text, int index, ...

    android 拍照加时间水印(以及图片)

    4. **绘制水印**:创建一个Paint对象,设置字体、颜色、大小等属性,然后在Canvas上用drawText()方法绘制时间字符串。注意调整坐标,使水印位于合适的位置,如右下角。 5. **保存结果**:将带有水印的Bitmap保存为新...

    Android绘制圆形百分比加载圈效果

    其中,text是需要绘制的字符串,x和y是绘制文本的起点坐标,paint是画笔对象。 开始绘图前的准备 在开始绘图前,需要考虑以下几点: 1. 获取控件的宽和高,以确定圆的半径大小。 2. 确定圆心的坐标,以确定圆的...

Global site tag (gtag.js) - Google Analytics