1

プロジェクトでテキストを描画canvas.drawText(...)し、さまざまなデバイスでテストしました。

ただし、テキストのサイズは画面ごとに大きく異なります。

私はそれを掛けようとしましgetResources().getDisplayMetrics().densityたが、それらはまだ同じサイズではありません.

異なるデバイスでテキストを同じサイズにする方法はありますか?

4

4 に答える 4

1

こんにちは、この投稿http://catchthecows.com/?p=72をご覧ください。役立つと思います。@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh);

    // save view size
    mViewWidth = w;
    mViewHeight = h;

    // first determine font point size
    adjustTextSize();
    // then determine width scaling
    // this is done in two steps in case the
    // point size change affects the width boundary
    adjustTextScale();
}


void adjustTextSize() {
    mTextPaint.setTextSize(100);
    mTextPaint.setTextScaleX(1.0f);
    Rect bounds = new Rect();
    // ask the paint for the bounding rect if it were to draw this
    // text
    mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);

    // get the height that would have been produced
    int h = bounds.bottom - bounds.top;

    // make the text text up 70% of the height
    float target = (float)mViewHeight*.7f;

    // figure out what textSize setting would create that height
    // of text
    float size  = ((target/h)*100f);

    // and set it into the paint
    mTextPaint.setTextSize(size);
}


void adjustTextScale() {
    // do calculation with scale of 1.0 (no scale)
    mTextPaint.setTextScaleX(1.0f);
    Rect bounds = new Rect();
    // ask the paint for the bounding rect if it were to draw this
    // text.
    mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);

    // determine the width
    int w = bounds.right - bounds.left;

    // calculate the baseline to use so that the
    // entire text is visible including the descenders
    int text_h = bounds.bottom-bounds.top;
    mTextBaseline=bounds.bottom+((mViewHeight-text_h)/2);

    // determine how much to scale the width to fit the view
    float xscale = ((float) (mViewWidth-getPaddingLeft()-getPaddingRight())) / w;

    // set the scale for the text paint
    mTextPaint.setTextScaleX(xscale);
}

@Override
protected void onDraw(Canvas canvas) {
    // let the ImageButton paint background as normal
    super.onDraw(canvas);

    // draw the text
    // position is centered on width
    // and the baseline is calculated to be positioned from the
    // view bottom
    canvas.drawText(mText, mViewWidth/2, mViewHeight-mTextBaseline, mTextPaint);
}

https://github.com/catchthecows/BigTextButton

于 2013-02-07T14:50:50.763 に答える
0

これは何だ

getResources()。getDisplayMetrics()。density

密度の異なる同じ画面サイズでも同じように見えるということです。あなたの動きに感謝します。

あなたの問題には2つの解決策があります。1. Large、xlarge、および通常のレイアウトを試してください。均等に見えるように、それぞれのレイアウトに応じてそれらを調整します。

  1. キャンバスの画面占有率(キャンバスの高さ/幅および右/左/上/下をパーセンテージで取得して、異なる画面で均等に調整します)。そしてそれをlayoutParamsとして適用します。
于 2013-02-07T14:53:04.687 に答える
0

Paint クラスは、テキスト サイズをピクセル単位で受け取ります。テキストを直接描画する場合は、paint.setTextSize(float size) を呼び出す前に単位変換を処理する必要があります。常に sp または dp 単位を使用し、小さい画面、通常の画面、大きい画面、特大画面用に少なくとも個別の dimens.xml リソースを含めることができます。

于 2013-02-28T10:11:57.127 に答える
0

Canvas.drawText()テキストサイズを呼び出すと、渡されたPaintオブジェクトによって最初に決定されます。これは、 で設定できますPaint.setTextSize()Canvasテキスト サイズは、キャンバスの密度に基づいて自動的にスケーリングされます。これは、 を使用して確認できますCanvas.getDensity()

Canvas に描画されるペイント オブジェクトのテキスト サイズを設定する場合は、dpまたはの単位値を使用spして、Canvas にスケーリングを処理させます。

もちろん、画面サイズに応じて異なる値を指定する必要があるかもしれません:複数画面のサポート

于 2016-02-11T20:38:34.680 に答える