Android属性动画实现布局的下拉展开效果

思路:
代码和布局是先写在布局里隐藏的,在方法代码中点击显示

这一次的需求是这样的:当点击一个View的时候,显示下面隐藏的一个View,要实现这个功能,需要将V iew的visibility属性设置gone为visible即可,但是这个过程是一瞬间的,并不能实现我们要的效果。所以,属性动画是个不错的方案。

先把效果贴上

第一个:
在这里插入图片描述
在这里插入图片描述
一个是隐藏一个是显示的
布局文件如下

<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" />

<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" />

<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" />

<ImageView
  android:id="@+id/my_iv"
  android:layout_width="25dip"
  android:layout_height="25dip"
  android:layout_margin="20dip"
  android:src="@drawable/scroll" />

这里面代码并不多,也很简单,三个线性布局,里面装载着各自的控件,并且还设置了ID。按钮是一个线性布局,采用了onClick自身的点击事件。接下来,当点击了这个线性布局的时候,需要隐藏的控件最终到达一个高度,这个就是我们的目标值,只需要通过布局中的dp转换成像素就行了。

?
1
2
mDensity = getResources().getDisplayMetrics().density;
mHiddenViewMeasuredHeight = (int) (mDensity * 120 + 0.5);
这里是120就是我们布局里面定义的高度。

**然后给这个过程增加一个动画效果。
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 ,就可以很方便的实现显示和隐藏的动画效果了。
下面是完整的代码。
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;

}

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值