无法在android画布中居中显示文本

无法在android画布中居中显示文本,android,canvas,paint,Android,Canvas,Paint,我用下面的代码在一个圆圈内写“g”。“g”必须在圆圈内水平和垂直居中。但我不能,我错在哪里 //sv is surfaceview which covers whole screen sv.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,

我用下面的代码在一个圆圈内写“g”。“g”必须在圆圈内水平和垂直居中。但我不能,我错在哪里

//sv is surfaceview which covers whole screen
sv.getHolder().addCallback(new SurfaceHolder.Callback() 
    {

        @Override
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void surfaceCreated(SurfaceHolder arg0) {
            // TODO Auto-generated method stub
            // surfaceview width
            swidth=sv.getWidth();
            sheight=sv.getHeight();
            int height = sheight/3;
            int mat = Math.min(height,swidth/2);
            Paint paint= new Paint(Paint.ANTI_ALIAS_FLAG);
            Paint paint1= new Paint(Paint.ANTI_ALIAS_FLAG);
            Resources r = getResources();
            paint.setColor(Color.CYAN);
            paint1.setColor(Color.BLACK);

            Canvas c = sv.getHolder().lockCanvas();
            c.drawARGB(254, 254, 254, 254);
            String t1="g";
            int ttwidth=determineMaxTextSize(t1, mat/4);
            paint1.setTextSize(ttwidth);
            Rect bounds = new Rect();
            paint1.getTextBounds(t1, 0, 3, bounds);
            c.drawCircle(swidth/4, height+height/2, mat/4, paint);
            c.drawText(t1, swidth/4-bounds.width()/2, height+height/2+bounds.height()/2, paint1);



            sv.getHolder().unlockCanvasAndPost(c);

        }
这是上面代码中使用的方法

private int determineMaxTextSize(String str, float maxWidth)
{
    int size = 0;       
    Paint paint = new Paint();

    do {
        paint.setTextSize(++ size);
    } while(paint.measureText(str) < maxWidth);

    return size;
}
我得到了更好的结果

但是,您可以看到“g”仍然没有对齐

 paint1.setTextAlign(Align.CENTER);
        String t1="N";
        int ttwidth=determineMaxTextSize(t1, mat/4);
        paint1.setTextSize(ttwidth);
        Rect bounds = new Rect();
        paint1.getTextBounds(t1, 0, 3, bounds);
        c.drawCircle(swidth/4, height+height/2, mat/4, paint);
        c.drawText(t1, swidth/4, height+height/2+bounds.height()/2, paint1);

以上代码就是答案

无论我选择什么文本,它仍然没有正确居中它在哪里?你能截屏并告诉我们实际绘制的是什么吗?如果你设置
paint.setTextAlign(Align.CENTER)
@zgc7009,你可以节省一些复杂的计算。更新完成了。我想试试,只是看看它的视觉效果,试着把你的drawText部分改成swidth/4-bounds.width()而不是swidth/4-bounds.width()/2
 paint1.setTextAlign(Align.CENTER);
        String t1="N";
        int ttwidth=determineMaxTextSize(t1, mat/4);
        paint1.setTextSize(ttwidth);
        Rect bounds = new Rect();
        paint1.getTextBounds(t1, 0, 3, bounds);
        c.drawCircle(swidth/4, height+height/2, mat/4, paint);
        c.drawText(t1, swidth/4, height+height/2+bounds.height()/2, paint1);