- 在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)