148

テキストの高さを測定する簡単な方法はありますか? 私が現在行っている方法は、ペイントを使用しmeasureText()て幅を取得し、試行錯誤して値を見つけて、おおよその高さを取得することです。私も をいじっていますFontMetricsが、これらはすべておおよその方法のようです。

さまざまな解像度に合わせてスケーリングしようとしています。それはできますが、相対的なサイズを決定するために多くの計算を行う非常に冗長なコードになってしまいます。私はそれが嫌いです!もっと良い方法があるはずです。

4

8 に答える 8

145

paint.getTextBounds() (オブジェクトメソッド)はどうですか

于 2010-09-27T15:02:01.500 に答える
89

@brampの答えは正しいです-部分的には、計算された境界が、0、0の暗黙的な開始座標を持つテキストを完全に含む最小の長方形になることについて言及していません。

つまり、たとえば「Py」の高さは、「py」、「hi」、「oi」、「aw」の高さとは異なります。これは、ピクセル単位で異なる高さが必要になるためです。

これは決して従来の Java の FontMetrics と同等ではありません。

テキストの幅はそれほど問題ではありませんが、高さは問題です。

特に、描画されたテキストを垂直方向に中央揃えにする必要がある場合は、描画するテキストを使用する代わりに、テキスト "a" (引用符なし) の境界を取得してみてください。私のために働く...

これが私が意味することです:

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.LINEAR_TEXT_FLAG);

paint.setStyle(Paint.Style.FILL);
paint.setColor(color);
paint.setTextAlign(Paint.Align.CENTER);
paint.setTextSize(textSize);

Rect bounds = new Rect();
paint.getTextBounds("a", 0, 1, bounds);

buffer.drawText(this.myText, canvasWidth >> 1, (canvasHeight + bounds.height()) >> 1, paint);
// remember x >> 1 is equivalent to x / 2, but works much much faster

テキストを垂直方向に中央揃えにするということは、外接する四角形を垂直方向に中央揃えにすることを意味します。これはテキスト (大文字、長い文字など) によって異なります。しかし、実際にやりたいことは、レンダリングされたテキストのベースラインを揃えて、隆起したり溝ができたりしないようにすることです。したがって、最小の文字 (たとえば "a") の中心がわかっていれば、残りのテキストにその配置を再利用できます。これにより、すべてのテキストが中央に配置され、ベースラインが配置されます。

于 2012-08-02T07:02:07.127 に答える
16

高さは、ペイント変数に設定したテキスト サイズです。

高さを知る別の方法は、

mPaint.getTextSize();
于 2014-06-17T14:33:06.743 に答える
3

クラスを使用して、android.text.StaticLayout必要な境界を指定してから を呼び出すことができますgetHeight()。メソッドを呼び出すことで、(レイアウトに含まれる) テキストを描画できますdraw(Canvas)

于 2013-03-15T01:17:45.387 に答える
2

getTextSize() メソッドを使用して、ペイント オブジェクトのテキスト サイズを簡単に取得できます。例えば:

Paint mTextPaint = new Paint (Paint.ANTI_ALIAS_FLAG);
//use densityMultiplier to take into account different pixel densities
final float densityMultiplier = getContext().getResources()
            .getDisplayMetrics().density;  
mTextPaint.setTextSize(24.0f*densityMultiplier);

//...

float size = mTextPaint.getTextSize();
于 2012-12-15T16:30:13.903 に答える
1

Rect.width()代わりにand Rect.Height()which returned from を使用する必要がありますgetTextBounds()。それは私にとってはうまくいきます。

于 2012-04-06T08:07:41.720 に答える
0

誰かがまだ問題を抱えている場合、これは私のコードです。

正方形 (幅 = 高さ) のカスタム ビューがあり、それに文字を割り当てたいと考えています。onDraw()私は使用していませんが、文字の高さを取得する方法を示しています。画面中央にキャラクターが表示されます。

public class SideBarPointer extends View {

    private static final String TAG = "SideBarPointer";

    private Context context;
    private String label = "";
    private int width;
    private int height;

    public SideBarPointer(Context context) {
        super(context);
        this.context = context;
        init();
    }

    public SideBarPointer(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        init();
    }

    public SideBarPointer(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.context = context;
        init();
    }

    private void init() {
//        setBackgroundColor(0x64FF0000);
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        height = this.getMeasuredHeight();
        width = this.getMeasuredWidth();

        setMeasuredDimension(width, width);
    }

    protected void onDraw(Canvas canvas) {
        float mDensity = context.getResources().getDisplayMetrics().density;
        float mScaledDensity = context.getResources().getDisplayMetrics().scaledDensity;

        Paint previewPaint = new Paint();
        previewPaint.setColor(0x0C2727);
        previewPaint.setAlpha(200);
        previewPaint.setAntiAlias(true);

        Paint previewTextPaint = new Paint();
        previewTextPaint.setColor(Color.WHITE);
        previewTextPaint.setAntiAlias(true);
        previewTextPaint.setTextSize(90 * mScaledDensity);
        previewTextPaint.setShadowLayer(5, 1, 2, Color.argb(255, 87, 87, 87));

        float previewTextWidth = previewTextPaint.measureText(label);
//        float previewTextHeight = previewTextPaint.descent() - previewTextPaint.ascent();
        RectF previewRect = new RectF(0, 0, width, width);

        canvas.drawRoundRect(previewRect, 5 * mDensity, 5 * mDensity, previewPaint);
        canvas.drawText(label, (width - previewTextWidth)/2, previewRect.top - previewTextPaint.ascent(), previewTextPaint);

        super.onDraw(canvas);
    }

    public void setLabel(String label) {
        this.label = label;
        Log.e(TAG, "Label: " + label);

        this.invalidate();
    }
}
于 2013-06-07T09:47:54.080 に答える