天天看點

自定義控件-繪制文字-drawText

如何保證自己的繪制的文字居中?

`// 第一類 根據坐标

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

public void drawText (String text, int start, int end, float x, float y, Paint paint)

public void drawText (CharSequence text, int start, int end, float x, float y, Paint paint)

public void drawText (char[] text, int index, int count, float x, float y, Paint paint)

// 第二類 drawPosText ()是根據一個個坐标點指定文字位置

public void drawPosText (String text, float[] pos, Paint paint)

public void drawPosText (char[] text, int index, int count, float[] pos, Paint paint)

// 第三類 drawTextOnPath ()是根據路徑繪制

public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)

public void drawTextOnPath (char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)`

想要文字居中,重點就是要找到控件的中心點。

如圖:

自定義控件-繪制文字-drawText
自定義控件-繪制文字-drawText

具體代碼:

`

package com.example.vitomvp.ui;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.RectF;

import android.util.AttributeSet;

import android.util.Log;

import android.view.View;

import androidx.annotation.Nullable;

/**

  • 必須要在設定了畫筆Paint的文字大小,寬度等屬性,
  • 才能擷取FontMetrics
  • Paint.FontMetrics fontMetrics=paint.getFontMetrics();
  • fontMetrics.top

  • fontMetrics.ascent

  • fontMetrics.descent

  • fontMetrics.bottom

*/

public class TwwView extends View {

public TwwView(Context context) {

this(context,null);

}

public TwwView(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs,0);
}

public TwwView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //背景框
    Paint paint = new Paint();
    paint.setColor(Color.YELLOW);
    paint.setStyle(Paint.Style.FILL);
    RectF rectF = new RectF(200,200,800,600);//逆時針
    canvas.drawRect(rectF,paint);

    Paint textPaint = new Paint();
    textPaint.setColor(Color.BLUE);
    textPaint.setStrokeWidth(5);
    textPaint.setStyle(Paint.Style.FILL);
    textPaint.setTextSize(50);
    textPaint.setTextAlign(Paint.Align.CENTER);

    String string ="base Text";
    //計算基線baseLine 文字基線類似于一個坐标0點
    Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
    Log.d("tww","fontMetrics.bottom:"+fontMetrics.bottom);
    Log.d("tww","fontMetrics.top:"+fontMetrics.top);
    Log.d("tww","fontMetrics.ascent:"+fontMetrics.ascent);
    Log.d("tww","fontMetrics.descent:"+fontMetrics.descent);
     /*
    * 距離 = 文字高度的一半 - 基線到文字底部的距離(也就是bottom)
        = (fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottom
    * */
    float distance = (fontMetrics.bottom-fontMetrics.top)/2-fontMetrics.bottom;
    //文字的y點=就是矩形的中心Y值+矩形中心到基線的距離
    float baseLine = rectF.centerY()+distance;
    canvas.drawText(string,rectF.centerX(),baseLine,textPaint);

}