2016-08-06 19 views
1

私は内部にテキストを描画する矩形を持っています。テキストを縦と横の中央に揃えたいので、矩形内のすべての文字に合わせるためにテキストサイズを変更する必要があります。ここに私のコードは次のとおりです。矩形内のテキストの中央揃えと自動サイズ変更

@Override 
public void drawFixedText(String text, Rect rect, Paint paint) { 
    paint.setAntiAlias(true); 
    paint.setStyle(Paint.Style.FILL); 

    int cX = rect.left; 
    int cY = rect.top; 

    float textSize = paint.getTextSize(); 
    paint.setTextSize(textSize); 

    float textWidth = paint.measureText(text); 

    while (textWidth > rect.width()) { 
     textSize--; 
     paint.setTextSize(textSize); 
    } 

    //if cX and cY are the origin coordinates of the your rectangle 
    //cX-(textWidth/2) = The x-coordinate of the origin of the text being drawn 
    //cY+(textSize/2) = The y-coordinate of the origin of the text being drawn 

    canvas.drawText(text, cX-(textWidth/2), cY+(textSize/2), paint); 
} 

私はCalculate text size according to width of text areaAndroid draw text into rectangle on center and crop it if needed

からの回答を結合しようとしたが、それはテキストが四角形の代わりに、その内部の左側に配置されていることで動作しませんでした。これをどうすれば解決できますか?

+0

'cX'は' Rect'の左側ですので、テキストの幅の半分を減算したくありません。むしろ、あなたは 'Rect'の水平中点からそれを減算したいと思います。すなわち、rect.centerX() - (textWidth/2) 'である。また、サイズを変更した後は、毎回テキスト幅を測定する必要があります。つまり、 'textWidth = paint.measureText(text);'も 'setTextSize()'の呼び出しの後にループ内になければなりません。 –

+0

これで、私はこれを行い、矩形の左上端の上に見かけ上テキストを移動させました。 –

+0

これは、あなたが投稿したコードの場所です。私が示唆したようにx座標を変更した場合、テキストはRectの上辺の中央に配置する必要があります。あなたのビルドが最新であることを確認してください。つまり、変更後にクリーンで再構築します。また、私はちょうどそれが垂直にも中心に欲しいと気づいたので、あなたはY座標のために何か類似のことをする必要があります。 –

答えて

0

まず、サイズを設定するたびにテキストの幅を測定する必要があります。それ以外の場合は、テキストがRectよりも広い場合は無限ループになります。

while (textWidth > rect.width()) { 
    textSize--; 
    paint.setTextSize(textSize); 
    textWidth = paint.measureText(text); 
} 

はその後、水平にテキストを中央に、あなたはないcXがスニペットになりますものですその左端から、Rectの水平方向の途中からテキスト幅の半分を減算します。つまり、drawText()コールでcX - (textWidth/2)rect.centerX() - (textWidth/2)に置き換えます。

さらに、テキストを垂直方向にセンタリングするには、y座標と同様の操作を行う必要があります。ただし、テキストサイズを使用しても正しい結果は得られません。テキストの実際の高さとベースラインからのオフセットを測定する必要があります。これはPaint#getTextBounds()メソッドを使用して行うことができます。

public void drawFixedText(String text, Rect rect, Paint paint) { 
    paint.setAntiAlias(true); 
    paint.setStyle(Paint.Style.FILL); 

    float textSize = paint.getTextSize(); 
    float textWidth = paint.measureText(text); 

    while (textWidth > rect.width()) { 
     textSize--; 
     paint.setTextSize(textSize); 
     textWidth = paint.measureText(text); 
    } 

    Rect bounds = new Rect(); 
    paint.getTextBounds(text, 0, text.length(), bounds); 

    canvas.drawText(text, 
        rect.centerX() - textWidth/2, 
        rect.centerY() - (bounds.top + bounds.bottom)/2, 
        paint); 
} 

これがデフォルトPaintインスタンスを前提としていることに注意してください:よう

要するに、これらの変更は何かを与えるだろう。つまり、テキストの配置に影響を与えるプロパティは、このメソッドに入るデフォルト値を持ちます。

関連する問題