サイト移転のお知らせ:http://techbooster.org/に移転しました

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

1月 30, 2011   //   by kei_i_t   //   アプリケーション  //  No Comments

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はプレビュー版の為、正式版では仕様が異なる可能性があります。

関連する記事:

Sponsored Link

Comments are closed.

技術書新刊 発売中

アンドロイドアカデミアには、CIやテスト、互換検証など実務に生きるノウハウをあつめています

技術書新刊 発売中

Android Next!はAndroid 7.0に対応したはじめての技術書です!


The Web Explorer 2はCSSの中央寄せやWebAudioなど未来を読み解く一冊です


Revised TypeScript in DefinitelylandはTypeScript 2.0(β)に対応した解説書です。インストールから型定義まで幅広くサポートしています


技術書をかこう!はエンジニアらしい執筆環境を構築、HowTo本です