2013年6月25日火曜日

dimen.xmlからのdip指定によるgetDimensionの落とし穴

使い方を間違っているだけなのに落とし穴と書いてると怒られそうですが、昨日修正を公開した間取りー図での不具合は、リソースのdimen.xmlでdip単位で書いてある値をSurfaceViewのボタンの大きさ指定に使っているのですが、ここで間違った計算をしているのが原因でした。

最近間取りー図のユーザーレビューで
ボタンが見切れてほとんど使えない
5インチフルHDの画面なんだけど、各種ボタン(+-や反転等の)の大きさが極端に合ってない
という報告が上がってきていて、ボタンはdipの値から計算してサイズ設定しているからそんなはずはないんだけどなぁと思いながら、対象の実機で確認してみると本来は


こうなるべきところが
と報告と同じくえらいでかいサイズになってしまっていました。
原因を探ってみたところ、どうやらxxhdpi(超高解像度)の端末で、このような現象になっている模様。
リソースでの指定は
  <dimen name="button_width">48dp</dimen>

こんな感じ、この値をプログラムでは
int bw = (int)(context.getResources().getDimension(R.dimen.button_width) * context.getResources().getDisplayMetrics().density + 0.5f);

このように値を取得・計算して、最終的にピクセル単位にしてボタンを描画していました。
要はこの計算が間違っていたのですが、どうやらgetDimensionはanyDensityがtrueの場合DisplayMetricsで単位変換されるということのようです。

つまり私はgetDimensionですでに単位変換されている値を、更に単位変換してしまっているので、xxhdpiの場合getDimensionでもとの3倍、それをさらに3倍しているということでした。
あまりこのような使い方をしてる人はいないかもしれませんが、お気を付けて…

参考:【教えてください】TextView等のテキストサイズについて
参考:Converting dp units to pixel units

0 件のコメント:

コメントを投稿