繁体   English   中英

RecyclerView scrollToPositionWithOffset与动画

[英]RecyclerView scrollToPositionWithOffset with animation

我试图设置卡片视图的位置动画,并同时调整其大小以适合屏幕。 当用户单击卡片视图内的按钮时,卡片视图应扩展到其容器的大小,并向上滚动以同时完全可见

在我的自定义动画师类中,即时通讯使用以下功能:

    @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来获得良好的平滑滚动效果。

我想出了解决方案。

在我的动画师课程中:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM