android动画调整高度,android – 当RecyclerView元素为其高度设置动画时,如何正确绘制ItemDecoration?...
时间: 2024-02-24 14:56:48 浏览: 22
对于调整RecyclerView元素高度的动画,建议使用ItemAnimator来实现。您可以通过自定义ItemAnimator来控制元素高度的变化,然后在RecyclerView的ItemDecoration中进行更新。
以下是一个简单的示例,展示如何使用ItemAnimator调整RecyclerView元素的高度并在ItemDecoration中进行更新:
1. 创建一个自定义的ItemAnimator,重写animateChange()方法以控制元素高度的变化:
```
public class HeightItemAnimator extends DefaultItemAnimator {
@Override
public boolean animateChange(@NonNull RecyclerView.ViewHolder oldHolder, @NonNull RecyclerView.ViewHolder newHolder, @NonNull ItemHolderInfo preInfo, @NonNull ItemHolderInfo postInfo) {
if (oldHolder != newHolder) {
return super.animateChange(oldHolder, newHolder, preInfo, postInfo);
}
final View view = newHolder.itemView;
final int startHeight = preInfo.bottom - preInfo.top;
final int endHeight = postInfo.bottom - postInfo.top;
ValueAnimator animator = ValueAnimator.ofInt(startHeight, endHeight);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int height = (int) valueAnimator.getAnimatedValue();
view.getLayoutParams().height = height;
view.requestLayout();
}
});
animator.setDuration(getChangeDuration());
animator.start();
return false;
}
}
```
2. 在RecyclerView中设置该ItemAnimator:
```
recyclerView.setItemAnimator(new HeightItemAnimator());
```
3. 在ItemDecoration中,重写onDrawOver()方法,在绘制元素之前更新元素高度:
```
public class CustomItemDecoration extends RecyclerView.ItemDecoration {
@Override
public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.onDrawOver(c, parent, state);
for (int i = 0; i < parent.getChildCount(); i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
// 更新元素高度
int height = child.getHeight();
int top = child.getTop() - params.topMargin;
int bottom = top + height;
params.height = height;
child.setLayoutParams(params);
// 绘制元素
// ...
}
}
}
```
通过这种方式,您可以在动画期间正确地更新元素高度,并在ItemDecoration中进行更新,以确保它们与元素的实际高度匹配。