6

TextviewのgetTextSize()がどのように測定されるかについての言及があるところはどこにも見つかりません。視覚的なテストからは、ディセンダーは含まれていないようですが、アセンダーが含まれているようです。ベースラインから正確に開始しているようにも見えません。

http://en.wikipedia.org/wiki/Descender

これはそれに最も近い言及ですが、GoogleのRomainGuyは質問のその部分を無視しています。

http://www.mail-archive.com/android-developers@googlegroups.com/msg08514.html

複合ドローアブルを使用しているのでこれが必要であり、ドローアブルをさまざまなデバイスのテキストに揃えることができる必要があります。

これは、エッジに接する円を描画可能な複合でテストするために使用したコードです。

tvData.setTextSize(TypedValue.COMPLEX_UNIT_PX, 100);
tvData.setText("agB5ãÂ");

int size = (int)tvData.getTextSize();
Drawable img = getResources().getDrawable(R.drawable.circle_white_full_72 ).mutate();
img.setBounds( 0 , 0 , size , size);
tvData.setCompoundDrawables( null, null, img, null );

これが結果です http://i.imgur.com/zUEzB.png

ご覧のとおり、ディセンダーとアセンダーは使用されていないようです。

他の人がhttp://i.imgur.com/Yhf8b.pngをテストしたい場合は、これが描画可能な画像です

を使用して画像をテキストサイズの80%に変更する場合

int size = (int)tvData.getTextSize() *80/100;

これが結果で、100%の画像の上に画像が置き換えられています。たぶん、setCompoundrawablesは独自のスケーリングを行っています

ここに画像の説明を入力してください

フォントとドローアブルの中点を測定してみましたが、オフになっています。これがそれを強調した画像ですここに画像の説明を入力してください

最後に、描画可能な50ピクセルを左に移動し、出力を測定しました。setTextSizeが100pxに設定されているため、フォントテキストのベースラインからベースラインまでの高さの半分でした。

Androidは、複合ドローアブルをスケーリングおよび配置するために、他のレイアウトを使用している必要があります。多分私はこれについて別の質問を作成する必要があります。これは、ベースラインからベースラインまでを強調した画像です。 ここに画像の説明を入力してください

4

1 に答える 1

4

いくつかの軽いテストから、それは上昇から下降へであるように見えます(テキストサイズ=下降-上昇)。検証するためにTextPaintを使用してデバッグを行いましたが、もう少し具体的に言うと、次のようにしました。

Paint.FontMetricsInt metrics;
for(int i = 1; i < 100; i++) {
    mTextPaint.setTextSize(i);
    metrics = mTextPaint.getFontMetricsInt();
    if((metrics.descent - metrics.ascent) != i) Log.v("type", "Not equal");
}

そして、それは各値に当てはまりました。

于 2012-12-27T23:53:20.550 に答える