绘制字符串:

字符串工具类:
/**
* 实现文字自动换行
* 自动翻页
*/
package com.yarin.android.Examples_05_06;

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
{
int m_iTextPosX; //绘制的x点
int m_iTextPosY; //绘制的y点
int m_iTextWidth; //绘制宽度
int m_iTextHeight; //绘制高度

int m_iFontHeight; //字体高度

int m_ipageLineNum; //每一页显示的行数

int m_iTextBGColor; // 背景颜色
int m_iTextColor; // 字体颜色
int m_iAlpha; //Alpha值

int m_iRealLine; // 字符串真实的行数
int m_iCurLine; //当前行

String m_strText;

Vector m_String;

Paint m_paint;

int m_iTextSize;

public TextUtil()
{
m_paint = new Paint();
m_String = new Vector();
}

public TextUtil(String strText, int x, int y, int w, int h, int bgcolor, int txetcolor, int a, int iTextSize)
{
m_paint = new Paint();
m_String = new Vector();

m_strText = strText;

m_iTextPosX = x;
m_iTextPosY = y;
m_iTextWidth = w;
m_iTextHeight = h;

m_iTextBGColor = bgcolor;
m_iTextColor = txetcolor;

m_iTextSize = iTextSize;

m_iAlpha = a;

}

/**
* 初始化
* @param strText 要显示的字符串
* @param x x
* @param y y
* @param w w
* @param h h
* @param bgcolor 背景颜色
* @param txetcolor 文字的颜色
* @param a Alpha
* @param iTextSize 字体大小
*/
public void InitText(String strText, int x, int y, int w, int h, int bgcolor, int txetcolor, int a, int iTextSize)
{
m_iCurLine = 0;
m_ipageLineNum = 0;
m_iRealLine = 0;
m_strText = "";
m_iTextPosX = 0;
m_iTextPosY = 0;
m_iTextWidth = 0;
m_iTextHeight = 0;
m_iTextBGColor = 0;
m_iTextColor = 0;
m_iTextSize = 0;
m_iAlpha = 0;

m_String.clear();

SetText(strText);
SetRect(x, y, w, h);
SetBGColor(bgcolor);
SetTextColor(txetcolor);
SetFontSize(iTextSize);
SetAlpha(a);

SetPaint();

GetTextIfon();
}

/**
* 设置Alpha
* @param a Alpha值
*/
public void SetAlpha(int a)
{
m_iAlpha = a;
}

/**
* 对Paint属性的设置
*/
public void SetPaint()
{
m_paint.setARGB(m_iAlpha, Color.red(m_iTextColor), Color.green(m_iTextColor), Color.blue(m_iTextColor));
m_paint.setTextSize(m_iTextSize);
}

/**
* 设置字体尺寸
* @param iTextSize
*/
public void SetFontSize(int iTextSize)
{
m_iTextSize = iTextSize;
}

/**
* 设置显示文本的区域
* @param x
* @param y
* @param w
* @param h
*/
public void SetRect(int x, int y, int w, int h)
{
m_iTextPosX = x;
m_iTextPosY = y;
m_iTextWidth = w;
m_iTextHeight = h;
}

/**
* 设置背景颜色
* @param bgcolor
*/
public void SetBGColor(int bgcolor)
{
m_iTextBGColor = bgcolor;
}

/**
* 设置字体颜色
* @param txetcolor
*/
public void SetTextColor(int txetcolor)
{
m_iTextColor = txetcolor;
}

/**
* 色绘制要显示的字符串
* @param strText
*/
public void SetText(String strText)
{
m_strText = strText;
}

/**
* 得到字符串的信息
* 包括:行数、页数等信息
* 内部调用
*/
public void GetTextIfon()
{
char ch;
int w = 0;
int istart = 0;
FontMetrics fm = m_paint.getFontMetrics();

m_iFontHeight = (int) Math.ceil(fm.descent - fm.top) + 2;

m_ipageLineNum = m_iTextHeight / m_iFontHeight;

for (int i = 0; i < m_strText.length(); i++)
{
ch = m_strText.charAt(i);
float[] widths = new float[1];
String srt = String.valueOf(ch);
m_paint.getTextWidths(srt, widths);

if (ch == ‘\n‘)
{
m_iRealLine++;
m_String.addElement(m_strText.substring(istart, i));
istart = i + 1;
w = 0;
}
else
{
w += (int) (Math.ceil(widths[0]));
if (w > m_iTextWidth)
{
m_iRealLine++;
m_String.addElement(m_strText.substring(istart, i));
istart = i;
i--;
w = 0;
}
else
{
if (i == (m_strText.length() - 1))
{
m_iRealLine++;
m_String.addElement(m_strText.substring(istart, m_strText.length()));
}
}
}
}
}

/**
* 绘制字符串
* @param canvas
*/
public void DrawText(Canvas canvas)
{
for (int i = m_iCurLine, j = 0; i < m_iRealLine; i++, j++)
{
if (j > m_ipageLineNum)
{
break;
}
canvas.drawText((String) (m_String.elementAt(i)), m_iTextPosX, m_iTextPosY + m_iFontHeight * j, m_paint);
}
}

/**
* 翻页等按键处理
* @param keyCode
* @param event
* @return
*/
public boolean KeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_DPAD_UP)
{
if (m_iCurLine > 0)
{
m_iCurLine--;
}
}
else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN)
{
if ((m_iCurLine + m_ipageLineNum) < (m_iRealLine - 1))
{
m_iCurLine++;
}
}
return false;
}
}
视图类:
package com.yarin.android.Examples_05_06;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;

public class GameView extends View implements Runnable
{
/* 声明Paint对象 */
private Paint mPaint = null;
private int mICount = 0;

/* 声明TextUtil对象 */
private TextUtil mTextUtil = null;
public GameView(Context context)
{
super(context);
/* 构建对象 */
mPaint = new Paint();

String string = "测试自动换行\n\n设置文字自动换行abcdefgh\niklmnopqrst换行123347465\n43756245Android\n设置文字自动换行abcdefgh\niklmnopqrst换行123347465\n43756245Android";

/* 实例化TextUtil */
mTextUtil = new TextUtil(string,5,50,300,80,0x0,0xffffff,255,16);

/* 初始化TextUtil */
mTextUtil.InitText(string,5,50,300,80,0x0,0xffffff,255,16);

/* 开启线程 */
new Thread(this).start();
}

public 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);

/* 绘制TextUtil:实现自动换行 */
mTextUtil.DrawText(canvas);
}

// 触笔事件
public boolean onTouchEvent(MotionEvent event)
{
return true;
}

// 按键按下事件
public boolean onKeyDown(int keyCode, KeyEvent event)
{
return mTextUtil.KeyDown(keyCode, event);
}

// 按键弹起事件
public boolean onKeyUp(int keyCode, KeyEvent event)
{
return false;
}

public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
{
return true;
}

/**
* 线程处理
*/
public void run()
{
while (!Thread.currentThread().isInterrupted())
{
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
//使用postInvalidate可以直接在线程中更新界面
postInvalidate();
}
}
}

时间: 2024-10-27 11:56:48

绘制字符串:的相关文章

Android 绘制字符串到自定义view的中心

处理字符串的长度和宽度,并没有想象中的那么简单,要讲字符串画到自定义view的中心点,更加没有那么简单! 1. 计算字符串的长度 介绍两种计算方法,但是结果却很意外哦! (1)最小外接矩形 paint.setTextSize(textSize);paint.setTypeface(Typeface.MONOSPACE);Rect r = new Rect();paint.getTextBounds(text,0,text.length(),r);int height = r.bottom - r

自定义View绘制字符串

1 import android.app.Activity; 2 import android.os.Bundle; 3 import android.view.Display; 4 import android.view.View; 5 import android.content.Context; 6 import android.graphics.Canvas; 7 import android.graphics.Color; 8 import android.graphics.Paint

绘制字符串:imagestring()

<?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecolorallocate($image, 22, 153, 0); //3. 使用绿色填充画布 imagefill($image, 0, 0, $green); //4. 在画布中绘制图像 $bai = imagecolorallocate($image, 255, 255, 255); //绘制文字 //参

C#GDI 绘制线段(实线或虚线)、矩形、字符串、圆、椭圆

C#GDI 绘制线段(实线或虚线).矩形.字符串.圆.椭圆 绘制基本线条和图形 比较简单,直接看代码. 1 Graphics graphics = e.Graphics; 2 3 //绘制实线 4 using (Pen pen = new Pen(Color.Black, 2)) 5 { 6 pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; //实现 7 graphics.DrawLine(pen,0,10,100,10); 8

绘制文本

本课中,我们将学习如何在窗口的客户区“绘制”字符串.我们还将学习关于“设备环境”的概念. 理论: Windows 中的文本是一个GUI(图形用户界面)对象.每一个字符实际上是由许多的像素点组成,这些点在有笔画的地方显示出来,这样就会出现字符.这也是为什么我说“绘制”字符,而不是写字符.通常您都是在您应用程序的客户区“绘制”字符串(尽管您也可以在客户区外“绘制”).Windows 下的“绘制”字符串方法和 Dos 下的截然不同,在 Dos 下,您可以把屏幕想象成 85 x 25 的一个平面,而 W

视图层和视图类 、 绘制

1 绘制基本图形 1.1 问题 IOS中进行绘制比较方便,只需要在视图类(UIView及其子类)中重写drawRect方法,将绘制代码要写在该方法中即可,此方法会在视图显示前自动调用.本案例重写视图类中的drawRect方法,绘制一个简单的图形,如图-1所示: 图-1 1.2 方案 首先在创建好的Xcode项目中创建一个TRMyView类,继承至UIView.在Storyboard中拖放一个View控件,在右边栏的检查器中将View和TRMyView类进行绑定,并将背景设置为紫色. 然后在TRM

【PHP绘图技术&amp;&amp;验证码绘制】

PHP绘图是比较简单的事情,基本绘图如直线.圆.矩形.弧线.填充矩形.填充扇形.非中文字的打印.中文文字的打印在在下面的代码中会纤细讲解. 需要支持中文的字体,可以到windows自带的字体库中找,并复制到当前目录,改名为font.ttf 1 <?php 2 //1.创建画布 3 $im=imagecreatetruecolor(500,400); 4 //2.创建一个颜色 5 $red=imagecolorallocate($im,0,255,0); 6 //画圆 7 imageellipse

4. Quartz2D 绘制文字

#pragma mark 绘制文字(中文) -(void)drawText2:(CGContextRef)context{ NSString *string = @"博阿士大夫撒风景撒开了房间撒"; //1.获取字体 NSLog(@"%@",[UIFont familyNames]); UIFont *font = [UIFont fontWithName:@"Marker Felt" size:20]; //如果在UILabel中,可以将num

SDL_Test库(1)——SDL不用TTF库绘制文字

SDL库有很多的扩展,这很方便.但是每个扩展库都很臃肿,一般都会拖上额外的两三个开源库,更有甚者,扩展库的大小比SDL库本身还大得多.但有一个自带的.很有用的库很容易被大家忽视.它就是本文要讲的SDL_Test库.本库可以在不加载TTF库时在窗口上绘制字符串. 函数名叫SDLTest_DrawString,下面是E文的函数介绍和使用方法: Draw a string in the currently set font. * param renderer The renderer to draw