您的位置:首页 > 移动开发 > Android开发

Android 如何实现竖排文字显示?

2014-06-16 10:41 513 查看
转自:http://blog.csdn.net/liaoyp_ios_android/article/details/6949768

在android.graphics.Canvas类中有个沿路径画字的方法

void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint)

Draw the text, with origin at (x,y), using the specified paint, along the specified path.

void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)

Draw the text, with origin at (x,y), using the specified paint, along the specified path.

Test.java代码://需要在layout中定义Test,且设置背景,在java代码中设置test Text

public class Test extends View {

private Paint paint;

private Path path;

private Matrix matrix;

private int width = -1;

private int height = -1;

private float left = 3;

private float top = 18;

private String title = "";

BitmapDrawable drawable = (BitmapDrawable) getBackground();

public Test(Context context, AttributeSet attrs) {

super(context, attrs);

paint = new Paint();

paint.setColor(Color.WHITE);//定义字体颜色

paint.setTextSize(14);//定义字体大小

path = new Path();

path.lineTo(0,500);//定义字符路径

matrix = new Matrix();

Log.v("onMeasure", "2");

}

@Override

protected void onDraw(Canvas canvas) {

//画背景

Bitmap b = Bitmap.createBitmap(drawable.getBitmap(),0,0,width,height);

canvas.drawBitmap(b, matrix, paint);

//画字

showText(canvas, title);

}

private void showText(Canvas canvas, String text){

float w;

final int len = text.length();

float py = 0 + top;

for(int i=0; i<len; i ++){

char c = text.charAt(i);

w = paint.measureText(text, i, i+1);//获取字符宽度

StringBuffer b = new StringBuffer();

b.append(c);

if(py > 81){//定义字的范围

return;

}

if(isChinese(c)){

py += w;

if(py > 81){

return;

}

canvas.drawText(b.toString(), left, py, paint); //中文处理方法

}else {

canvas.drawTextOnPath(b.toString(), path, py, -left-2, paint);//其他文字处理方法

py += w;

}

}

}

public void setText(String title){

this.title = title;

}

public String getText(){

return title;

}

private boolean isChinese(char c) {

Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);

if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS

|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS

|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A

|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION

|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION

|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {

return true;

}

return false;

}

//重写View大小方法,使view大小为背景图片大小

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

// super.onMeasure(widthMeasureSpec, heightMeasureSpec);

if (null != getBackground()) {

int h = drawable.getIntrinsicHeight();

int w = drawable.getIntrinsicWidth();

Log.v("onMeasure", "null != getBackground() h:" + h + " w:" + w);

width = w;

height = h;

setMeasuredDimension(w, h);

} else {

width = widthMeasureSpec;

height = heightMeasureSpec;

super.measure(widthMeasureSpec, heightMeasureSpec);

}

}

}

在Android中,若要通过程序改变屏幕显示的方向,必须要覆盖setRequestedOrientation()方法,而若要取得目前的屏幕方向,则需要访问getRequestedOrientation()方法。本范例为求简要示范更改做法,设计了一个按钮,当单击按钮的同时,判断当下的屏幕方向,例如竖排(PORTRAIT),则将其更改为横排(LANDSCAPE);若为横排(LANDSCAPE),则将其更改为竖排(PORTRAIT)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: