docomoとSoftbankのカタログからスマホ画面の解像度を調べてみた。

☆解像度順
                         縦横比
  800  480  1.67
  854  480  1.78
  960  540  1.78
1024  600  1.71
1280  720  1.78
1280  768  1.67
1280  800  1.60

☆縦横比順
                          縦横比
1280  800  1.60
  800  480  1.67
1280  768  1.67
1024  600  1.71
  960  540  1.78
1280  720  1.78
  854  480  1.78

ということで1280×800、 1024×600、854×480の画面でレイアウトチェックすることにしよう。

横幅の倍率(スケール)をまとめると下図の通り。
新しい画像

線形近似では意味がないので下限の0.65を使うことにしよう。

高さも調査したがいずれも0.70だった。

それで、以下のコマンドにした。
ScaleAnimation scaleAnimation = new ScaleAnimation(0.1f, 0.65f ,0.1f ,0.70f, Animation.RELATIVE_TO_SELF,  0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
 
それでやってみると、       3_22_1 

幅854×高480なら
新しい画像 (1)

幅1024×高600なら 
新しい画像 (3)

 幅1024×高800なら
新しい画像 (5)

幅1280×高800なら
新しい画像 (4)


以下、それまでの道のり
ScaleAnimationの引数をマスターする。
「android ScaleAnimation」で検索。
やってみると画面の縦横幅比が異なるとpivotを(0,0)にしていてもpngイメージが左隅に行かなかったり、指定した倍率より小さめになったりする。これを解決したい。

以前、public class Setumei02Ex extends SurfaceView 内のpublic void draw(Canvas canvas) {の中で使った
w = title_board.getWidth();
h = title_board.getHeight();
src = new Rect(0, 0, w, h);
dst = new Rect(currentX, currentY, (int)(29 * xdot)+currentX, (int)(16 * ydot)+currentY);
canvas.drawBitmap(title_board, src, dst, null);
はうまく稼働したんだけど、
public class Setumei03 extends Activity {内の、public void onCreate(Bundle savedInstanceState) の中で使うScaleAnimation scaleAnimation = new ScaleAnimation(0.0f, 0.65f ,0.0f ,0.7f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); は画面サイズが変わると、縦幅が小さくなり下にずれたり、逆に横幅が小さくなって右にずれたりする。これは縦横どちらか短い方を基準にするためだろうか?
*試しにpublic class Setumei02Ex extends SurfaceView 内にこの関数を入れてみると落ちてしまった。
「android ScaleAnimation 位置決め」「android ScaleAnimation 隅」で検索。→ヒットなし
画面:幅1024×高800では
ScaleAnimation scaleAnimation = new ScaleAnimation(0.1f, 0.65f ,0.1f ,0.81f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 
TranslateAnimation translate = new TranslateAnimation(Animation.RELATIVE_TO_PARENT,0.0f, Animation.RELATIVE_TO_PARENT,-0.175f, Animation.RELATIVE_TO_PARENT,0.3f , Animation.RELATIVE_TO_PARENT,-0.15f);
で左上に幅65%×高70%のPNGイメージが配置できた。
今度はTranslateAnimationを Animation.ABSOLUTEで指定してみる。
TranslateAnimation translate = new TranslateAnimation(Animation.ABSOLUTE,0.10f, Animation.ABSOLUTE,-17.5f * xdot, Animation.ABSOLUTE,30f, Animation.ABSOLUTE,-15f * ydot);
で先と同様に配置できた。
次の画面:幅480×高320では
ScaleAnimation scaleAnimation = new ScaleAnimation(0.1f, 0.65f ,0.1f ,0.7f, Animation.RELATIVE_TO_SELF,  0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
TranslateAnimation translateは変更不要。だから、ScaleAnimationもAnimation.ABSOLUTEで指定してみたいが、最初の4つの引数はスケール(0~1)でしか指定できない。(最後の2つは指定可能)。
それで2つの解像度で引数を自動調節できるようにした。
ScaleAnimation scaleAnimation = new ScaleAnimation(0.1f, 0.65f ,0.1f ,0.022f*ydot+0.6266f, Animation.RELATIVE_TO_SELF,  0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
次の画面:幅430×高240では高さはだいたい良いが、今度は幅が足りない。
ScaleAnimation scaleAnimation = new ScaleAnimation(0.1f, -0.26f*xdot+1.898f ,0.1f ,0.022f*ydot+0.6266f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
画面:幅430×高240はこれでうまくいった。 3_21_1
画面:幅1024×高800ではずれていた。近似式が求められないので引数は0.65fで行こう。
すると
幅480×高320では大丈夫。
幅430×高240では幅が足りない。
幅800×高480では幅が足りない。
幅1024×高800では大丈夫。