【问题标题】:Android listView onScroll stuttering animation when scrolling downAndroid listView onScroll 向下滚动时出现卡顿动画
【发布时间】:2015-03-26 08:31:28
【问题描述】:

所以现在当我向下滚动时,它会隐藏工具栏和浮动底部,直到我碰到下一个视图项的顶部边缘。所有隐藏的东西都会出现一毫秒,然后又回到隐藏状态,即使我只是向下滚动。

有什么建议吗?

mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
        private int mLastFirstVisibleItem;

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                             int visibleItemCount, int totalItemCount) {
            Animation fadeIn = AnimationUtils.loadAnimation(getActivity().getApplicationContext(), R.anim.fade_in);
            Animation fadeOut = AnimationUtils.loadAnimation(getActivity().getApplicationContext(), R.anim.fade_out);

        if(mLastFirstVisibleItem != firstVisibleItem) {
            if (mLastFirstVisibleItem < firstVisibleItem) {

                bottomBar.startAnimation(fadeOut);
                bottomBar.setVisibility(View.GONE);

                fab.startAnimation(fadeOut);
                fab.hide(true);

            }
            else {
                bottomBar.startAnimation(fadeIn);
                bottomBar.setVisibility(View.VISIBLE);

                fab.startAnimation(fadeIn);
                fab.show(true);

            }
        }
            mLastFirstVisibleItem = firstVisibleItem;

        }
    });

【问题讨论】:

  • 使fadeIn 和fadeOut 动画类可访问,并在类初始化时加载它们。每次滚动时加载它们非常昂贵,并且肯定会显着减慢速度

标签: android listview scroll


【解决方案1】:

嘿,试试这样的:

final Animation fadeIn = AnimationUtils.loadAnimation(getActivity().getApplicationContext(), R.anim.fade_in);
final Animation fadeOut = AnimationUtils.loadAnimation(getActivity().getApplicationContext(), R.anim.fade_out);
        listViewRight.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

                if(mLastFirstVisibleItem != firstVisibleItem) {
                    if (mLastFirstVisibleItem < firstVisibleItem && (bottomBar.getVisibility() == View.VISIBLE)) {

                        fadeOut.setAnimationListener(new Animation.AnimationListener() {
                            @Override
                            public void onAnimationStart(Animation animation) {

                            }

                            @Override
                            public void onAnimationEnd(Animation animation) {
                                bottomBar.setVisibility(View.GONE);
                                fab.hide(true);
                            }

                            @Override
                            public void onAnimationRepeat(Animation animation) {

                            }
                        });

                        bottomBar.startAnimation(fadeOut);
                        fab.startAnimation(fadeOut);

                    }
                    else if ((bottomBar.getVisibility() == View.GONE)) {

                        fadeIn.setAnimationListener(new Animation.AnimationListener() {
                            @Override
                            public void onAnimationStart(Animation animation) {

                                bottomBar.setVisibility(View.VISIBLE);
                                fab.show(true);
                            }

                            @Override
                            public void onAnimationEnd(Animation animation) {


                            }

                            @Override
                            public void onAnimationRepeat(Animation animation) {

                            }
                        });
                        bottomBar.startAnimation(fadeIn);
                        fab.startAnimation(fadeIn);


                    }
                }
                mLastFirstVisibleItem = firstVisibleItem;



            }
        });

尽管我仍然不明白你想要实现什么,因为该动画的逻辑有点奇怪,但仍然应该让事情变得更顺畅!

编辑:更新代码

【讨论】:

  • 这似乎加快了我的 ListView 但它仍然使浮动按钮和工具栏在向下滚动时出现。它会闪烁一毫秒,然后在通过每个项目后再次消失。
  • 当然是因为你的算法错了!(没有冒犯)顺便问一下你想达到什么目的?
  • 对不起,我从堆栈中得到算法。我想要实现的只是向下滚动浮动按钮和工具栏淡出,向上滚动它们淡入
  • 是的,我想你需要先检查视图是否已经消失,所以你不要重新动画它......我已经更新了代码(Ps 这只是一个例子,你可以做得比这更好:) )
猜你喜欢
  • 2016-06-08
  • 1970-01-01
  • 2017-01-08
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2015-07-17
  • 1970-01-01
相关资源
最近更新 更多