android - 根据位置为 RecyclerView 项目设置动画

标签 android animation android-recyclerview

在我的 RecyclerView 的 OnScrollListener 中的 onScrolled() 中,我检查捕捉项目 (SnapHelper.findSnapView()) 到捕捉位置 (SnapHelper.calculateDistanceToFinalSnap()) 的距离,并根据它在 View 中缩放图像。

目标是在图像滚动通过我的 RecyclerView 中间的捕捉位置时放大图像。

我的问题是,当我滚动得太快(快速滚动)时,某些项目不会得到更新(大部分不会再次缩小),直到我以较慢的速度滚动到它们附近。 知道如何解决这个问题或如何在没有这个“错误”的情况下根据位置实现缩放吗?

提前致谢:)

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            View v = snapHelper.findSnapView(mRecyclerView.getLayoutManager());
            float distanceFromSnap = abs(snapHelper.calculateDistanceToFinalSnap(mRecyclerView.getLayoutManager(), v)[0]);

            animate(v, distanceFromSnap);
        }
    });

private void animate(View v, float distanceFromSnap) {
    View image = v.findViewById(R.id.item_active_image);

    float distanceStartAnim = 250;
    float scaleStart = 0.4f;
    float scaleEnd = 1.0f;

    float newScale = scaleStart;

    if (distanceFromSnap <= distanceStartAnim) {
        float percentage = 1.0f - distanceFromSnap/distanceStartAnim;
        newScale = percentage * (scaleEnd - scaleStart) + scaleStart;
    }

    image.setScaleX(newScale);
    image.setScaleY(newScale);
}

最佳答案

您可以尝试扩展 RecyclerView 并覆盖 offsetChildrenHorizo​​ntal(int dx)offsetChildrenVertical(int dy)。我以前做过这样的事情,什么时候可以帮助你。在这里,我在向上滚动和退出屏幕时缩小了项目。

@Override
    public void offsetChildrenVertical(int dy) {
        super.offsetChildrenVertical(dy);

        if (dy == 0)
            return;

        float y;

        int childCount = getChildCount();

        for (int i = 0; i < childCount; i++) {
            View view = getChildAt(i);
            y = view.getY() + view.getHeight();
            if (y <= view.getHeight() && y >= 0) {
                view.setScaleY(mCalculatedScaleFactor);
                view.setScaleX(mCalculatedScaleFactor);
                view.setAlpha(mCalculatedScaleFactor);
            } else {
                view.setScaleX(1);
                view.setScaleY(1);
                view.setAlpha(1);
            }
        }
    }

关于android - 根据位置为 RecyclerView 项目设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43387069/

相关文章:

android - 如何像 Android Emulator Loader 一样制作动画(GLINT Effect over Text)

android - 在Android上对FloatingActionButton图像进行动画更改

html - CSS 导航栏 slider 高亮动画?

android - 将点击监听器添加到通用 RecyclerView 适配器

android - RecyclerView 项目在滚动时点击

安卓录音机应用

c# - 如何通过蓝牙从 Unity C# android 应用程序向 Arduino 发送字符串?

Android:解析 JSON 中的 HTML 标签

android - 使用 espresso 在 Web View 中查找多个元素

android - 如何在recyclerview android中用 child 填充项目