最近有一个需求是一个界面上点击一个按钮,打开一个需要显示的View,然后再次点击隐藏,先看效果图
展开前的界面

展开后的界面

实现原理,就是在布局文件中先把,需要显示出来的View写出来,然后再用属性动画动态的控制高度,从而实现点击展开和关闭的动画效果
第一步:(这里我就写需要显示的XML布局)
<LinearLayout
android:id="@+id/linear_hidden"
android:layout_width="match_parent"
android:layout_height="160dp"
android:background="@mipmap/bg_top_jianbian"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:background="@mipmap/icon_top_ybtlogo" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/padding_25"
android:text="扫码或搜索,提供最省钱的用药方案。"
android:textColor="#50ffffff"
android:textSize="15sp" />
</LinearLayout>
第一步:圆形图片的点击事件实现两个动画
case R.id.tv_start_anim: //hidden动画
v.tv_start_anim.setClickable(false)
if (v.linear_hidden.getVisibility() == View.GONE) { //隐藏
animateOpen(v.linear_hidden)
animationIvRotateOpen()
} else {
animateClose(v.linear_hidden)
animationIvRoateClose()
}
break
下面是四个播放动画的方法
/**
* 打开动画
*/
private void animateOpen(LinearLayout linear_hidden) {
linear_hidden.setVisibility(View.VISIBLE);
ValueAnimator animator = createDropAnimator(linear_hidden, 0, mHiddenViewMeasureHeight);
animator.setDuration(500);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
v.tv_start_anim.setClickable(true);
}
});
animator.start();
}
private ValueAnimator createDropAnimator(final View v, int start, int end) {
ValueAnimator animator = ValueAnimator.ofInt(start, end);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator arg0) {
Integer animatedValue = (Integer) arg0.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
layoutParams.height = animatedValue;
v.setLayoutParams(layoutParams);
}
});
return animator;
}
/**
* 关闭的动画
* @param view
*/
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);
v.tv_start_anim.setClickable(true);
}
});
animator.setDuration(500);
animator.start();
}
/**
* iv的旋转动画
*/
private void animationIvRotateOpen() {
android.animation.ObjectAnimator animatior1 = android.animation.ObjectAnimator.ofFloat(v.tv_start_anim, "alpha", 1f, 0.5f);
android.animation.ObjectAnimator animator = android.animation.ObjectAnimator.ofFloat(v.tv_start_anim, "rotation", 0f, 180f);
AnimatorSet set = new AnimatorSet();
set.play(animator).with(animatior1);
set.setDuration(500);
set.start();
}
/**
* iv的旋转动画
*/
private void animationIvRoateClose() {
android.animation.ObjectAnimator animatior1 = android.animation.ObjectAnimator.ofFloat(v.tv_start_anim, "alpha", 0.5f, 1f);
android.animation.ObjectAnimator animator = android.animation.ObjectAnimator.ofFloat(v.tv_start_anim, "rotation", 180f, 360f);
AnimatorSet set = new AnimatorSet();
set.play(animator).with(animatior1);
set.setDuration(500);
set.start();
}
具体适配看他的博客就可以解决了哦