RecyclerView scrollToPositionWithOffset 带动画
RecyclerView scrollToPositionWithOffset with animation
我正在尝试为卡片视图的位置设置动画并同时调整其大小以适合屏幕。
当用户单击 cardview 内的按钮时,cardview 应扩展到其容器的大小,同时向上滚动以完全可见
在我的自定义动画器 class 中,我使用了以下函数:
@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()));
但这样做的问题是,滚动只会在调整大小完成后才会显示动画。
我需要同时进行调整大小和滚动。
任何帮助将不胜感激
要使这两个效果串联发生,您必须启动视图的动画,并同时调用scrollToPosition
。
此外,从动画的 applyTransformation
方法中删除对“scrollToPosition
”的调用。这很糟糕,因为它告诉布局管理器它需要在动画的每次迭代中滚动到某个位置,这可能会发生数百次。您只需调用 scrollToPosition
一次。
此外,使用 smoothScrollToPosition
代替 scrollToPosition
以获得漂亮的平滑滚动效果。
我想出了解决办法。
在我的动画师中class:
@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),因为如果你不这样做,缓存的对象将被重用调整多个项目的大小,而不仅仅是您点击的项目
我正在尝试为卡片视图的位置设置动画并同时调整其大小以适合屏幕。 当用户单击 cardview 内的按钮时,cardview 应扩展到其容器的大小,同时向上滚动以完全可见
在我的自定义动画器 class 中,我使用了以下函数:
@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()));
但这样做的问题是,滚动只会在调整大小完成后才会显示动画。
我需要同时进行调整大小和滚动。
任何帮助将不胜感激
要使这两个效果串联发生,您必须启动视图的动画,并同时调用scrollToPosition
。
此外,从动画的 applyTransformation
方法中删除对“scrollToPosition
”的调用。这很糟糕,因为它告诉布局管理器它需要在动画的每次迭代中滚动到某个位置,这可能会发生数百次。您只需调用 scrollToPosition
一次。
此外,使用 smoothScrollToPosition
代替 scrollToPosition
以获得漂亮的平滑滚动效果。
我想出了解决办法。
在我的动画师中class:
@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),因为如果你不这样做,缓存的对象将被重用调整多个项目的大小,而不仅仅是您点击的项目