Android自定义View

画布的drawText()

2019-08-16  本文已影响0人  Small_Cake

参考:https://blog.csdn.net/harvic880925/article/details/50423762

一、通过基线确定起点

void drawText(String text, float x, float y, Paint paint)

        int baseLineX = 20 ;
        int baseLineY = 200;
        int baseLineY2 = 300;
        //画基线
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        canvas.drawLine(baseLineX, baseLineY, 3000, baseLineY, paint);
        canvas.drawLine(baseLineX, baseLineY2, 3000, baseLineY2, paint);
        //写文字
        paint.setColor(Color.BLACK);
        paint.setTextSize(80); //以px为单位
        canvas.drawText("A a B b C c D d E e F f G g", baseLineX, baseLineY, paint);
        canvas.drawText("H h I i J j K k L l M m N n", baseLineX, baseLineY2, paint);
个别小写字母低于基线

paint.setTextAlign(Paint.Align)确定位置

        //画基线
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        canvas.drawLine(baseLineX, baseLineY, 2000, baseLineY, paint);
        canvas.drawLine(baseLineX, baseLineY+100, 2000, baseLineY+100, paint);
        canvas.drawLine(baseLineX, baseLineY+200, 2000, baseLineY+200, paint);
        canvas.drawLine(x, 0, x, 2000, paint);
        //写文字
        paint.setColor(Color.DKGRAY);
        paint.setTextSize(80); //以px为单位
        paint.setTextAlign(Paint.Align.LEFT);//起点x,y在文字的左边
        canvas.drawText("A a B b C c D d E e F f G g", x, baseLineY, paint);
        paint.setTextAlign(Paint.Align.CENTER);
        canvas.drawText("A a B b C c D d E e F f G g", x, baseLineY+100, paint);
        paint.setTextAlign(Paint.Align.RIGHT);
        canvas.drawText("A a B b C c D d E e F f G g", x, baseLineY+200, paint);
左中右

二、drawText的四线格与FontMetrics

baseLine可以通过drawText(String text, float x, float y, Paint paint)中的y来确定,那么其他四条线就需要用到FontMetrics,其中最后一个leading是指在文本行之间间隙

    public static class FontMetrics {
        public float   top;
        public float   ascent;
        public float   descent;
        public float   bottom;
        public float   leading;
    }

这四条线的高度计算:

        int baseLineY = 900;
        int baseLineX = 0 ;
        Paint paint = new Paint();
        //写文字
        paint.setColor(Color.BLACK);
        paint.setAntiAlias(true);
        paint.setTextSize(300); //以px为单位
        paint.setStrokeWidth(3);
        canvas.drawText("S C g j", baseLineX, baseLineY, paint);
        //计算各线在位置
        Paint.FontMetrics fm = paint.getFontMetrics();
        float ascent = baseLineY + fm.ascent;
        float descent = baseLineY + fm.descent;
        float top = baseLineY + fm.top;
        float bottom = baseLineY + fm.bottom;
        //画top
        paint.setColor(Color.RED);
        canvas.drawLine(baseLineX, top, 2000, top, paint);
        //画ascent
        paint.setColor(Color.YELLOW);
        canvas.drawLine(baseLineX, ascent, 2000, ascent, paint);
        //画基线
        paint.setColor(Color.GREEN);
        canvas.drawLine(baseLineX, baseLineY, 2000, baseLineY, paint);
        //画descent
        paint.setColor(Color.CYAN);
        canvas.drawLine(baseLineX, descent, 2000, descent, paint);
        //画bottom
        paint.setColor(Color.BLUE);
        canvas.drawLine(baseLineX, bottom, 2000, bottom, paint);

5条线

三、所绘文字宽高和占用矩形区域获取

1.高度
int height = fontMetrics.bottom - fontMetrics.top;//所占高度
2.宽度
int width = paint.measureText(String text);
3.文字显示最小矩形
public void getTextBounds(String text, int start, int end, Rect bounds);
public void getTextBounds(char[] text, int index, int count, Rect bounds);

注意:这里获得的bounds获取的y轴是以基线的相对位置的值,所以我们获取的bounds顶部和底部需要加上基线的高度,才是准确位置
例如:

        int baseLineY = 800;
        int baseLineX = 0 ;
        Paint paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.BLACK);
        paint.setAntiAlias(true);
        paint.setTextSize(300); //以px为单位
        paint.setStrokeWidth(3);
        String text = "S C g j";
        canvas.drawText(text, baseLineX, baseLineY, paint);

        //获取最小区域值,注意这里获取的是对应基线的比较高度,所以top和bottom需要加上基线高度
        Rect minRect = new Rect();
        paint.getTextBounds(text,0,text.length(),minRect);
        int left = minRect.left;
        int top = baseLineY+minRect.top;
        int right = minRect.right;
        int bottom = baseLineY+minRect.bottom;

        paint.setColor(Color.GREEN);
        canvas.drawLine(0,baseLineY,2000,baseLineY,paint);//基线
        canvas.drawLine(left,0,left,2000,paint);//9
        canvas.drawLine(0,top,2000,top,paint);//基线+( -221)
        canvas.drawLine(right,0,right,2000,paint);//815
        canvas.drawLine(0,bottom,2000,bottom,paint);//基线 +66

        L.e(minRect.toShortString());// [9,-221][815,66]
        paint.setColor(Color.RED);
        canvas.drawRect(new RectF(left,top,right,bottom),paint);
我们分别找到这四个点[9,-221][815,66]对应的关系
4.文字占用空间矩形
        int baseLineY = 800;
        int baseLineX = 0 ;
        Paint paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.BLACK);
        paint.setAntiAlias(true);
        paint.setTextSize(300); //以px为单位
        paint.setStrokeWidth(3);
        String text = "S C g j";
        canvas.drawText(text, baseLineX, baseLineY, paint);

        //获取最小区域值,注意这里获取的是对应基线的比较高度,所以top和bottom需要加上基线高度
        Rect minRect = new Rect();
        paint.getTextBounds(text,0,text.length(),minRect);
        int left = minRect.left;
        int top = baseLineY+minRect.top;
        int right = minRect.right;
        int bottom = baseLineY+minRect.bottom;

        L.e(minRect.toShortString());// [9,-221][815,66]
        paint.setColor(Color.RED);
        canvas.drawRect(new RectF(left,top,right,bottom),paint);

        //画text所占的区域
        Paint.FontMetricsInt fm = paint.getFontMetricsInt();
        int spaceTop = baseLineY + fm.top;
        int spaceBottom = baseLineY + fm.bottom;
        int width = (int)paint.measureText(text);
        Rect rect = new Rect(baseLineX,spaceTop,baseLineX+width,spaceBottom);
        paint.setColor(Color.GREEN);
        canvas.drawRect(rect,paint);
占用空间和显示区域
上一篇下一篇

猜你喜欢

热点阅读