几个月前做弹幕,需要用到drawText,一开始弹幕的位置总是不太准确,调好之后也没有记录,今天有点空余时间,就写下来吧
方法: canvas.drawText(“都可能是策略调整”,startX,startY,paint);
其中startX不难理解,主要是startY,下面用一张图说明一下:
其中白色虚线框是view的边界。如果文字需要垂直居中,该如何算startY的值呢?
1. startY应该是base那条线(即红线)到view上顶点的距离
2.由1知:Paint.FontMetrics fontMetrics = paint.getFontMetrics();
textHeight= Math.ceil(fontMetrics.descent - fontMetrics.ascent);
//descent(即黄线)到view上顶点的距离
int d1 = view.getHeight()/2+textHeight/2;
startY = d1-(fontMetrics.descent-base);
startY = d1-fontMetrics.descent;
总结如下:
1.文字需要相对于view居中显示:
(1)startX:
当paint.setTextAlign(Paint.Align.CENTER)时startX为view宽度的一半;当paint.setTextAlign(Paint.Align.LEFT)时startX为view宽度的一半减去文字长度的一半;
;当paint.setTextAlign(Paint.Align.RIGHT)时startX为view宽度的一半加上文字长度的一半.默认是LEFT方式
(2)startY
startY需要传viewHeight/2+Math.ceil(fontMetrics.descent - fontMetrics.ascent)/2-fontMetrics.descent的值,不论是何种对齐方式
2.文字需要相对于view左上对齐显示:
(1)startX:
当paint.setTextAlign(Paint.Align.CENTER)时startX为文字长度的一半;当paint.setTextAlign(Paint.Align.LEFT)时startX为0;
;当paint.setTextAlign(Paint.Align.RIGHT)时startX为文字长度
(2)startY
startY需要传-fontMetrics.top。(不要漏掉负号,因为fontMetrics.top是负值)
2.文字需要相对于view右下对齐显示:
(1)startX:
当paint.setTextAlign(Paint.Align.CENTER)时startX为view宽度的一半加上文字长度的一半;当paint.setTextAlign(Paint.Align.LEFT)时startX为view宽度减去文字长度;
;当paint.setTextAlign(Paint.Align.RIGHT)时startX为view宽度
(2)startY
startY需要传view.getHeight()-fontMetrics.bottom
ps:获取文字长度的方法:paint.measureText(“uuuuuu”);!