gpt4 book ai didi

android - 为 recyclerview 和 textview 翻译动画不流畅

转载 作者:行者123 更新时间:2023-11-30 01:28:06 25 4
gpt4 key购买 nike

我想在 Toolbar 下方显示一个 TextView,它应该出现在有新事件进入的情况下。它应该从 下方向下滑动工具栏,出现1-2秒后再次向上滑动。 TextView 下方是一个 RecyclerView,其中有多个项目在 GridLayout 中排序。

layout with textview and recyclerview

为此,我使用了 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 再次向上滑动,直到隐藏并有短时间的空隙。 gap after textview disappears

然后 ReclerView 跳起来,看起来不太好。

我的问题是: 如何调整我的代码,使 RecylerViewTextView 开始向上滑动时也向上滑动?

编辑 - 解决方案:

我调整了我的解决方案,包括来自 Francescs answer 的输入.我解决了没有平移的动画,只是通过改变 View 的高度。

状态栏展开方法:

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();
}

值(value)动画师:

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;
}
});
}

最佳答案

您还需要为 TextView 的布局参数设置动画,而不仅仅是翻译。添加它并与翻译动画并行运行。确保在开始动画之前知道 TextView 高度(如果 TextView 不可见,您可能需要使用预绘制监听器):

final ViewGroup.LayoutParams layoutParams = mTextView.getLayoutParams();
mTextView.setVisibility(View.VISIBLE);
ValueAnimator anim = ValueAnimator.ofInt(mTextView.getHeight());
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int val = (Integer) valueAnimator.getAnimatedValue();
layoutParams.height = val;
mTextView.setLayoutParams(layoutParams);
}
});
anim.setDuration(1000);
anim.start();

编辑:

要测量 TextView 的高度,使其在您的布局中可见,然后在您膨胀布局的地方添加一个 onPreDrawListener:

private void measureTextHeight() {
mTextView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
mTextViewHeight = mTextView.getHeight();
if (mTextViewHeight > 0) {
mTextView.getViewTreeObserver().removeOnPreDrawListener(this);
mTextView.setTranslationY(-mTextViewHeight);
mTextView.setVisibility(View.GONE);
return false;
}
return true;
}
});
}

现在你有了 TextView 的高度,所以你可以使用上面的函数来显示它。要隐藏它,您可以这样做:

final ViewGroup.LayoutParams layoutParams = mTextView.getLayoutParams();
mTextView.setVisibility(View.VISIBLE);
ValueAnimator anim = ValueAnimator.ofInt(mTextView.getHeight());
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int val = (Integer) valueAnimator.getAnimatedValue();
layoutParams.height = mTextViewHeight - val;
mTextView.setLayoutParams(layoutParams);
}
});
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animation) {
mTextView.setVisibility(View.GONE);
}

@Override
public void onAnimationEnd(Animator animation) {
mTextView.setVisibility(View.GONE);
}
});
anim.setDuration(1000);
anim.start();

请记住,这需要与您的翻译动画并行运行,因此您可以使用动画师集将它们一起运行。

关于android - 为 recyclerview 和 textview 翻译动画不流畅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36135666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com