前段时间在开发界面自定义视图的时候,根据产品的要求,用户的等级不设限制,所以用美工出图的方式来显示用的vip等级图标不太现实,之前的开发中基本都是用美工的图来显示的。后面自己想了想还是自己画一个吧,虽然时间有点赶。
那么在画这个vip图标的过程中遇到了一个很蛋疼的问题,就是canvas的绘制文字时坐标体系和安卓视图控件的坐标体系是不一样的。起初在ondrow()方法中绘制这个图标的时候完全不知道。以至于后面自己算了一遍又一遍的位置,明明没错,但是显示的位置就是错误的。后期有点抓狂。
具体的讲解有人已经写出来了,地址在这里:http://blog.csdn.net/lvxiangan/article/details/8540774
画文本的坐标体系和正常的安卓的坐标体系有点差别:
1,坐标原点是在文本的baseline线的左侧开始的地方。
2,Y轴以上为正,X轴以右为正。相当奇葩。
按照这样的坐标规则,最后成功将文本画出来了。
贴上代码:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//先画背景
RectF targetRect = new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight());
canvas.drawRoundRect(targetRect, 3, 3, bg);
float width = targetRect.right - targetRect.left;
float heigth = targetRect.bottom - targetRect.top;
float vWidth = levelIcon.measureText("V");
float nWidth = number.measureText(String.valueOf(mLevel));
Paint.FontMetricsInt vfm = levelIcon.getFontMetricsInt();
float vLeft = targetRect.left + (width - vWidth - nWidth) / 2;
float vTop = targetRect.top + (heigth - (vfm.bottom + vfm.top)) / 2;
Paint.FontMetricsInt nfm = number.getFontMetricsInt();
float nLeft = vLeft + vWidth;
float nTop = targetRect.top + vTop;
canvas.drawText("V", vLeft, vTop, levelIcon);
canvas.drawText(String.valueOf(mLevel), nLeft, nTop, number);
}