单击按钮时,我需要为TextView设置动画。 TextView的高度是wrap_content。这个TextView位于RecyclerView行中,我需要将其从可见性扩展到内容的真实高度。我使用了ValueAnimator。
private ValueAnimator slideAnimator(int start, int end) {
ValueAnimator animator = ValueAnimator.ofInt(start, end);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int value = (Integer) valueAnimator.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = tvAdditional.getLayoutParams();
layoutParams.height = value;
tvAdditional.setLayoutParams(layoutParams);
}
});
return animator;
}
private void expand(View v) {
v.setVisibility(View.VISIBLE);
v.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ValueAnimator mAnimator = slideAnimator(0, v.getMeasuredHeight());
mAnimator.start();
}
private void collapse(final View v) {
int finalHeight = v.getHeight();
ValueAnimator mAnimator = slideAnimator(finalHeight, 0);
mAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animator) {
v.setVisibility(View.GONE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
mAnimator.start();
}
在调试中,我注意到当我在getMeasuredHeight()
的视图上使用expand
方法时,值总是76,如果我添加了多行的项目。
P.S。我在行的点击监听器中调用expand
和collapse
。
截图:
答案 0 :(得分:1)
<强>解决强>
我改变了我的expand
方法,添加了一个监听器,我在动画结束时将高度设置为wrap_content:
private void expand(final View v) {
v.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
v.getLayoutParams().height = 0;
v.setVisibility(View.VISIBLE);
final int targetHeight = v.getMeasuredHeight();
ValueAnimator mAnimator = slideAnimator(0, targetHeight);
mAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
v.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
v.requestLayout();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
mAnimator.start();
}
答案 1 :(得分:0)
当你的可见度为GONE时,你无法知道它的实际绘制高度。为了实现这一点,你需要在TextView上使用GlobalLayoutListener,这样你就可以在绘制时获得它的测量高度。
在你的展开方法中,我看到你将可见性设置为可见,然后尝试测量它,不会立即绘制它,因此你无法获得高度。
那么,如果TextView的可见性最初消失,你可以做些什么来获得TextView的实际高度,首先你应该将初始可见性改为VISIBLE,其次,设置全局布局监听器,第三步,将TextView的高度存储在测量后的全局值,作为最后一步,您可以将TextView的可见性设置为GONE。
此过程通常非常快,因此您无法用眼睛看到TextView的可见性从VISIBLE变为GONE。