SurfaceView特集 第2回

SurfaceView特集

 今回で2回目の特集になります。今回はSurfaceViewが使う座標について特集したいと思います。

SurfaceViewが使う座標単位について

 SurfaceViewが使う座標単位にピクセル(px)を使います。SurfaceViewでラインを引くときや画像を伸縮するときなど、 様々な場面で ピクセル を使っています。

ピクセルと端末の説明

 スマートフォンやタブレットなどの端末はそれぞれ解像度って言うものがあります。解像度って言うのは、その端末が どこまで細かく表現できるかという度合のことです。そういえば、端末毎に縦/横方向に表示できるサイズ違いますね。

昔の端末と画面を比べると、随分綺麗になっていると思いませんか?
これは端末のサイズはほとんど変わらず、解像度が大きくなったからです。解像度が大きくなると、より細かな部分まで 表現できるようになるため綺麗に見えるんです。

例えば、端末の横縦サイズが5cmで、A端末と解像度の2倍の解像度を持つB端末があったとします。この端末に同じ写真を 画面全体に表示した場合、B端末の方が綺麗に表示されることになります。これはB端末の方が解像度が高く、 A端末と同じ5cm四方に凝縮されているピクセルの数が違うからです。

 なぜそうなるのか、表示した画像が10cm四方の画像だったとします。A端末では10cmの画像を無理やり5cmの枠に 押し込もうとします。この時、画像の情報は失われて劣化することで画像が汚くなったのです。一方B端末では5cmの枠に 押し込もうとしますが、解像度がA端末の2倍あるのでA端末程ぎゅぅぎゅぅに押し込まなくても5cmの枠に収まります。 そのため、画像の劣化が少なくなりA端末より綺麗に表示されるわけです。
※ディスプレイの技術が上がり画面が綺麗になることはありますが、今回はそこら辺は考慮しないで説明を書いています。

ピクセル単位がSurfaceViewに与える影響

ディスプレイが5cmで解像度が512pxのA端末と1024pxのB端末があったとします。SurfaceViewで線を512pxの長さ引くと、 A端末では端まで到達するのに対して、B端末では全然端まで到達しません。これでは、矩形や画像を表示する際、 端末ごとに見た目が変わり同じように表示することはできません。レイアウトに拘ってアプリを作る時は大問題ですね。

SurfaceViewでも同じ長さの線を引くには?

 では、解像度が違う端末で同じように線を引くのはどうすれば良いのでしょうか?そこで、登場するのが「DP」と 言う単位です。実は、アンドロイドのスマートフォンは大体が縦/横の「DP」は同じなのです。

解像度が違くても「DP」の概念を持って考えれば、違う解像度の端末におけるSurfaceViewでも違う同じように レイアウトを書くことができます。
 SurfaceViewが受け付ける単位はあくまでもピクセルです。なので、SurfaceViewに与える数値はDPからピクセルに変換 しなければいけません。そこで、登場するのが「density」と言う変数です。これは以下のように取得することができます。
Activity#getResources().getDisplayMetrics().density
Activityを継承したクラスで取得することができます。それでは次に「density」を使って「DP」をSurfaceViewに渡す数値で あるピクセル値に変換してみましょう。以下のような数式で計算できます。
px = dp × density
非常に簡単ですね。アンドロイドのスマートフォンの場合、同じ大きさの端末に対して「density」は解像度が高い端末では 高く設定されており、解像度が低い端末では低く設定されています。

まとめ

 SurfaceViewは数値をピクセル単位で扱う。スマートフォンは解像度が一定ではないが、「DP」と言う単位の下では 一定の数値に統一されている。すなわち、「DP」の単位で設計を行い、SurfaceViewにはピクセルに変換した値を使えば良い。 「DP」をピクセルに変換するには以下の数式を使えば良い。
px = dp × density
以上です。
メッセージを残す
名前: メッセージ:
Copyright © takamax All Rights Reserved