Andrind之Animation详解

Animation

前言:在Android开发中,动画效果是经常用到的,比如说在启动页面时的动态展示LOGO,这篇文章主要讲解四大补间动画。

Animation的四种类型

  • TranslateAnimation 实现位置移动的动画效果
  • AlphaAnimation 实现渐变透明度的动画效果
  • ScaleAnimation 实现图形缩的放动画效果
  • RoateAnimation 实现旋转的动画效果

下面来看一下总体的效果图:

Animation效果图

注:实现这中动画效果有两种方式,一种是用过配置xml配置文件实现,另外一种是直接通过编写Java代码实现,本篇文章我们主要介绍第二种方式(Java代码)实现

Activity的xml文件如下

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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_centerInParent="true"
android:id="@+id/iv"
android:src="@mipmap/ic_launcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:weightSum="4"
android:gravity="bottom"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:layout_weight="1"
android:id="@+id/btn_tran"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="平移" />
<Button
android:layout_weight="1"
android:id="@+id/btn_alpha"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="透明" />
<Button
android:layout_weight="1"
android:id="@+id/btn_roate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="旋转" />
<Button
android:layout_weight="1"
android:id="@+id/btn_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="缩放" />
<Button
android:layout_weight="1"
android:text="组合"
android:id="@+id/btn_set"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>

四大种类的属性

通用属性

setRepeatCount(int repeatCount) 设置动画的重复次数,当repeatCount等于-1时,标识无限循环 setDuration(long durationMillis) 设置动画的播放时长
setRepeatMode(int repeatMode) 设置动画的重复方式,Animation.REVERSR:反向
Animation.RESTART:重新开始(默认)
setFillAfter(boolean fillAfter) 动画执行完后是否停留在执行完的状态
true:停留在执行完的状态
false:停留在动画开始前的状态


1.TranslateAnimation 平移动画

创建TranslateAnimation对象
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
参数说明:
float fromXDelta 动画开始的点离当前View X坐标上的差值
float toXDelta 动画结束的点离当前View X坐标上的差值
float fromYDelta 动画开始的点离当前View Y坐标上的差值
float toYDelta 动画开始的点离当前View Y坐标上的差值

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
public class AnimationActivity extends AppCompatActivity {
private ImageView iv;
private Button btn_tran, btn_alpha, btn_rotate, btn_scale, btn_set;
private static Animation animation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation);
iv = (ImageView) findViewById(R.id.iv);
btn_tran = (Button) findViewById(R.id.btn_tran);
btn_alpha = (Button) findViewById(R.id.btn_alpha);
btn_rotate = (Button) findViewById(R.id.btn_roate);
btn_scale = (Button) findViewById(R.id.btn_scale);
btn_set = (Button) findViewById(R.id.btn_set);
btn_tran.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
参数说明:
float fromXDelta 动画开始的点离当前View X坐标上的差值
float toXDelta 动画结束的点离当前View X坐标上的差值
float fromYDelta 动画开始的点离当前View Y坐标上的差值
float toYDelta 动画开始的点离当前View Y坐标上的差值
*/
animation = new TranslateAnimation(0.5f, 200f, 0.5f, 0.5f);
//该动画重复次数 -1代表无限循环
animation.setRepeatCount(-1);
//设置动画的播放时长 单位为毫秒
animation.setDuration(500);
//设置动画重复方式 Animation.REVERSR:反向 Animation.RESTART:重新开始
animation.setRepeatMode(Animation.REVERSE);
////动画执行完后是否停留在执行完的状态
animation.setFillAfter(true);
//为图片添加动画,并开始动画
iv.startAnimation(animation);
}
});
}
}

2.AlphaAnimation 渐变透明度动画

创建TranslateAnimation对象
AlphaAnimation(float fromAlpha, float toAlpha)
参数说明:
float fromAlpha 动画开始时的透明度 透明度范围:0表示全透明 1标识完全不透明
float toAlpha 动画结束时的透明度

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
public class AnimationActivity extends AppCompatActivity {
private ImageView iv;
private Button btn_tran, btn_alpha, btn_rotate, btn_scale, btn_set;
private static Animation animation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation);
iv = (ImageView) findViewById(R.id.iv);
btn_tran = (Button) findViewById(R.id.btn_tran);
btn_alpha = (Button) findViewById(R.id.btn_alpha);
btn_rotate = (Button) findViewById(R.id.btn_roate);
btn_scale = (Button) findViewById(R.id.btn_scale);
btn_set = (Button) findViewById(R.id.btn_set);
btn_alpha.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
AlphaAnimation(float fromAlpha, float toAlpha)
参数说明:
float fromAlpha 动画开始时的透明度 透明度范围:0表示全透明 1标识完全不透明
float toAlpha 动画结束时的透明度
*/
animation = new AlphaAnimation(0.2f, 1.0f);
//该动画重复次数 -1代表无线循环
animation.setRepeatCount(-1);
//设置动画的播放时长 单位为毫秒
animation.setDuration(200);
//设置动画重复方式 Animation.REVERSR:反向 Animation.RESTART:重新开始
animation.setRepeatMode(Animation.REVERSE);
////动画执行完后是否停留在执行完的状态
animation.setFillAfter(true);
//为图片添加动画,并开始动画
iv.startAnimation(animation);
}
});
}
}

3.TranslateAnimation 旋转动画效果

创建TranslateAnimation对象
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
参数说明:
float fromXDelta 动画开始的点离当前View X坐标上的差值
float toXDelta 动画结束的点离当前View X坐标上的差值
float fromYDelta 动画开始的点离当前View Y坐标上的差值
float toYDelta 动画开始的点离当前View Y坐标上的差值

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
public class AnimationActivity extends AppCompatActivity {
private ImageView iv;
private Button btn_tran, btn_alpha, btn_rotate, btn_scale, btn_set;
private static Animation animation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation);
iv = (ImageView) findViewById(R.id.iv);
btn_tran = (Button) findViewById(R.id.btn_tran);
btn_alpha = (Button) findViewById(R.id.btn_alpha);
btn_rotate = (Button) findViewById(R.id.btn_roate);
btn_scale = (Button) findViewById(R.id.btn_scale);
btn_set = (Button) findViewById(R.id.btn_set);
btn_tran.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
参数说明:
float fromXDelta 动画开始的点离当前View X坐标上的差值
float toXDelta 动画结束的点离当前View X坐标上的差值
float fromYDelta 动画开始的点离当前View Y坐标上的差值
float toYDelta 动画开始的点离当前View Y坐标上的差值
*/
animation = new TranslateAnimation(0.5f, 200f, 0.5f, 0.5f);
//该动画重复次数 -1代表无限循环
animation.setRepeatCount(-1);
//设置动画的播放时长 单位为毫秒
animation.setDuration(500);
//设置动画重复方式 Animation.REVERSR:反向 Animation.RESTART:重新开始
animation.setRepeatMode(Animation.REVERSE);
////动画执行完后是否停留在执行完的状态
animation.setFillAfter(true);
//为图片添加动画,并开始动画
iv.startAnimation(animation);
}
});
}
}

4.ScaleAnimation 缩放的动画效果

创建ScaleAnimation对象
ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
参数说明:
float fromX 动画起始时 X坐标上的伸缩尺寸
float toX 动画结束时 X坐标上的伸缩尺寸
float fromY 动画起始时Y坐标上的伸缩尺寸
float toY 动画结束时Y坐标上的伸缩尺寸
int pivotXType 动画在X轴相对于物件位置类型
float pivotXValue 动画相对于物件的X坐标的开始位置
int pivotYType 动画在Y轴相对于物件位置类型
float pivotYValue 动画相对于物件的Y坐标的开始位置

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
public class AnimationActivity extends AppCompatActivity {
private ImageView iv;
private Button btn_tran, btn_alpha, btn_rotate, btn_scale, btn_set;
private static Animation animation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation);
iv = (ImageView) findViewById(R.id.iv);
btn_tran = (Button) findViewById(R.id.btn_tran);
btn_alpha = (Button) findViewById(R.id.btn_alpha);
btn_rotate = (Button) findViewById(R.id.btn_roate);
btn_scale = (Button) findViewById(R.id.btn_scale);
btn_set = (Button) findViewById(R.id.btn_set);
btn_scale.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
参数说明:
float fromX 动画起始时 X坐标上的伸缩尺寸
float toX 动画结束时 X坐标上的伸缩尺寸
float fromY 动画起始时Y坐标上的伸缩尺寸
float toY 动画结束时Y坐标上的伸缩尺寸
int pivotXType 动画在X轴相对于物件位置类型
float pivotXValue 动画相对于物件的X坐标的开始位置
int pivotYType 动画在Y轴相对于物件位置类型
float pivotYValue 动画相对于物件的Y坐标的开始位置
*/
//创建一个缩放动画 X轴:0.5f -> 2.0f Y轴:0.5f -> 2.0f
animation = new ScaleAnimation(0.5f, 2.0f, 0.5f, 2.0f);
//该动画重复次数 -1代表无线循环
animation.setRepeatCount(-1);
//设置动画的播放时长 单位为毫秒
animation.setDuration(500);
//设置动画重复方式 Animation.REVERSR:反向 Animation.RESTART:重新开始
animation.setRepeatMode(Animation.REVERSE);
////动画执行完后是否停留在执行完的状态
animation.setFillAfter(true);
//为图片添加动画,并开始动画
iv.startAnimation(animation);
}
});
}
}

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
public class AnimationActivity extends AppCompatActivity {
private ImageView iv;
private Button btn_tran, btn_alpha, btn_rotate, btn_scale, btn_set;
private static Animation animation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation);
iv = (ImageView) findViewById(R.id.iv);
btn_tran = (Button) findViewById(R.id.btn_tran);
btn_alpha = (Button) findViewById(R.id.btn_alpha);
btn_rotate = (Button) findViewById(R.id.btn_roate);
btn_scale = (Button) findViewById(R.id.btn_scale);
btn_set = (Button) findViewById(R.id.btn_set);
btn_set.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AnimationSet animationSet = new AnimationSet(true);
TranslateAnimation tranAnimation = new TranslateAnimation(0.5f, 100f, 0.5f, 100f);
AlphaAnimation alphaAnimation = new AlphaAnimation(0.2f, 1.0f);
ScaleAnimation scaleAnimation = new ScaleAnimation(0.5f, 2.0f, 0.5f, 2.0f, 0.5f, 0.5f);
tranAnimation.setRepeatCount(-1);
alphaAnimation.setRepeatCount(-1);
scaleAnimation.setRepeatCount(-1);
animationSet.addAnimation(tranAnimation);
animationSet.addAnimation(alphaAnimation);
animationSet.addAnimation(scaleAnimation);
animationSet.setRepeatMode(Animation.REVERSE);
animationSet.setDuration(500);
animationSet.setFillAfter(true);
iv.startAnimation(animationSet);
}
});
}

AnimationSet 动画集

当你在实现单个补间动画的时候,往往不能满足需求,这是就需要用到动画集AnimationSet,顾名思义,AnimationSet代表的就是将多个补间动画集中到一个集合中,下面我们来看下如何去实现这样的一种效果

AnimationSet的原理就是在同一时间触发多个补间动画。首先创建多种单个补间动画,然后添加到animationSet集合中,再经过一些列的属性设置,最终通过startAnimation(Animation animation)方法启动即可。
有个注意点就是:==如果直接通过设置animationSet.setRepeatCount(-1)的话,动画依然还是执行一次,为了解决这个问题,可以先对每一个补间动画设置RepeatCount为-1,再将各个动画添加到动画集中! #FF0009==

写在最后

以上为对Android Animation学习之后的一点见解,当然如果你愿意了解学习更多的话,也可以通过自己的拓展进行学习和开发!
现将java文件和xml文件完整版贴出来供大家分享,如有不当的地方,欢迎指正与讨论!

java

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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
package animation.demo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ImageView;
import com.demo.weather.R;
public class AnimationActivity extends AppCompatActivity {
private ImageView iv;
private Button btn_tran, btn_alpha, btn_rotate, btn_scale, btn_set;
private static Animation animation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation);
findViewById();
initView();
}
private void initView() {
tranAnimation();
alphaAnimation();
rotateAnimation();
scaleAnimation();
setAnimation();
}
//组合动画
private void setAnimation() {
btn_set.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AnimationSet animationSet = new AnimationSet(true);
TranslateAnimation tranAnimation = new TranslateAnimation(0.5f, 100f, 0.5f, 100f);
AlphaAnimation alphaAnimation = new AlphaAnimation(0.2f, 1.0f);
ScaleAnimation scaleAnimation = new ScaleAnimation(0.5f, 2.0f, 0.5f, 2.0f, 0.5f, 0.5f);
tranAnimation.setRepeatCount(-1);
alphaAnimation.setRepeatCount(-1);
scaleAnimation.setRepeatCount(-1);
animationSet.addAnimation(tranAnimation);
animationSet.addAnimation(alphaAnimation);
animationSet.addAnimation(scaleAnimation);
animationSet.setRepeatMode(Animation.REVERSE);
animationSet.setDuration(500);
animationSet.setFillAfter(true);
iv.startAnimation(animationSet);
}
});
}
//缩放动画
private void scaleAnimation() {
btn_scale.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
参数说明:
float fromX 动画起始时 X坐标上的伸缩尺寸
float toX 动画结束时 X坐标上的伸缩尺寸
float fromY 动画起始时Y坐标上的伸缩尺寸
float toY 动画结束时Y坐标上的伸缩尺寸
int pivotXType 动画在X轴相对于物件位置类型
float pivotXValue 动画相对于物件的X坐标的开始位置
int pivotYType 动画在Y轴相对于物件位置类型
float pivotYValue 动画相对于物件的Y坐标的开始位置
*/
//创建一个缩放动画 X轴:0.5f -> 2.0f Y轴:0.5f -> 2.0f
animation = new ScaleAnimation(0.5f, 2.0f, 0.5f, 2.0f);
//该动画重复次数 -1代表无线循环
animation.setRepeatCount(-1);
//设置动画的播放时长 单位为毫秒
animation.setDuration(500);
//设置动画重复方式 Animation.REVERSR:反向 Animation.RESTART:重新开始
animation.setRepeatMode(Animation.REVERSE);
////动画执行完后是否停留在执行完的状态
animation.setFillAfter(true);
//为图片添加动画,并开始动画
iv.startAnimation(animation);
}
});
}
//旋转动画
private void rotateAnimation() {
btn_rotate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
RotateAnimation (float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
参数说明:
float fromDegrees 旋转的开始角度。
float toDegrees 旋转的结束角度。
int pivotXType X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotXValue X坐标的伸缩值。
int pivotYType Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotYValue Y坐标的伸缩值。
*/
animation = new RotateAnimation(0.0f, 360f, 0.5f, 0.5f);
//该动画重复次数 -1代表无线循环
animation.setRepeatCount(-1);
//设置动画的播放时长 单位为毫秒
animation.setDuration(500);
//设置动画重复方式 Animation.REVERSR:反向 Animation.RESTART:重新开始
animation.setRepeatMode(Animation.RESTART);
////动画执行完后是否停留在执行完的状态
animation.setFillAfter(true);
//为图片添加动画,并开始动画
iv.startAnimation(animation);
}
});
}
//透明度动画
private void alphaAnimation() {
btn_alpha.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
AlphaAnimation(float fromAlpha, float toAlpha)
参数说明:
float fromAlpha 动画开始时的透明度 透明度范围:0表示全透明 1标识完全不透明
float toAlpha 动画结束时的透明度
*/
animation = new AlphaAnimation(0.2f, 1.0f);
//该动画重复次数 -1代表无线循环
animation.setRepeatCount(-1);
//设置动画的播放时长 单位为毫秒
animation.setDuration(200);
//设置动画重复方式 Animation.REVERSR:反向 Animation.RESTART:重新开始
animation.setRepeatMode(Animation.REVERSE);
////动画执行完后是否停留在执行完的状态
animation.setFillAfter(true);
//为图片添加动画,并开始动画
iv.startAnimation(animation);
}
});
}
//平移动画
private void tranAnimation() {
btn_tran.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
参数说明:
float fromXDelta 动画开始的点离当前View X坐标上的差值
float toXDelta 动画结束的点离当前View X坐标上的差值
float fromYDelta 动画开始的点离当前View Y坐标上的差值
float toYDelta 动画开始的点离当前View Y坐标上的差值
*/
animation = new TranslateAnimation(0.5f, 200f, 0.5f, 0.5f);
//该动画重复次数 -1代表无限循环
animation.setRepeatCount(-1);
//设置动画的播放时长 单位为毫秒
animation.setDuration(500);
//设置动画重复方式 Animation.REVERSR:反向 Animation.RESTART:重新开始
animation.setRepeatMode(Animation.REVERSE);
////动画执行完后是否停留在执行完的状态
animation.setFillAfter(true);
//为图片添加动画,并开始动画
iv.startAnimation(animation);
}
});
}
private void findViewById() {
iv = (ImageView) findViewById(R.id.iv);
btn_tran = (Button) findViewById(R.id.btn_tran);
btn_alpha = (Button) findViewById(R.id.btn_alpha);
btn_rotate = (Button) findViewById(R.id.btn_roate);
btn_scale = (Button) findViewById(R.id.btn_scale);
btn_set = (Button) findViewById(R.id.btn_set);
}
}

xml

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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_centerInParent="true"
android:id="@+id/iv"
android:src="@mipmap/ic_launcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:weightSum="4"
android:gravity="bottom"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:layout_weight="1"
android:id="@+id/btn_tran"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="平移" />
<Button
android:layout_weight="1"
android:id="@+id/btn_alpha"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="透明" />
<Button
android:layout_weight="1"
android:id="@+id/btn_roate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="旋转" />
<Button
android:layout_weight="1"
android:id="@+id/btn_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="缩放" />
<Button
android:layout_weight="1"
android:text="组合"
android:id="@+id/btn_set"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>


版权声明:本文为博主原创文章,转载请注明出处http://hunterblog.cn/ 和作者:Hunter,谢谢支持。