30
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Android】画面サイズに合わせて、動的にView要素のサイズの変更

Last updated at Posted at 2014-03-31

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なんかをおいてみます。

mypage.xml

<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レベルの数値が取得できるので、取得した値の数値で条件分岐しています。

MainActivity.java

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;
	}	
}

以上になります!

30
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?