libro
www.tuyano.com
Google androidプログラミング入門

画面表示について考える (6/6)

作成:2010-06-18 16:38
更新:2010-06-18 16:38

■画面に関する情報を調べる

フルスクリーンでゲームなどを作成する場合、注意しなければならないのは「機器によって画面サイズやレゾリューションが異なる」という点でしょう。こうした問題は、画面に関する情報を取得し処理することで対応できます。これは「DisplayMetrics」というオブジェクトを取得することで知ることができます。が、これを取り出すのに一手間かかってしまうので、手順をよく頭に入れて置く必要があるでしょう。

1.WindowManagerの取得
WindowManager 変数 = [Activity].getWindowManager();
まず最初に行うのは「WindowManager」というクラスを取得することです。これは文字通りウインドウを管理するためのもので、Activityにある「getWindowManager」メソッドで得ることができます。

2.Displayの取得
Display 変数 = [WindowManager].getDefaultDisplay();
次に、画面を管理するための「Display」クラスを取得します。これはWindowManagerの「getDefaultDisplay」を使って取り出します。

3.DisplayMetricsの用意
DisplayMetrics 変数 = new DisplayMetrics();
準備が整ったところで、DisplayMetricsを用意しましょう。これは、そのままnewでインスタンスを作成します。ただし、この状態では、DisplayMetricsには必要な情報は入っていません。

4.DisplayMetricsの情報を得る
[Display].getMetrics( [DisplayMetrics] );
最後に、Displayの「getMetrics」を使い、DisplayMetricsインスタンスに情報を取り出します。このメソッドは、引数に用意したDisplayMetricsインスタンスに必要な情報を設定するものです。これで、DisplayMetricsインスタンスに表示画面の情報が保管されました。

後は、DisplayMetricsから必要な情報を取り出せばいいだけです。このクラスには、以下のようなフィールドが用意されており、それらの値を取り出して利用できます。

widthPixels――画面の横幅(ピクセル数)
heightPixels――画面の縦幅(ピクセル数)
xdpi――横方向のレゾリューション(DPI)
ydpi――縦方向のレゾリューション(DPI)
density――論理密度(160dpiを基準とした比率)
densityDpi――スクリーン密度(用意された定数で設定)
scaledDensity――スケール密度(用意された定数で設定)

これらの値に応じて表示を調整するようにすれば、画面の大きさやレゾリューションに応じた表示をすることができるようになります。

以下に、簡単なサンプルをあげておきます。起動すると、画面の四隅に同じ大きさの円を表示する例です。画面サイズやレゾリューションが変わっても、ほぼ同じ大きさの円が四隅に表示されます。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

package jp.tuyano;

import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.*;

public class SampleApp extends Activity {
	DisplayMetrics metrics;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Window window = getWindow();
		window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		
		DrawView view = new DrawView(getApplication());
		setContentView(view);
		
		WindowManager manager = this.getWindowManager();
		Display display = manager.getDefaultDisplay();
		metrics = new DisplayMetrics();
		display.getMetrics(metrics);
	}

	class DrawView extends View {

	    public DrawView(Context context) {
	        super(context);
	    }


	    public void onDraw(Canvas c) {
	    	int w = metrics.widthPixels;
	    	int h = metrics.heightPixels;
	    	float d = 100f * metrics.density;
	        c.drawColor(Color.BLACK);
	        
	        Paint fill_paint = new Paint();
	        fill_paint.setStyle(Paint.Style.FILL);
	        fill_paint.setColor(Color.RED);
	        c.drawOval(new RectF(0f, 0f, d, d), fill_paint);
	        c.drawOval(new RectF(w - d, 0f, (float)w, d), fill_paint);
	        c.drawOval(new RectF(0f, h - d, d, (float)h), fill_paint);
	        c.drawOval(new RectF(w - d, h - d, (float)w, (float)h), fill_paint);

	    }

	}
}

※関連コンテンツ

「Google androidプログラミング入門」に戻る