在Android的3.0之后,google又提出了属性动画的这样一个框架,他可以更好的帮助我们实现更丰富的动画效果。所以为了跟上技术的步伐,今天就聊一聊属性动画。
这一次的需求是这样的:当点击一个View的时候,显示下面隐藏的一个View,要实现这个功能,需要将V iew的visibility属性设置gone为visible即可,但是这个过程是一瞬间的,并不能实现我们要的效果。所以,属性动画是个不错的方案。
先把效果贴上
第一个:

第二个:

前面的这个是隐藏着,后面这个是显示的。当点击这个箭头的时候,来切换显示或者隐藏。
现在开始编码:
布局文件如下
|
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
|
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
android:orientation
=
"vertical"
tools:context
=
"com.ltl.mpiggybank.MainActivity"
>
<
RelativeLayout
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:background
=
"#458EFD"
android:padding
=
"10dip"
>
<
TextView
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:layout_centerInParent
=
"true"
android:gravity
=
"center_vertical"
android:text
=
"下拉展开动画"
android:textColor
=
"#ffffff"
android:textSize
=
"20sp"
/>
</
RelativeLayout
>
<
LinearLayout
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:background
=
"#548AEA"
android:gravity
=
"center"
android:orientation
=
"vertical"
>
<
TextView
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:layout_margin
=
"20dip"
android:text
=
"昨日收益(元)"
android:textColor
=
"#ffffff"
android:textSize
=
"16sp"
/>
<
TextView
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:text
=
"0.00"
android:textColor
=
"#ffffff"
android:textSize
=
"45sp"
/>
</
LinearLayout
>
<
LinearLayout
android:id
=
"@+id/linear_hidden"
android:layout_width
=
"match_parent"
android:layout_height
=
"120dip"
android:background
=
"#548AEA"
android:gravity
=
"center"
android:orientation
=
"vertical"
>
<
TextView
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:layout_margin
=
"20dip"
android:text
=
"显示的View"
android:textColor
=
"#ffffff"
android:textSize
=
"16sp"
/>
<
TextView
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:text
=
"0.00"
android:textColor
=
"#ffffff"
android:textSize
=
"35sp"
/>
</
LinearLayout
>
<
LinearLayout
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:background
=
"#548AEA"
android:gravity
=
"center"
android:onClick
=
"onClick"
android:orientation
=
"vertical"
>
<
ImageView
android:id
=
"@+id/my_iv"
android:layout_width
=
"25dip"
android:layout_height
=
"25dip"
android:layout_margin
=
"20dip"
android:src
=
"@drawable/scroll"
/>
</
LinearLayout
>
</
LinearLayout
>
|
这里面代码并不多,也很简单,三个线性布局,里面装载着各自的控件,并且还设置了ID。按钮是一个线性布局,采用了onClick自身的点击事件。接下来,当点击了这个线性布局的时候,需要隐藏的控件最终到达一个高度,这个就是我们的目标值,只需要通过布局中的dp转换成像素就行了。
|
1
2
|
mDensity = getResources().getDisplayMetrics().density;
mHiddenViewMeasuredHeight = (
int
) (mDensity *
120
+
0.5
);
|
这里是120就是我们布局里面定义的高度。
然后给这个过程增加一个动画效果。
|
1
2
3
4
5
6
7
8
9
10
11
12
|
ValueAnimator animator = ValueAnimator.ofInt(start, end);
animator.addUpdateListener(
new
AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator arg0) {
int value = (int) arg0.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
layoutParams.height = value;
v.setLayoutParams(layoutParams);
}
});
|
通过这样一个简单的ValueAnimator ,就可以很方便的实现显示和隐藏的动画效果了。
下面是完整的代码。
|
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
|
import
android.animation.Animator;
import
android.animation.AnimatorListenerAdapter;
import
android.animation.ValueAnimator;
import
android.animation.ValueAnimator.AnimatorUpdateListener;
import
android.os.Bundle;
import
android.support.v7.app.ActionBarActivity;
import
android.view.View;
import
android.view.ViewGroup;
import
android.view.Window;
import
android.view.animation.Animation;
import
android.view.animation.RotateAnimation;
import
android.widget.ImageView;
import
android.widget.LinearLayout;
public
class
MainActivity
extends
ActionBarActivity {
private
LinearLayout mHiddenLayout;
private
float
mDensity;
private
int
mHiddenViewMeasuredHeight;
private
ImageView mIv;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
mHiddenLayout = (LinearLayout) findViewById(R.id.linear_hidden);
mIv = (ImageView) findViewById(R.id.my_iv);
mDensity = getResources().getDisplayMetrics().density;
mHiddenViewMeasuredHeight = (
int
) (mDensity *
120
+
0.5
);
}
public
void
onClick(View v) {
if
(mHiddenLayout.getVisibility() == View.GONE) {
animateOpen(mHiddenLayout);
animationIvOpen();
}
else
{
animateClose(mHiddenLayout);
animationIvClose();
}
}
private
void
animateOpen(View v) {
v.setVisibility(View.VISIBLE);
ValueAnimator animator = createDropAnimator(v,
0
,
mHiddenViewMeasuredHeight);
animator.start();
}
private
void
animationIvOpen() {
RotateAnimation animation =
new
RotateAnimation(
0
,
180
,
Animation.RELATIVE_TO_SELF,
0
.5f, Animation.RELATIVE_TO_SELF,
0
.5f);
animation.setFillAfter(
true
);
animation.setDuration(
100
);
mIv.startAnimation(animation);
}
private
void
animationIvClose() {
RotateAnimation animation =
new
RotateAnimation(
180
,
0
,
Animation.RELATIVE_TO_SELF,
0
.5f, Animation.RELATIVE_TO_SELF,
0
.5f);
animation.setFillAfter(
true
);
animation.setDuration(
100
);
mIv.startAnimation(animation);
}
private
void
animateClose(
final
View view) {
int
origHeight = view.getHeight();
ValueAnimator animator = createDropAnimator(view, origHeight,
0
);
animator.addListener(
new
AnimatorListenerAdapter() {
@Override
public
void
onAnimationEnd(Animator animation) {
view.setVisibility(View.GONE);
}
});
animator.start();
}
private
ValueAnimator createDropAnimator(
final
View v,
int
start,
int
end) {
ValueAnimator animator = ValueAnimator.ofInt(start, end);
animator.addUpdateListener(
new
AnimatorUpdateListener() {
@Override
public
void
onAnimationUpdate(ValueAnimator arg0) {
int
value = (
int
) arg0.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
layoutParams.height = value;
v.setLayoutParams(layoutParams);
}
});
return
animator;
}
}
|
1万+

被折叠的 条评论
为什么被折叠?



