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でダウンロードしてください。)
以下はサンプルのコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | 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はプレビュー版の為、正式版では仕様が異なる可能性があります。