Canvas&Paint[]Paint:drawText位置

【参考链接】

drawText()详解http://blog.csdn.net/harvic880925/article/details/50423762

 

在绘制文本时,drawText要指定(xy)坐标。但是这个(xy)坐标并不是文本矩形的左上角坐标,默认x是文本的最左边,y是文本的baseline.

private String text="shadowfaxg";
private int
yBaseline=300;


@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);

   
setContentView(R.layout.activity_main);

   
Bitmap bmp=Bitmap.createBitmap(800, 800, Bitmap.Config.ARGB_8888);
   
Canvas canvas=new Canvas(bmp);

   
//默认画笔
   
Paint paintAll=new Paint();
   
paintAll.setAlpha(255);//不透明度//完全不透明
   
paintAll.setAntiAlias(true);
   
paintAll.setColor(Color.parseColor("#000000"));//黑色//默认就是黑色
   
paintAll.setStyle(Paint.Style.FILL);

   
paintAll.setColor(Color.parseColor("#FF0000"));
   
canvas.drawLine(yBaseline, 0, yBaseline, 800, paintAll);
   
canvas.drawLine(0, yBaseline, 800, yBaseline, paintAll);

   
paintAll.setTextSize(80);
   
paintAll.setColor(Color.parseColor("#000000"));
   
//绘制文本
   
paintAll.setTextAlign(Paint.Align.LEFT);
   
canvas.drawText(text, 300, yBaseline, paintAll);

   
ImageView iv = (ImageView)findViewById(R.id.iv);
   
iv.setImageBitmap(bmp);
}


并且这里可以看到文本左侧并没有完全靠齐,这其实也是后面getTextBound()measureText()的差距

 

x

根据paint. setTextAlign()的设置,将TextAlign线放置到x坐标上

可选的值有PAINT.ALIGN.LEFTPAINT.ALIGN.RIGHTPAINT.ALIGN.CENTER




 

y

设置的值作为字符串的baseline线。

对于一个文本,一共有5条横线,可以通过paint.getFontMatrics()得到其余4条线相对于baseline线的偏移

paintAll.setTextSize(80);

//获取文本的其他线到baseline的距离
paintAll.setColor(Color.parseColor("#0000FF"));
Paint.FontMetricsfontMetrics = paintAll.getFontMetrics();//这个要在设置完setTextSize()以后调用
canvas.drawLine(0, yBaseline+fontMetrics.ascent, 800, yBaseline+fontMetrics.ascent, paintAll);
canvas.drawLine(0, yBaseline+fontMetrics.descent, 800, yBaseline+fontMetrics.descent, paintAll);
canvas.drawLine(0, yBaseline+fontMetrics.top, 800, yBaseline+fontMetrics.top, paintAll);
canvas.drawLine(0, yBaseline+fontMetrics.bottom, 800, yBaseline+fontMetrics.bottom, paintAll);

//绘制文本
paintAll.setColor(Color.parseColor("#000000"));
paintAll.setTextAlign(Paint.Align.CENTER);
canvas.drawText(text, 300, yBaseline, paintAll);


所以如果要将文本以(x,y)点为左上角进行配置,x需要设置成x+ascent

 

如何在绘制之前,得到文本的长宽信息呢

Paint提供了两个方法getTextBounds()measureText(),这两个方法也是需要在setTextSize()以后才有效

getTextBounds()用于获取文本的外包矩形,但是其值是相对于x=0/LEFTy=0/baseline时的

measureText()用于获取文本的测量宽度,这个宽度才是绘制时使用的宽度,跟上面的外包矩形的宽度并不一样(要稍微大一些)

private String text="shadowfaxg";
private int
yBaseline=300;

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);

   
setContentView(R.layout.activity_main);

   
Bitmap bmp=Bitmap.createBitmap(800, 800, Bitmap.Config.ARGB_8888);
   
Canvas canvas=new Canvas(bmp);

   
//默认画笔
   
Paint paintAll=new Paint();
   
paintAll.setAlpha(255);//不透明度//完全不透明
   
paintAll.setAntiAlias(true);
   
paintAll.setColor(Color.parseColor("#000000"));//黑色//默认就是黑色
   
paintAll.setStyle(Paint.Style.FILL);

   
paintAll.setColor(Color.parseColor("#FF0000"));
   
canvas.drawLine(yBaseline, 0, yBaseline, 800, paintAll);
   
canvas.drawLine(0, yBaseline, 800, yBaseline, paintAll);

   
paintAll.setTextSize(80);

   
//获取文本的其他线到baseline的距离
   
paintAll.setColor(Color.parseColor("#0000FF"));
   
Paint.FontMetrics fontMetrics =paintAll.getFontMetrics();//这个要在设置完setTextSize()以后调用
   
canvas.drawLine(0, yBaseline+fontMetrics.ascent, 800, yBaseline+fontMetrics.ascent, paintAll);
   
canvas.drawLine(0, yBaseline+fontMetrics.descent, 800, yBaseline+fontMetrics.descent, paintAll);
   
canvas.drawLine(0, yBaseline+fontMetrics.top, 800, yBaseline+fontMetrics.top, paintAll);
   
canvas.drawLine(0, yBaseline+fontMetrics.bottom, 800, yBaseline+fontMetrics.bottom, paintAll);

   
//getTextBounds()
   
Rect rect=new Rect();
   
paintAll.getTextBounds(text, 0, text.length(), rect);
    int
width1=(rect.right-rect.left);
   
Log.e("shadowfaxghh", "width1="+width1);

   
//measureText()//稍微大一些
   
float width2 = paintAll.measureText(text);
   
Log.e("shadowfaxghh", "width2="+width2);

    int
offset = 300;

   
paintAll.setColor(Color.GREEN);
   
canvas.drawRect(offset, rect.top+yBaseline, width2+offset, rect.bottom+yBaseline, paintAll);

   
paintAll.setColor(Color.MAGENTA);
   
canvas.drawRect(rect.left, rect.top, rect.right, rect.bottom, paintAll);
   
canvas.drawRect(rect.left+offset, rect.top+yBaseline, rect.right+offset, rect.bottom+yBaseline, paintAll);

   
//绘制文本
   
paintAll.setColor(Color.parseColor("#000000"));
   
paintAll.setTextAlign(Paint.Align.LEFT);
   
canvas.drawText(text, 300, yBaseline, paintAll);

   
ImageView iv = (ImageView)findViewById(R.id.iv);
   
iv.setImageBitmap(bmp);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值