【教えてください】TextView等のテキストサイズについて

9,555 views
Skip to first unread message

micco

unread,
May 30, 2010, 12:04:23 PM5/30/10
to 日本Androidの会
こんばんは。
miccoです。

静的レイアウトはXMLで、動的レイアウトはコードで記述していますが、
TextView等のテキストサイズをXMLで指定した場合とコードで指定した
場合とで、エミュレーター上での表示サイズが違っています。

【XML】
android:textSize="20px"

【コード】
textView.setTextSize(20.0f);

基本的なことで恐縮ですが、理由が分かりませんので、どなたかご教示
頂ければ幸いです。

よろしくお願いいたします。

Kd

unread,
May 30, 2010, 12:18:28 PM5/30/10
to android-g...@googlegroups.com
こんばんわ。
Rと申します。

textView.setTextSize(20.0f);
これはScaled pixel(sp)です。
ピクセルではありません。

android:textSize="20px"
これを
android:textSize="20sp"
にしてはどうでしょう?

間違っていたらすいません。

micco

unread,
May 30, 2010, 11:58:15 PM5/30/10
to 日本Androidの会
Rさん

こんにちは。
miccoです。

コメントありがとうございます!
spですか。。。使ったことが無い単位なので、すっかり忘れていました。
ちょっと試してみます。

spに馴染みが無いのは、spが何を基準に大きさが決まるのかピンと来て
ないために、これまで使用を避けてきたことにあります。
「20sp」とした場合、どういう解像度の場合に20ピクセルになるのでしょう?
ピントはずれな質問でしたらゴメンなさい。。。

ちなみに、逆にコードでpx指定も可能でしょうか?
よろしくお願いいたします。

Kd

unread,
May 31, 2010, 1:22:13 AM5/31/10
to android-g...@googlegroups.com
こんにちわRです。
エミュレータでの表示が異なるということなので、どの解像度でも同じ表示を
させようとしているのだと思います。


そのときはピクセルはやめたほうがいいです。
320*480(HVGA)と480*800(WVGA)の20ピクセルは表示がずれます。


レイアウトにはdipを使ってテキストはspで記述すると同じ表示になります。


これはデバイス独立ピクセルというものでピクセルサイズが違うデバイスでも
同じように表示してくれます。
(縦は同じにならないようなのでスクロールビューなどが必要になる場合もあります)

ドキュメントにはdipもspも同じ?みたいなことが書かれていて、spは字体サイズで調整されるという風なことが書かれていて、そして
実際エディタでは20dipも20spも表示が同じでした。

dipとspが同じような計算方法だとすれば(間違ってたらごめんなさい)、

QVGA  20sp -> 15ピクセル(1sp  0.75倍)
HVGA  20sp -> 20ピクセル (1sp 1倍)
WVGA 20sp -> 30ピクセル(1sp 1.5倍)


このサイトがいいです。(日本語にしないといけませんが・・・)
http://developer.android.com/intl/ja/guide/topics/resources/more-resources.html
ここにspとdipがあります。

http://developer.android.com/intl/ja/guide/practices/screens_support.html
ここは異なるデバイスで表示させるようなことが書いています。

あんざいゆき

unread,
May 31, 2010, 1:55:18 AM5/31/10
to android-g...@googlegroups.com
micco さん

 単位の定義は
 に書いてあります。

 ブログに和訳載せたので、よかったらどうぞ

 sp はフォント用の単位で、解像度だけでなく、ユーザーが設定した
 フォントサイズにも依存します。
 とはいえ、そんな設定みたことないんですけど、だれか知ってる人いるのかな?


2010年5月31日14:22 Kd <osusia...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。



--
あんざい ゆき
anzai...@gmail.com
twitter : @yanzm

micco

unread,
May 31, 2010, 11:58:27 PM5/31/10
to 日本Androidの会
Rさん、あんざいさん

こんにちは。
miccoです。

ご丁寧にコメントを頂きまして、ありがとうございました!
spを使った方がデザイン的に良さそうですね。
今後ともよろしくお願いします。

On 5月31日, 午後2:55, あんざいゆき <anzai.y...@gmail.com> wrote:
> micco さん
>
> 単位の定義はhttp://developer.android.com/intl/ja/guide/topics/resources/more-reso...
> に書いてあります。
>
> ブログに和訳載せたので、よかったらどうぞhttp://y-anz-m.blogspot.com/2010/05/androiddimension.html
>
> sp はフォント用の単位で、解像度だけでなく、ユーザーが設定した
> フォントサイズにも依存します。
> とはいえ、そんな設定みたことないんですけど、だれか知ってる人いるのかな?
>
> 2010年5月31日14:22 Kd <osusiandb...@gmail.com>:
>
>
>
>
>
> > こんにちわRです。
> > エミュレータでの表示が異なるということなので、どの解像度でも同じ表示を
> > させようとしているのだと思います。
>
> > そのときはピクセルはやめたほうがいいです。
> > 320*480(HVGA)と480*800(WVGA)の20ピクセルは表示がずれます。
>
> > レイアウトにはdipを使ってテキストはspで記述すると同じ表示になります。
>
> > これはデバイス独立ピクセルというものでピクセルサイズが違うデバイスでも
> > 同じように表示してくれます。
> > (縦は同じにならないようなのでスクロールビューなどが必要になる場合もあります)
>
> > ドキュメントにはdipもspも同じ?みたいなことが書かれていて、spは字体サイズで調整されるという風なことが書かれていて、そして
> > 実際エディタでは20dipも20spも表示が同じでした。
>
> > dipとspが同じような計算方法だとすれば(間違ってたらごめんなさい)、
>
> > QVGA 20sp -> 15ピクセル(1sp 0.75倍)
> > HVGA 20sp -> 20ピクセル (1sp 1倍)
> > WVGA 20sp -> 30ピクセル(1sp 1.5倍)
>
> > このサイトがいいです。(日本語にしないといけませんが・・・)
>
> >http://developer.android.com/intl/ja/guide/topics/resources/more-reso...
> > ここにspとdipがあります。
>
> >http://developer.android.com/intl/ja/guide/practices/screens_support....
> > ここは異なるデバイスで表示させるようなことが書いています。
>
> > --
> > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> > このグループから退会するには、android-group-j...@googlegroups.com<android-gro-up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。
>
> --
> あんざい ゆき
> anzai.y...@gmail.com
> twitter : @yanzm- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

micco

unread,
Jun 1, 2010, 12:20:05 PM6/1/10
to 日本Androidの会
こんばんは。
miccoです。

フォントサイズ指定はsp、その他のサイズ指定はdpにしようと、XMLとコードを
見直していますが、例えば、LinearLayoutのsetPadding()メソッドの場合、引数
で渡すサイズはpx数のようです。
Buttonの幅指定なども同様ですが、dpで指定する方法をご存知でしょうか?
リファレンスを探してみましたが、見つけることができませんでした・・・。
ご教示頂ければ幸いです。
> > > このグループから退会するには、android-group-j...@googlegroups.com<android-gro--up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。
>
> > --
> > あんざい ゆき
> > anzai.y...@gmail.com
> > twitter : @yanzm- 引用テキストを表示しない -
>
> > - 引用テキストを表示 -- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

Kd

unread,
Jun 1, 2010, 9:04:56 PM6/1/10
to android-g...@googlegroups.com
こんにちわRです。

        DisplayMetrics metrics = new DisplayMetrics(); 
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        m_DisplayScale = metrics.scaledDensity;

        setPadding(0, 0, (int)(40*m_DisplayScale), (int)(40*m_DisplayScale));

僕はこんな感じで計算しています。

http://labs.techfirm.co.jp/android/m_yamada/1668
こちらの方に教えて頂きました。

しかしどうしても動的にコードでしないといけないのであれば仕方ありませんが、
Paddingもボタンの幅もXMLでdip(dp)指定すれば勝手に計算してくれて楽です。

<Button android:id="@+id/Button01"
 android:layout_width="100dip"  //wrap_contentなどを直接100dipに変える
android:layout_height="60dip"   //wrap_contentなどを直接60dipに変える
android:textSize="15sp"
android:paddingLeft="15dip"
android:paddingRight="15dip">
</Button>

ボタンやパディングなどはXMLエディタで指定できますのでこっちのほうがおすすめです。

あんざいゆき

unread,
Jun 1, 2010, 9:44:44 PM6/1/10
to android-g...@googlegroups.com
miccoさん

 あんざいです。
 ブログに単位のことしか書いてなくてごめんなさい。
 の単位の記述のあとに、
 単位自体を res で定義する方法が書いてあります。。
 (余裕があればブログに書きます)

 簡単に説明すると、
 /res/values/dimens.xml
 を作ります。(dimens.xml は別の名前でもOK)
 で、dimens.xml の中身で

<?xml version="1.0" encoding="utf-8"?>
<resources>
   
<dimen name="textview_height">25dp</dimen>
   
<dimen name="textview_width">150dp</dimen>
   
<dimen name="ball_radius">30dp</dimen>
   
<dimen name="font_size">16sp</dimen>
</resources>

 のように、単位(というかサイズ)を定義します。
 コード側でこのサイズを

Resources res = getResources();
float fontSize = res.getDimension(R.dimen.font_size);

 のように呼べばOKです。
 ちなみに、getDimension(int) の説明はここ
 DisplayMetrics に応じて単位変換してくれるみたいです。
 ちなみに、setPadding のように int が引数の関数に使う場合は、
 たぶん
 getDimensionPixelSize(int) です。
 戻り値が int なだけで、getDimension(int) と同じみたい
 converted to integer pixels と書いてあります。
 
 参考になればさいわいです。

---
あんざいゆき
twitter : yanzm

2010年6月2日1:20 micco <gou...@gmail.com>:
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

micco

unread,
Jun 2, 2010, 10:09:37 AM6/2/10
to 日本Androidの会
こんばんは。
miccoです。

Rさん、あんざいさん、ありがとうございます!
動的にレイアウトを生成する場合は、コードで書かざるを得ないですが、
両方を使い分けるのも一苦労です。

単位の記述の後に、そんな解説があったんですね。
大学院生の頃は英語の論文を読んでいたのに、社会人になって10年以上
経つと読もうという気力も自由な時間もなく、つい人に頼ってしまいます。
頑張ります。


On 6月2日, 午前10:44, あんざいゆき <anzai.y...@gmail.com> wrote:
> miccoさん
>
> あんざいです。
> ブログに単位のことしか書いてなくてごめんなさい。
> 実は、http://developer.android.com/intl/ja/guide/topics/resources/more-reso...
> の単位の記述のあとに、
> 単位自体を res で定義する方法が書いてあります。。
> (余裕があればブログに書きます)
>
> 簡単に説明すると、
> /res/values/dimens.xml
> を作ります。(dimens.xml は別の名前でもOK)
> で、dimens.xml の中身で
>
> <?xml version="1.0" encoding="utf-8"?>
> <resources>
> <dimen name="textview_height">25dp</dimen>
>
> <dimen name="textview_width">150dp</dimen>
>
> <dimen name="ball_radius">30dp</dimen>
>
> <dimen name="font_size">16sp</dimen>
> </resources>
>
> のように、単位(というかサイズ)を定義します。
> コード側でこのサイズを
>
> Resources res = getResources()
> <http://developer.android.com/reference/android/content/Context.html#g...()>;
> float fontSize = res.getDimension
> <http://developer.android.com/reference/android/content/res/Resources....)>(R.dimen.font_size);
>
> のように呼べばOKです。
> ちなみに、getDimension(int) の説明はここhttp://developer.android.com/intl/ja/reference/android/content/res/Re...)
> DisplayMetrics に応じて単位変換してくれるみたいです。
> ちなみに、setPadding のように int が引数の関数に使う場合は、
> たぶん
> getDimensionPixelSize(int) です。http://developer.android.com/intl/ja/reference/android/content/res/Re...)<http://developer.android.com/intl/ja/reference/android/content/res/Re...)>
> 戻り値が int なだけで、getDimension(int) と同じみたい
> converted to integer pixels と書いてあります。
> 参考になればさいわいです。
>
> ---
> あんざいゆき
> anzai.y...@gmail.com
> > > > > このグループから退会するには、android-group-j...@googlegroups.com<android-gro-up-japan%2Bunsu...@googlegroups.com>
> > <android-gro--up-japan%2Bunsu...@googlegroups.com<android-gro--up-japan-%252Buns...@googlegroups.com>
> > >にメールを送信してください。
> > > > > 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
> > からこのグループにアクセスしてください。
>
> > > > --
> > > > あんざい ゆき
> > > > anzai.y...@gmail.com
> > > > twitter : @yanzm- 引用テキストを表示しない -
>
> > > > - 引用テキストを表示 -- 引用テキストを表示しない -
>
> > > - 引用テキストを表示 -
>
> > --
> > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> > このグループから退会するには、android-group-j...@googlegroups.com<android-gro-up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。

micco

unread,
Jun 6, 2010, 10:54:05 AM6/6/10
to 日本Androidの会
こんばんは。
miccoです。

以下のリソースファイルを作成し、コードで引用してテキストビューを表示して
みましたが、レイアウトファイルから引用して表示したテキストビューと文字サ
イズが違って見えます(コードで引用した方が大きい)。

レイアウトファイル内のテキストビューでは、
「android:textSize="@dimen/font_midium_sp"」
とサイズ指定してあります。

原因が分からず困っています。
お気づきの点をご教示頂けたら幸いです。

【dimens.xml】
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="font_small_sp">12sp</dimen>
<dimen name="font_midium_sp">14sp</dimen>
<dimen name="font_large_sp">16sp</dimen>
</resources>

【コード】
log = new TextView(this);
log.setTextSize(getResources().getDimension(R.dimen.font_midium_sp));
log.setTextColor(getResources().getColor(R.color.color2));
log.setText("gerrogero");
linearLayout.addView(log);

以上
> > > > > > このグループから退会するには、android-group-j...@googlegroups.com<android-gro--up-japan%2Bunsu...@googlegroups.com>
> > > <android-gro--up-japan%2Bunsu...@googlegroups.com<android-gro--up-japan--%252Buns...@googlegroups.com>
> > > >にメールを送信してください。
> > > > > > 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
> > > からこのグループにアクセスしてください。
>
> > > > > --
> > > > > あんざい ゆき
> > > > > anzai.y...@gmail.com
> > > > > twitter : @yanzm- 引用テキストを表示しない -
>
> > > > > - 引用テキストを表示 -- 引用テキストを表示しない -
>
> > > > - 引用テキストを表示 -
>
> > > --
> > > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> > > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> > > このグループから退会するには、android-group-j...@googlegroups.com<android-gro--up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。
>
> > --
> > あんざい ゆき
> > anzai.y...@gmail.com
> > twitter : @yanzm- 引用テキストを表示しない -
>

micco

unread,
Jun 9, 2010, 11:36:53 PM6/9/10
to 日本Androidの会
こんにちは。
miccoです。

特に追加コメントがありませんので、おかしいことは無いないと自信を
もって(?)、開発環境の問題にしてしおうかと思います。

同じAVD(OS1.6&VGA)を立ち上げても日によって表示される解像
度が違っていたり、また、毎回最初のエミュレーター起動で勝手にキャ
ンセルされて再度立ち上げ直したりと、よく分からない不具合が幾つか
あります。。。PCのメモリ不足が悪さしてそうですが。

まだ手元に実機がありませんので、また実機テストができましたら、報
告させて頂くつもりです。
> > > > > > > このグループから退会するには、android-group-j...@googlegroups.com<android-gro---up-japan%2Bunsu...@googlegroups.com>
> > > > <android-gro--up-japan%2Bunsu...@googlegroups.com<android-gro--up-japan---%252Buns...@googlegroups.com>
> > > > >にメールを送信してください。
> > > > > > > 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
> > > > からこのグループにアクセスしてください。
>
> > > > > > --
> > > > > > あんざい ゆき
> > > > > > anzai.y...@gmail.com
> > > > > > twitter : @yanzm- 引用テキストを表示しない -
>
> > > > > > - 引用テキストを表示 -- 引用テキストを表示しない -
>
> > > > > - 引用テキストを表示 -
>
> > > > --
> > > > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> > > > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> > > > このグループから退会するには、android-group-j...@googlegroups.com<android-gro---up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > > > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。
>
> > > --
> > > あんざい ゆき
> > > anzai.y...@gmail.com
> > > twitter : @yanzm- 引用テキストを表示しない -
>
> > > - 引用テキストを表示 -- 引用テキストを表示しない -
>

Kd

unread,
Jun 10, 2010, 12:19:03 AM6/10/10
to android-g...@googlegroups.com
こんにちわ Rです!


<?xml version="1.0" encoding="utf-8"?>
<resources>
       <dimen name="font_small_sp">12sp</
dimen>
       <dimen name="font_midium_sp">14sp</dimen>
       <dimen name="font_large_sp">16sp</dimen>
</resources>

<resources>これを用いた方法は僕やったことないのですが・・・



    <TextView android:id="@+id/TextView01" android:layout_height="wrap_content"
        android:layout_width="wrap_content" android:text="Android 12334567 あいうえお"
        android:textSize="40sp" />  <-(デバッグ用)spがコードでちゃんと変わったか確認するため

    <TextView android:id="@+id/TextView02" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:textSize="20sp"
        android:text="Android 12334567 あいうえお" />

この同じ文字を20spと40spで縦に並べて表示して、
        TextView t = (TextView)main.this.findViewById(R.id.TextView01);
        t.setTextSize(20);

とすると同じサイズの文字がやはり表示されました。

うーん<resources>がおかしいのか・・・・それとも

僕の過去の失敗として
1、setTextSize(20);を設定したのに文字サイズがかわらず。
2、原因がわからず
3、コードを見直してみる
4、ぜんぜん別なところにsetTextSize(40);があった
5、setTextSize(40);がsetTextSize(20);の後にあっため、文字サイズが変わらなかった
動的にUIに手を加えたときにこんな失敗がありました。


エミュレータでは、最初1回目の起動時にレイアウトが崩れるという風なことが
僕にも何回かありました。
でも2回目の起動時にはちゃんとレイアウトが整っていました。

1度単純なレイアウト配置をして調べてみてはいかがでしょう?

micco

unread,
Jun 13, 2010, 11:37:42 PM6/13/10
to 日本Androidの会
Rさん

こんにちは。
miccoです。

コメントありがとうございます!
HVGAサイズのエミュレーターで実行すると、XMLとコードとで同じサイズで表示されています。
WVGAサイズのエミュレーターで実行すると、コードで記述したTextViewやButtonのテキスト
の方が大きいサイズで表示されて、レイアウトが崩れます。
HVGAとWVGAとで、XMLで設定したレイアウト表示を見比べると、WVGAの方が少し大きく
見えますので、同じ見た目になっていません。
エミュレーターがおかしい気もしますが、もう少し悩んでみます。

Kd

unread,
Jun 14, 2010, 12:22:09 AM6/14/10
to android-g...@googlegroups.com
こんにちわRです。

dipやspで記述すると HVGAー>WVGA にすると元のピクセルの1.5倍になります。
HVGAとWVGAを見比べると、WVGAはすこし大きくなっているはずです。
これが標準の動作です。

テキストは1.5倍されているっぽいですね。

1.5倍されたテキストによって、TextViewやButtonのレイアウトがくずれるんでしょうか?
TextViewなどのPaddingやwidthもdipで記述していますか?
コードで記述するとピクセルなので1.5倍計算しなくてはなりません。

そしたら全部のレイアウトが1.5倍になってWVGAでもHVGAの見た目ぽくなります。
(リストビューなどのリスト項目はHVGAよりもおおく表示されます)


あとは・・・
マニュフェストファイルの
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true" />
</manifest>

になってますでしょうか?
書いていなければ1.6以上なら標準で全部trueなのでいいのですが。









micco

unread,
Jun 14, 2010, 10:00:05 AM6/14/10
to 日本Androidの会
こんばんは。
miccoです。

以下のリソースをレイアウトXMLで定義したテキストとコードで定義したテキストとで2点サイズ比較してみました。
【リソースXML】
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="font_midium_sp">16sp</dimen>
</resources>

①コードでサイズを直接指定した場合の表示サイズを調べると・・・
【コード】
log.setTextSize(16);
⇒XMLで「android:textSize="@dimen/font_midium_sp"」を指定したテキストと同じサイズで表示されまし
た。
⇒同じサイズというだけですが、どちらも16spになっていると思われます。

②getDimension()を使った場合の表示サイズを調べると・・・
【コード】
log.setTextSize(getResources().getDimension(R.dimen.font_midium_sp))
⇒setTextSize(24)で表示したものと同じサイズでした。つまり、24sp=16sp×1.5になっています。
⇒リソース情報を「16px」と認識し、「24sp」に変換してしまっているようにも思えます。
⇒もしかしてgetDimensionの使い方を間違えているのでしょうか。。。


上記はWVGA画面ですが、HVGA画面で実行すると、①も②も全てXMLで16sp指定したテキストと同じ表示になります。
HVGA画面は1px=1spなので、16×1=16spで表示されているのだと思います。

micco

unread,
Jun 15, 2010, 11:52:32 AM6/15/10
to 日本Androidの会
こんばんは。
miccoです。

もういいよ、と言われそうですが。。。
Logに「getResources().getDimension(R.dimen.font_midium_sp)」の戻り値を出力してみると、
案の定、「24.0」になっていました。WVGAでは、16sp×1.5=24pxですね。
DisplayMetricsで単位変換されるという意味は、px数に変換されるということなんでしょうか?
だとすると、Rさんが以前書かれていたscaledDensityを取得して、getDimensionの戻り値を割って
得た数値(=sp)をsetTextSizeの引数に渡すという方法が正しいということになりますが・・・。

こんな不便な使い方って本当でしょうか^^;
常識問題ならゴメンナサイ。
> > 書いていなければ1.6以上なら標準で全部trueなのでいいのですが。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

Yuki Anzai

unread,
Jun 15, 2010, 12:05:02 PM6/15/10
to android-g...@googlegroups.com
micco さん

 あんざいです。
 AndroidManifest.xml の anyDensity はチェックしましたか?
 これが、false だと (この場合は)1.5 倍されますが、
 true だとされないはずです。
 true/false で同じように dump して、変わるかどうか確かめて
 みたらいかがでしょうか?

Kd

unread,
Jun 15, 2010, 9:47:20 PM6/15/10
to android-g...@googlegroups.com
こんにちわ!Rです。

>もういいよ、と言われそうですが。。。
いえそんなことはありません。
ただgetDimension()を僕自身が使ったことがなく、答えることができない感じです(汗
僕の知識でよければお役に立ててもらおうと思っています。

>Logに「getResources().
getDimension(R.dimen.font_midium_sp)」の戻り値を 出力してみると、
案の定、「24.0」になっていました。

これはかなりいいヒントをもらいました。

XMLで16spとしたら、setTextSize(16)にしなけれいけないと思います。

ということは、getDimension()の使い方が間違っているのかもしれません。
僕も動的にテキストのサイズを変えたことがありますが
XMLで20spにしたとこはsetTextSize(20)にしていました。

1度getDimension()なしでやってみてください。




micco

unread,
Jun 15, 2010, 11:44:37 PM6/15/10
to 日本Androidの会
あんざいさん、Rさん

こんにちは。miccoです。
お付き合いありがとうございます。

>あんざいさん
Rさんの指摘を受ける前は特にAndroidManifest.xmlのanyDensityは指定していませんで
したが、念のためtrueを設定してテストしています。
falseを指定した場合の挙動は別途テストしてみます。

>Rさん
getDimension()を使わずにsetTextSize(16)とすると、XMLで16spを指定したTextViewと同
じ大きさになります。


なお、以下のような形でscaledDensityを取得し、getDimension()の戻り値を割り戻すことで
正常な表示になります(scaledDensity=1.5なので当然の結果ですが)。
そもそもgetDimension()メソッドに単位変換ロジックが入っていないのなら、こんな方法は間
違いですね。他に何か考慮すべき点があるのかもしれません。

//sp-px間変換倍率
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
float sd = metrics.scaledDensity;
//フォントサイズ変換
float font_midium_sp =
getResources().getDimension(R.dimen.font_midium_sp)/sd;
//フォントサイズ指定
textView.setTextSize(font_midium_sp);

以上

micco

unread,
Jun 16, 2010, 10:26:10 AM6/16/10
to 日本Androidの会
こんばんは。
miccoです。

AndroidManifest.xmlについて、以下の設定を試してみました。
<supports-screens
 android:largeScreens="true"
 android:normalScreens="true"
 android:smallScreens="true"
 android:anyDensity="false" />
</manifest>

すると、XMLとコードで設定したTextViewのフォントサイズが一致しました。
そして、getDimension(R.dimen.font_midium_sp)」の戻り値をダンプすると「16.0」でした。
この場合、横320pxのロゴ画像を表示しているのですが、横いっぱいに拡大されて表示されています。
また、TextViewの横サイズ指定として、LinearLayout.LayoutParams()に(int)(100*sd)を渡しており、
sd=1.5なので150pxが指定されているはずですが、画面の半分ほどの横サイズになっています。
つまり、WVGAサイズのAVDであっても、HVGAサイズの画面として表示サイズ調整されるようです。

anyDensityをあまり理解できていないのですが、これで正しい挙動でしょうか?
この設定の場合、WVGAでもHVGAでも全く同じ見た目にすることができそうですが、せっかくの高ス
ペックを無視するのは勿体無いですね。

一方で、android:anyDensity="true"に戻すと、やはり1.5倍の「24.0」が戻ってきます。
このままsetTextSizeで設定すると、24spで表示されますので、XMLで同じリソースを取得して設定し
ているTextViewとは異なる大きさとなります。
ん~これは正しい挙動なんでしょうか?

リソースからサイズ取得するのを諦めて直接数値を入れてやれば解決する話ですが、それではリソー
スで設定する意味が薄れてしまいます。
どこに問題があるのかはっきりさせたいです。
> > 1度getDimension()なしでやってみてください。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

Yuki Anzai

unread,
Jun 16, 2010, 11:02:22 AM6/16/10
to android-g...@googlegroups.com
micco さん

 こんばんは
 あんざいです。

 たぶん micco さんが勘違いしているんだと思います。

 まず、WVGA と HVGA では単位長さあたりのピクセル数が異なります。
 つまり、WVGA で 100px の長さと、HVGA での 100px の
 物理的な長さ(ディスプレイ上に定規を当てて図った長さ)は
 異なります。これがいわゆる解像度が違うということです。

 anyDensity についてですが、
 名前のとおり、これが true ということは、
 any density = すべての解像度にコード側で(自分で)対応
 するなり、layoutフォルダを画面サイズごとに用意するなり、
 drawable フォルダを解像度ごとに用意するなりしていますよ
 という意味です。
 なので、Layoutparams や setTextSize などコードで指定した pixel size
 がそのまま表示されます。setTextSize(10) は 10px で表示されます
 つまり、解像度の高い端末の方が低い端末よりも小さく表示されます。

 ただし、XMLの方で dp や sp で指定すると解像度が異なる端末でも
 同じ表示になるはずです。
 つまり、コード側で setTextSize(10) とした場合と、XMLで
 android:textSize="10sp" とした場合の大きさは端末によって違います。
 160 dpi の画面で 1 dp = 1 px なので、160 dpi の端末なら、
 同じ大きさになるということです。
 #setTextSize の引数は pixel です。

 anyDensity = false というのは、そいういう対処をしていないので、
 コード側で設定しているピクセル値を解像度に応じて調整してください
 ということです。 この場合、コード側で setTextSize(10) とした場合と
 XMLで android:textSize="10sp"とした場合の大きさは端末の
 解像度によらず同じになります。

 ただし、Xperia では anyDensity = false にすると、drawable-hdpi ではなく
 drawable-mdpi に格納した画像が使われるという問題があります。
 
 私は、
 anyDensity = true にして、
 XML側で sp や dp でサイズ指定し、コード側で指定しなければならない
 場合は、 XMLで dimension を設定して、それを getDimension して
 setTextSize などに渡しています。

> 一方で、android:anyDensity="true"に戻すと、やはり1.5倍の「24.0」が戻ってきます。
> このままsetTextSizeで設定すると、24spで表示されますので、XMLで同じリソースを取得して設定し
> ているTextViewとは異なる大きさとなります。

 これの意味がよくわからないのですが、このままsetTextSize(24) とした場合
の意味は、
 24sp で表示されるのではなく、24px で表示されるということですよ。16sp
を解像度調整して、
 HVGA で16sp のサイズを WVGA だと 24px になるから、24が返ってきているん
です。
 spの単位だと 16sp のままです。なので、XML で 24sp と指定した場合とサイ
ズがことなるのは
 当たり前です。XMLで16sp と指定した場合と同じになるような処理だからです。

 わかりにく説明でごめんなさい
 うまく理解できるといいのですが。

 あんざい

Rabbit-U

unread,
Jun 16, 2010, 7:58:02 PM6/16/10
to 日本Androidの会
Referenceを見ると
setTextSize(TypedValue.COMPLEX_UNIT_PX, size_px)
なんて感じに指定できるようです。

Kd

unread,
Jun 16, 2010, 8:33:44 PM6/16/10
to android-g...@googlegroups.com

おはようございます。Rです。

miccoさんの結果からして、getDimension()の戻り値はどうもWVGAでの16*1.5された実際のピクセルのようですね。

ごめんさない。getDimension()の使い方はあってました。
setTextSize()がsp指定だったのが原因のようです。

レイアウトのLayoutParamsなんかはピクセルをいれるようになってるので、getDimension()そのままの値でもいけると思います。

しかしsp指定のsetTextSize(24)ということはまたさらに1.5倍された36ピクセルで表示されたようです。

spやdip(dp)は、現場(ユーザーの機器の状況)によって調節されます。

僕ら開発者は抽象化された16spと打つだけで、ユーザーの現場ではWVGAなら1.5倍、QVGAなら0.75倍されるという、なかなか都合のよいもの だと思っています。


>float font_midium_sp = getResources().getDimension(R.dimen.font_midium_sp)/sd;

は計算してみると数値はあってますね。
1.5倍されちゃうんだから、前もって1.5で割ればいけそうです。


あんざいさんの

>名前のとおり、これが true ということは、
any density = すべての解像度にコード側で(自分で)対応
するなり、
layoutフォルダを画面サイズごとに用意するなり、
drawable フォルダを解像度ごとに用意するなりしていますよ
という意味です。


わかりやすい説明ですね!

any densityをfalseにすると実は全部レイアウトをピクセル指定でもいけます。
しかし僕もdrawable-mdpiしかつかわれない(領域に適した画像がつかわれない)ということをつかんでいます。
おそらくほかにもサポートされない機能があると思いますし、これから追加されるかもしれない機能がサポートされないかもしれないのでany densityはtrueをオススメします。
これはOS1.5でのアプリの画像対応のようです。

これをお聞きしたのは、もしかしてOS1.5で作成しているのかな?とおもったからです。


あんざいゆき

unread,
Jun 16, 2010, 9:12:53 PM6/16/10
to android-g...@googlegroups.com
Rさん

 setTextSize の引数は scaled pixel でしたね。
 私も勘違いしてました。

>しかしsp指定のsetTextSize(24)ということはまたさらに1.5倍された36ピクセルで表示されたようです。 

 まさにそれっぽいですね。
 anyDensity = false だとそうなってしまいます。
 getDimension で 1.5倍されて、かつ anyDensity = false で さらに 1.5倍 = 36 px なら
 XMLの 24sp とは異なりますね。

 あんざい


2010年6月17日9:33 Kd <osusia...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。



--
あんざい ゆき
anzai...@gmail.com
twitter : @yanzm

micco

unread,
Jun 17, 2010, 12:04:41 AM6/17/10
to 日本Androidの会
Rさん、あんざいさん

こんにちは。
miccoです。

諸々コメントありがとうございます!
WVGAはOS2.0で作成したAVDで試しております。
繰り返しになりますが、「<dimen name="font_midium_sp">16sp</dimen>」、かつWVGAでテストした結果
は、
①anyDensity = true ⇒
getResources().getDimension(R.dimen.font_midium_sp) = 24.0
②anyDensity = false ⇒
getResources().getDimension(R.dimen.font_midium_sp) = 16.0
であることをLogにて確認しました。
つまり、①の場合にgetDimensionで1.5倍されていますので、あんざいさんのご指摘と異なります。
この場合、setTextSizeに24spが指定されるため、結果、36pxで表示され、XMLで指定した16sp(=24px)よりも大きく表示さ
れます。

あんざいさんの
> 名前のとおり、これが true ということは、
> any density = すべての解像度にコード側で(自分で)対応
> するなり、
> layoutフォルダを画面サイズごとに用意するなり、
> drawable フォルダを解像度ごとに用意するなりしていますよ
> という意味です。
というご説明は理解し易かったのですが、最初の「すべての解像度にコード側で(自分で)対応していますよ」という意味については、
だからプラットフォーム側で何もしないで!という宣言ではなく、現在の解像度に応じて普通にサイズ調整しても問題ないよ!と宣言
していると考えると、何となく実際に起こっていることと合致する気がします。
なお、falseの場合、WVGAでも160dpiと同じ見た目になりますので、1ドットが1.5倍に拡大されています。



On 6月17日, 午前10:12, あんざいゆき <anzai.y...@gmail.com> wrote:
> Rさん
>
> setTextSize の引数は scaled pixel でしたね。
> 私も勘違いしてました。
>
> >しかしsp指定のsetTextSize(24)ということはまたさらに1.5倍された36ピクセルで表示されたようです。
>
> まさにそれっぽいですね。
> anyDensity = false だとそうなってしまいます。
> getDimension で 1.5倍されて、かつ anyDensity = false で さらに 1.5倍 = 36 px なら
> XMLの 24sp とは異なりますね。
>
> あんざい
>
> 2010年6月17日9:33 Kd <osusiandb...@gmail.com>:
> > このグループから退会するには、android-group-j...@googlegroups.com<android-gro-up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。
>
> --
> あんざい ゆき
> anzai.y...@gmail.com
> twitter : @yanzm- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

あんざいゆき

unread,
Jun 17, 2010, 12:19:27 AM6/17/10
to android-g...@googlegroups.com
micco さん

 あんざいです。
 私の指摘と異なってませんけど。。。
 anyDensity の話は、コード側の setWidth とか
 FrameParams とかの話で、getDimension の
 話ではありません。
 anyDensity = true のときにgetDimension の
 値が、 WVGA で (HVGA の)1.5 倍になるのは正しいです。
 getDimension は自分で解像度対応するために利用するものなので、
 たぶん anyDensity = true でしか使わないと思います。
 だから、この値を true と false で比較しても意味ないかと。。。


2010年6月17日13:04 micco <gou...@gmail.com>:
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

micco

unread,
Jun 17, 2010, 11:20:00 AM6/17/10
to 日本Androidの会
こんばんは。
miccoです。

このグループ内で最長のスレッドになったのではないでしょうか^^;
かなり理解が進みましたので、そろそろ終わりにいたしますね。
あとは、自分で試行錯誤してみます。

>Rabbit-Uさん
コメント頂いていたのに、お返事が遅くなりました。
setTextSize(TypedValue.COMPLEX_UNIT_PX, size_px)の示唆を頂き、誠にありがとうございます。
これを使えば、ピクセル指定できますので、getDimension()で取得した数値をそのまま使うことができますね。
実際にエミュレーターで試してみたところうまく表示されました。
scaledDensityで割るよりも、このコンストラクターを使うのが正攻法なのかもしれません。
・・・という私の結論に至りました。

>あんざいさん
> > anyDensity = false だとそうなってしまいます。
> > getDimension で 1.5倍されて、かつ anyDensity = false で さらに 1.5倍 = 36 px なら
> > XMLの 24sp とは異なりますね。
と書かれていたのですが、私のエミュレーターでは②の結果のとおり「anyDensity=false」のときに
「getDimensionで1.5倍」になっていなかったため、その事実を淡々と書かせて頂いたものです。
画面密度に関して考えたのが初めてでしたので、色々と勘違いもあったかと思います。
色々とご教示ありがとうございました。そして飲み込みが悪くてごめんなさい!

>Rさん
色々とご教示ありがとうございました。
お付き合い頂いて、非常に助かりました。


以上、今後とも宜しくお願いいたします。
> > <android-gro-up-japan%2Bunsu...@googlegroups.com<android-gro-up-japan%2-52Buns...@googlegroups.com>
> > >にメールを送信してください。
> > > > 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
> > からこのグループにアクセスしてください。
>
> > > --
> > > あんざい ゆき
> > > anzai.y...@gmail.com
> > > twitter : @yanzm- 引用テキストを表示しない -
>
> > > - 引用テキストを表示 -
>
> > --
> > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
Reply all
Reply to author
Forward
0 new messages