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