Viewの位置やサイズを動的に変更する


Android 3.0(Honeycomb)ではViewクラスに位置やサイズを動的に変更できる便利なメソッドが追加されました。

詳細は以下から。

Android 3.0(Honeycomb)で追加されたViewの位置やサイズを動的に変更するためのメソッドは7種類あります。

setTranslationX (float translationX) X座標位置を引数で指定することで、指定した位置にViewオブジェクトが移動します。
setTranslationY (float translationY) Y座標位置を引数で指定することで、指定した位置にViewオブジェクトが移動します。
setScaleX (float scaleX) 横幅を引数で指定することで、指定したサイズにViewオブジェクトの横幅が変更されます。
setScaleY (float scaleY) 縦幅を引数で指定することで、指定したサイズにViewオブジェクトの縦幅が変更されます。
setRotationX (float rotationX) 引数で角度を指定すると、指定した角度にX軸回転します。
setRotationY (float rotationY) 引数で角度を指定すると、指定した角度にY軸回転します。
setRotation (float rotation) 引数で角度を指定すると、指定した角度でViewオブジェクトの中心点を中心に回転します。

サンプルではシークバーを使用して、動的なViewの位置やサイズ変更を行っています。(サンプルはこちらからSVNでダウンロードしてください。)

以下はサンプルのコードです。

public class ViewAttributeChangeSample extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		final ImageView iv = (ImageView) findViewById(R.id.imageView1);

		// 横位置の変更
		SeekBar tx = (SeekBar) findViewById(R.id.seekBar1);
		tx.setMax(400);
		tx.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onProgressChanged(SeekBar seekbar,
					int i, boolean flag) {
				iv.setTranslationX(i);
			}
		});

		// 縦位置の変更
		SeekBar ty = (SeekBar) findViewById(R.id.seekBar2);
		ty.setMax(800);
		ty.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onProgressChanged(SeekBar seekbar,
					int i, boolean flag) {
				iv.setTranslationY(i);
			}
		});

		// 横幅の変更
		SeekBar sx = (SeekBar) findViewById(R.id.seekBar3);
		sx.setMax(50);
		sx.setProgress(10);
		sx.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onProgressChanged(SeekBar seekbar,
					int i, boolean flag) {
				iv.setScaleX(i);
			}
		});

		// 縦幅の変更
		SeekBar sy = (SeekBar) findViewById(R.id.seekBar4);
		sy.setMax(50);
		sy.setProgress(10);
		sy.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onProgressChanged(SeekBar seekbar,
					int i, boolean flag) {
				iv.setScaleY(i);
			}
		});

		// x軸回転
		SeekBar x = (SeekBar) findViewById(R.id.seekBar5);
		x.setMax(360);
		x.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onProgressChanged(SeekBar seekbar,
					int i, boolean flag) {
				iv.setRotationX(i);
			}
		});

		// y軸回転
		SeekBar y = (SeekBar) findViewById(R.id.seekBar6);
		y.setMax(360);
		y.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onProgressChanged(SeekBar seekbar,
					int i, boolean flag) {
				iv.setRotationY(i);
			}
		});

		// 中心点回転
		SeekBar z = (SeekBar) findViewById(R.id.seekBar7);
		z.setMax(360);
		z.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekbar) {
			}

			@Override
			public void onProgressChanged(SeekBar seekbar,
					int i, boolean flag) {
				iv.setRotation(i);
			}
		});
	}
}

基本的にはシークバーのメモリ位置を各メソッドの引数にすることで、シークバーの位置変更に合わせてViewの位置やサイズを変更する処理になります。

26行目でシークバーのメモリにあわせてX座標位置を変更しています。

46行目でシークバーのメモリにあわせてY座標位置を変更しています。

67行目でシークバーのメモリにあわせて横幅を変更しています。

88行目でシークバーのメモリにあわせて縦幅を変更しています。

108行目はシークバーのメモリにあわせてX軸回転を行う処理です。

128行目はシークバーのメモリにあわせてY軸回転を行う処理です。

148行目はシークバーのメモリにあわせてViewの中心点を中心に回転を行う処理です。

※現在のH0neycomb用APIはプレビュー版の為、正式版では仕様が異なる可能性があります。