Java 如何使用onDraw在每个矩形的中心显示文本

Java 如何使用onDraw在每个矩形的中心显示文本,java,android,android-canvas,Java,Android,Android Canvas,我正在尝试创建一个文本视图(黑色),其中包含数字1到7(每个数字位于每个灰色矩形的顶部和中心-就像我在下面绘制的图像),但我不确定需要添加哪些属性才能实现这一点。我相信代码需要进入循环部分,但我不知道是什么代码。如何使数字集中在每个灰色矩形中 期望的结果 当前结果 公共类矩形文本视图扩展视图{ 专用最终油漆mBackPaint=新油漆(); 私人最终油漆mRedPaint=新油漆(); 私有int mSideRectWidth=10; 公共矩形文本视图(上下文、属性集属性){ 超级(上下文,

我正在尝试创建一个文本视图(黑色),其中包含数字1到7(每个数字位于每个灰色矩形的顶部和中心-就像我在下面绘制的图像),但我不确定需要添加哪些属性才能实现这一点。我相信代码需要进入循环部分,但我不知道是什么代码。如何使数字集中在每个灰色矩形中

期望的结果

当前结果

公共类矩形文本视图扩展视图{
专用最终油漆mBackPaint=新油漆();
私人最终油漆mRedPaint=新油漆();
私有int mSideRectWidth=10;
公共矩形文本视图(上下文、属性集属性){
超级(上下文,attrs);
mBackPaint.setColor(颜色:黑色);
mRedPaint.setColor(颜色:红色);
}
@覆盖受保护的void onDraw(画布){
super.onDraw(帆布);
如果(getWidth()==0)
返回;
//画灰盒
setBackgroundColor(Color.parseColor(#808080”);
int-boxWidth=getWidth()/7;
//在每个矩形的中心绘制黑线和/或文本
对于(int i=0;i<7;i++){
画布.绘图线(mSideRectWidth+boxWidth*i,0,mSideRectWidth+boxWidth*i,getHeight(),mBackPaint);
canvas.drawText(?);
}
//在每个矩形的中心绘制文本
?
//绘制左端矩形
drawRect(0,0,mSideRectWidth,getHeight(),mRedPaint);
//绘制右端矩形
drawRect(getWidth()-mSideRectWidth,0,getWidth(),getHeight(),mRedPaint);
}
}
使用
canvas.drawText()
。你可以在画黑线的同一个循环中完成

for (int i = 0; i < 7; i++) {
    canvas.drawLine(mSideRectWidth + boxWidth * i, 0, mSideRectWidth + boxWidth * i, getHeight(), mBackPaint);
    float x = ...
    float y = ...
    canvas.drawText(Integer.toString(i + 1), x, y, mBlackPaint);
}
for(int i=0;i<7;i++){
画布.绘图线(mSideRectWidth+boxWidth*i,0,mSideRectWidth+boxWidth*i,getHeight(),mBackPaint);
浮点x=。。。
浮点y=。。。
画布.drawText(整数.toString(i+1),x,y,mBlackPaint);
}

您必须计算文本放置的x和y值。如果使用
paint.setTextAlign(Align.CENTER)
,则简化了x值计算,它正好位于黑线之间。

使用paint.getTextBounds()方法获取文本的边界区域,然后可以从生成的Rect对象中提取垂直和水平方向的精确中心:

    Paint paint = new Paint();
    paint.setTextSize( textSize );

    Rect bounds = new Rect();
    if( text != null )
        paint.getTextBounds(text, 0, text.length(), bounds);
    else
        bounds.set(0,0,0,0);

    location.x -= bounds.exactCenterX();
    location.y -= bounds.exactCenterY();

对于x和y位置,是GetWidgeh还是getHeight除以2?您需要为每段文本计算它们。如果您按照我所描述的那样设置绘画的文本对齐,那么
x
应该是黑线之间距离的一半
y
有点难回答,但您可以从
getHeight()/2
开始,然后进行调整。请注意,如果其中任何信息在计算
y
值时有用,则可以从paint对象获取字体度量。
    Paint paint = new Paint();
    paint.setTextSize( textSize );

    Rect bounds = new Rect();
    if( text != null )
        paint.getTextBounds(text, 0, text.length(), bounds);
    else
        bounds.set(0,0,0,0);

    location.x -= bounds.exactCenterX();
    location.y -= bounds.exactCenterY();