【发布时间】:2016-03-24 02:22:54
【问题描述】:
我想在Toolbar下方显示一个TextView,以防有新事件进入。它应该从Toolbar下方向下滑动,出现1-2秒然后向上滑动再次。在TextView 下方是RecyclerView,在GridLayout 中订购了几件商品。
为此,我使用TranslateAnimation 让动画再次向上滑动:
TranslateAnimation animate = new TranslateAnimation(0, 0, 0, -tvStatus.getHeight());
animate.setDuration(1000);
animate.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
tvStatus.setVisibility(View.GONE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
tvStatus.startAnimation(animate);
TextView 本身的滑动动画效果很好,但 RecyclerView 的动画效果不太好。 TextView 再次向上滑动,直到它被隐藏,并有一小段时间的间隙。
然后ReclerView就跳起来了,看起来不太好看。
我的问题是:当TextView开始向上滑动时,如何调整我的代码以使RecylerView也向上滑动?
编辑 - 解决方案:
我调整了我的解决方案,包括来自Francescs answer 的输入。我解决了没有翻译的动画,只是通过改变视图的高度。
状态栏扩展方法:
public void expand() {
//set Visible
tvStatus.setVisibility(View.VISIBLE);
mAnimator = slideAnimator(0, mHeight);
mAnimator.setDuration(600);
mAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
mAnimator.start();
}
折叠状态栏的方法:
private void collapse() {
int finalHeight = tvStatus.getHeight();
ValueAnimator mAnimator = slideAnimator(finalHeight, 0);
mAnimator.setDuration(500);
mAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
mAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
tvStatus.setVisibility(View.GONE);
}
});
mAnimator.start();
}
价值动画师:
private ValueAnimator slideAnimator(int start, int end) {
ValueAnimator animator = ValueAnimator.ofInt(start, end);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
//Update Height
int value = (Integer) valueAnimator.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = tvStatus.getLayoutParams();
layoutParams.height = value;
tvStatus.setLayoutParams(layoutParams);
}
});
return animator;
}
onCreate中调用measureTextHeight()方法获取TextView高度:
public void measureTextHeight() {
tvStatus.setVisibility(View.VISIBLE);
tvStatus.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
mHeight = tvStatus.getHeight();
if (mHeight > 0) {
tvStatus.getViewTreeObserver().removeOnPreDrawListener(this);
tvStatus.setVisibility(View.GONE);
return false;
}
return true;
}
});
}
【问题讨论】:
标签: android animation android-recyclerview translate-animation