android - 用 Canvas 写文字(onDraw View )

标签 android canvas view

我有这个 View (颜色选择器 View )

public class ColorPickerOvalView extends View {

    private Paint paint;
    private Paint centerPaint;
    private Paint paintText;
    private final int[] colorsArray;
    private OnColorChangedListener changedListener;
    private String key;
    private boolean trackingCenter;
    private boolean highlightCenter;

    private RectF rectF;

    private static final int CENTER_X = 120;
    private static final int CENTER_Y = 120;
    private static final int CENTER_RADIUS = 39;
    private static final float PI = 3.1415926f;

    public ColorPickerOvalView(Context context) {
        super(context);
        colorsArray = new int[]{
                0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
                0xFFFFFF00, 0xFFFF0000
        };
    }

    public ColorPickerOvalView(Context context, AttributeSet attrs) {
        super(context, attrs);
        colorsArray = new int[]{
                0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
                0xFFFFFF00, 0xFFFF0000
        };
    }

    public ColorPickerOvalView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        colorsArray = new int[]{
                0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
                0xFFFFFF00, 0xFFFF0000
        };
    }

    public void init(OnColorChangedListener listener, int color, String key) {
        //super(c);
        changedListener = listener;

        Shader shader = new SweepGradient(0, 0, colorsArray, null);

        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setShader(shader);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(50);

        centerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        centerPaint.setColor(color);
        centerPaint.setStrokeWidth(10);

        paintText = new Paint();
        paintText.setColor(Color.WHITE);

        this.key = key;

        float raio = CENTER_X - paint.getStrokeWidth() * 0.5f;
        rectF = new RectF(-raio, -raio, raio, raio);
    }


    @Override
    protected void onDraw(Canvas canvas) {

        canvas.translate(CENTER_X, CENTER_X);

        canvas.drawOval(rectF, paint);
        canvas.drawCircle(0, 0, CENTER_RADIUS, centerPaint);

        //write the text
        canvas.drawText("OK", 0, 0, paintText);

        if (trackingCenter) {
            int color = centerPaint.getColor();
            centerPaint.setStyle(Paint.Style.STROKE);

            if (highlightCenter) {
                centerPaint.setAlpha(0xFF);
            } else {
                centerPaint.setAlpha(0x80);
            }

            canvas.drawCircle(0, 0, CENTER_RADIUS + centerPaint.getStrokeWidth(), centerPaint);

            centerPaint.setStyle(Paint.Style.FILL);
            centerPaint.setColor(color);
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(CENTER_X * 2, CENTER_Y * 2);
    }

    ...

}

我想在圆圈上集中写“OK”,但我的 ok 保持错误(不要集中)。 我需要让这段文字正好位于圆心。

enter image description here

我怎样才能集中这个文本?以及如何更改其大小?

谢谢

最佳答案

您必须将文本向左移动其宽度的一半。这意味着:

float textWidth = paintText.measureText(timeText);
float xOffset = textWidth / 2;
canvas.drawText("OK", -xOffset, 0, paintText);

关于android - 用 Canvas 写文字(onDraw View ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40206179/

相关文章:

java - Android:在后台重复任务。我的做法是否正确?

java - 仅使用 androidTest 代码生成单个 .jar

javascript - 访问没有点和一对括号的变量(parent.child.grandchild)的孙子

java - 值 "attribute"不是 "Model"的成员

jsf - 面孔与可重用 View 一起流动

Android View 设置文字颜色

Java ExecutorService - 监控任务完成/状态栏

javascript - Konva vue js文本滑入舞台然后停止

javascript - 应该在 ctx.lineTo 之前使用 ctx.moveTo

java - 下载zip文件后如何提示 "open with"菜单