Androidの端末ごとの画面サイズ依存に悩まされていたので、いいやり方がないか調べたのでメモ。
レイアウト側のxmlでのサイズ指定で[android:layout_weight="1"]といったかたちで比率を指定していくのが基本だけれど、
どうしてもフォントサイズとか、上手くいかないことが多い。
なので、動的に画面サイズを取得して、フォントサイズやなんやらを変えて処理する方法をネットで探してみました。
参考サイト:[画面解像度に合わせた、フォントのサイズを指定する]
(http://andante.in/i/android%E3%82%A2%E3%83%97%E3%83%AAtips/%E7%94%BB%E9%9D%A2%E8%A7%A3%E5%83%8F%E5%BA%A6%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%9F%E3%80%81%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E6%8C%87%E5%AE%9A/)
もろActivity側で書いてあるので、それをstaticなメソッドに変えて、画面サイズの取得方法も、AndroidのAPIのバージョンによって処理を変えてみました。
##画面サイズに合わせた変更方法
基準となるようなstone.png(画面サイズ幅480pxを基準として、480px X 1pxとしました。)をdrawableのディレクトリのなかに仕込ませて、その画像の幅サイズを取得し、実際にアプリを起動させる端末の画面サイズを取得して、その倍率がどれくらいかに合わせて、動的にフォントサイズとかいろいろ変えていくという流れです。
##実装
1.stone.pngの仕込み
Photoshopとか、なにかの画像編集ツールをつかって、480px X 1pxの画像をつくり、res > drawable のなかに仕込みます。
###2.レイアウト側
とりあえず、適当にTextViewなんかをおいてみます。
<LinearLayout
android:id="@+id/linearLayout_mypage_welcome"
android:layout_width="match_parent"
android:layout_height="80dip"
android:orientation="vertical" >
<TextView
android:id="@+id/textView_mypage_welcome"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ようこそ○○○さん" />
</LinearLayout>
###3.プログラム側
setScaleSize(Context context)というstaticメソッドにしました。
これだと、Activityを渡せば、MainActivityに書かないでツール系メソッドのクラス内にまとめられるので、使いやすいです。
画面サイズ取得のメソッド、getWidth()がAndroidのAPIレベル13以降は非推奨になっているので、13より前と13以降で処理を変えています。
Integer.valueOf(android.os.Build.VERSION.SDK_INT) でアプリを起動している端末のAndroidのAPIレベルの数値が取得できるので、取得した値の数値で条件分岐しています。
public class MainActivity extends Activity {
private TextView welcomeText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mypage);
findView();
// 指定のテキストビューのテキストサイズに倍率をかける
welcomeText.setTextSize(14 * setScaleSize(this.getApplicationContext()));
}
public void findView() {
welcomeText = (TextView) findViewById(R.id.textView_mypage_welcome);
}
/**
* drawableにstone.png(480px×1px)を仕込ませて、幅サイズの基準値にして、
* 画面サイズによって拡大縮小の調整をする。
* @param context
* @return float
*/
public static float setScaleSize(Context context) {
//stone.pngを読み込んでBitmap型で扱う
Bitmap _bm = BitmapFactory.decodeResource(context.getResources(),
R.drawable.stone);
float width = 0;
float _scale = 0;
//画面サイズ取得の準備
WindowManager wm = (WindowManager) context.getSystemService(WINDOW_SERVICE);
Display disp = wm.getDefaultDisplay();
// AndroidのAPIレベルによって画面サイズ取得方法が異なるので条件分岐
if (Integer.valueOf(android.os.Build.VERSION.SDK_INT) < 13) {
Log.d("TEST", "12までのが来てる!");
width = disp.getWidth();
} else {
Log.d("TEST", "13以降が来てる!");
Point size = new Point();
disp.getSize(size);
width = size.x;
}
_scale = (float) width / (float) _bm.getWidth();
return _scale;
}
}
以上になります!