How to create bouncable scrollview in android?

后端 未结 4 613
天命终不由人
天命终不由人 2020-12-16 03:45

How to create a bounce ScrollView in Android like iPhone?

4条回答
  •  长情又很酷
    2020-12-16 04:19

    I have improved version of this answer: https://stackoverflow.com/a/13391248/3256989 . So my version is (example for HorizontalScrollView):

    public class HorizontalOverScrollView extends HorizontalScrollView {
        private static final int WIDTH_DEVIDER_OVERSCROLL_DISTANCE = 3;
    
        private TimeInterpolator mInterpolator;
        private int mMaxOverscrollDistance;
        private int mAnimTime;
        private long mStartTime;
    
        /**
         * Instantiates {@link HorizontalOverScrollView} object.
         */
        public HorizontalOverScrollView(final Context context) {
            super(context);
            init();
        }
    
        /**
         * Instantiates {@link HorizontalOverScrollView} object.
         */
        public HorizontalOverScrollView(final Context context, final AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        /**
         * Instantiates {@link HorizontalOverScrollView} object.
         */
        public HorizontalOverScrollView(final Context context, final AttributeSet attrs, final int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        private void init() {
            final int widthPixels = getContext().getResources().getDisplayMetrics().widthPixels;
            mMaxOverscrollDistance = widthPixels / WIDTH_DEVIDER_OVERSCROLL_DISTANCE;
            mAnimTime = getContext().getResources().getInteger(android.R.integer.config_mediumAnimTime);
            mInterpolator = new DecelerateInterpolator();
        }
    
        @Override
        protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
            int overScrollDistance = mMaxOverscrollDistance;
            if (isTouchEvent) {
                mStartTime = AnimationUtils.currentAnimationTimeMillis();
            } else {
                final long elapsedTime = AnimationUtils.currentAnimationTimeMillis() - mStartTime;
                float interpolation = mInterpolator.getInterpolation((float) elapsedTime / mAnimTime);
                interpolation = interpolation > 1 ? 1 : interpolation;
                overScrollDistance -= overScrollDistance * interpolation;
                overScrollDistance = overScrollDistance < 0 ? 0 : overScrollDistance;
            }
    
            return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, overScrollDistance, maxOverScrollY, isTouchEvent);
        }
    }
    

提交回复
热议问题