文字竖排

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值