我试图为卡片视图的位置设置动画并调整其大小以同时适应屏幕。 当用户单击cardview内的按钮时,cardview应扩展到其容器的大小,并向上滚动以同时完全显示
在我的自定义动画类中,我使用以下函数:
@Override
protected void applyTransformation(float interpolatedTimeTransformation t) {
int newHeight = (int) (startHeight + (targetHeight - startHeight) *interpolatedTime);
view.getLayoutParams().height = newHeight;
((LinearLayoutManager) MainPage.mainGroupRecycler.getLayoutManager()).scrollToPositionWithOffset(MainPage.mainGroupRecycler.getChildAdapterPosition((CardView) view.getParent()), 0);
view.requestLayout();
}
在下面的例子中,recyclerview会立即在可见区域的顶部显示cardview,而不会动画滚动,然后它会调整大小。我需要它在调整大小的同时滚动。
我试着调用另一个滚动功能:
MainPage.mainGroupRecycler.scrollToPosition(MainPage.mainGroupRecycler.getChildAdapterPosition((CardView) view.getParent()));
但问题是滚动仅在调整大小完成后才会生成动画。
我需要调整大小和滚动同时发生。
任何帮助将不胜感激
答案 0 :(得分:0)
要使两个效果串联发生,您必须启动视图的动画,并同时调用scrollToPosition
。
此外,删除对" scrollToPosition
"来自动画的applyTransformation
方法。这很糟糕,因为它告诉布局管理器它需要在动画的每次迭代中滚动到某个位置,这可能会发生数百次。您只需拨打scrollToPosition
一次。
此外,使用scrollToPosition
代替smoothScrollToPosition
,以获得流畅的滚动效果。
答案 1 :(得分:0)
我找到了解决方案。
在我的动画师课程中:
@Override
protected void applyTransformation(float interpolatedTime, Transformation t){
calculatedOffset = (int) (tempOffset*interpolatedTime);
tempOffset = tempOffset-calculatedOffset;
recyclerView.scrollBy(0,calculatedOffset);
int newHeight = (int) (startHeight + (targetHeight - startHeight) * interpolatedTime);
LinearLayout ll = (LinearLayout)view.findViewById(R.id.cardchild);
ll.setLayoutParams(new CardView.LayoutParams(ll.getWidth(),newHeight));
}
对于使用类似方法的任何人的注释,如果你有大量的项目,请确保设置recyclerView.setItemViewCacheSize(itemList.size),因为如果你不这样做,将重用缓存的对象,从而调整多个项目的大小,而不仅仅是你点击的项目