美文网首页
android listview 跳转指定位置实现缓慢滑动效果

android listview 跳转指定位置实现缓慢滑动效果

作者: shineYES | 来源:发表于2017-03-16 11:25 被阅读0次

    在Android开发过程中,Listview在展示某一个指定位置时,列表进行平顺滑动。这时候如果我们使用Listview提供的scrollTo(x,y)或者setSelection(position)进行滑动时,列表的效果就是直接切换,用户很难感受到列表是滑动到列表的某一位置。

    如果想要实现有滑动效果的滚动到指定位置怎么办?Listview为我们提供的有实现该效果的方法,smoothScrollBy(x,y)或smoothScrollToPosition(position),但是在用的过程的会发现,smoothScrollToPosition这个方法滚动的位置总是不对,如果用smoothScrollBy又很难计算多种item列表中某一个位置item的位置,所以下面推荐一种实现方式,主要思想是首先采用setSelection方法将列表滚动到目标位置的前一个或后一个,保证目标位置处于列表的可视范围内,然后再采用smoothScrollBy或smoothScrollToPosition方法进行平滑滚动,这样可以在视觉上展示出列表滚动的效果。

    如何实现呢,楼主采用了继承Listview,并重写Listview中layoutChildren方法,这样效果比较好一些。重写Listview代码如下,使用时只需要在外面调用smoothPositionTo()方法即可:

    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.widget.ListView;
    
    /**
     * @author shine on 16-10-27.
     */
    
    public class AutoScrollListView extends ListView {
    
        private int mRequestedScrollPosition = -1;
        private int mPreSelectPosition = 0;
        private boolean mSmoothScrollRequested;
        private boolean mIsScroll = false;
    
        public AutoScrollListView(Context context) {
            super(context);
        }
    
        public AutoScrollListView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public AutoScrollListView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        
        public void smoothPositionTo(int position, boolean smoothScroll) {
            if(mPreSelectPosition == position){
                return;
            }
            mRequestedScrollPosition = position;
            mPreSelectPosition = position;
            mSmoothScrollRequested = smoothScroll;
            mIsScroll =true;
            requestLayout();
        }
    
        @Override
        protected void layoutChildren() {
            super.layoutChildren();
            if (mRequestedScrollPosition == -1 || !mIsScroll) {
                return;
            }
    
            final int position = mRequestedScrollPosition;
            mRequestedScrollPosition = -1;
    
            int firstPosition = getFirstVisiblePosition() + 1;
            int lastPosition = getLastVisiblePosition();
    
            if (!mSmoothScrollRequested) {
                setSelection(position);
                super.layoutChildren();
    
            } else {
                if(position >= firstPosition && position <= lastPosition){
                    setSelectionFromTop(position,300);
                    super.layoutChildren();
                    smoothScrollBy(300,500);
                }else if(position < firstPosition){
                    setSelection(position + 1);
                    super.layoutChildren();
                    smoothScrollToPosition(position);
                }else {
                    setSelectionFromTop(position,500);
                    super.layoutChildren();
                   smoothScrollBy(500,500);
    
                }
                mIsScroll = false;
            }
        }
    }
    
    

    相关文章

      网友评论

          本文标题:android listview 跳转指定位置实现缓慢滑动效果

          本文链接:https://www.haomeiwen.com/subject/dtndnttx.html