RecyclerView scrollToPositionWithOffset带动画

时间:2015-08-19 14:26:10

标签: android android-animation android-recyclerview

我试图为卡片视图的位置设置动画并调整其大小以同时适应屏幕。 当用户单击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()));

但问题是滚动仅在调整大小完成后才会生成动画。

我需要调整大小和滚动同时发生。

任何帮助将不胜感激

2 个答案:

答案 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),因为如果你不这样做,将重用缓存的对象,从而调整多个项目的大小,而不仅仅是你点击的项目