How to create bouncable scrollview in android?

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

How to create a bounce ScrollView in Android like iPhone?

相关标签:
4条回答
  • 2020-12-16 04:11

    It's called overscroll in Android.
    See http://developer.android.com/reference/android/widget/OverScroller.html and (for example) http://developer.android.com/reference/android/widget/ListView.html#setOverscrollFooter(android.graphics.drawable.Drawable)

    It's only available from API level 9 onward.
    However, Samsung devices do seem to support overscroll natively in Android 2.2

    0 讨论(0)
  • 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);
        }
    }
    
    0 讨论(0)
  • 2020-12-16 04:20

    Just use OverScrollDecoratorHelper

    ScrollView scrollView = (ScrollView) findViewById(R.id.scroll_view);
    OverScrollDecoratorHelper.setUpOverScroll(scrollView);
    
    HorizontalScrollView horizontalScrollView = (HorizontalScrollView) findViewById(R.id.horizontal_scroll_view);
    OverScrollDecoratorHelper.setUpOverScroll(horizontalScrollView);
    

    https://github.com/EverythingMe/overscroll-decor

    0 讨论(0)
  • 2020-12-16 04:27

    Add effect bounce to scrollview in android

    Step 1: Create new file BounceScrollView in package com.base.view

    public class BounceScrollView extends ScrollView
    {
        private static final int MAX_Y_OVERSCROLL_DISTANCE = 200;
    
        private Context mContext;
        private int mMaxYOverscrollDistance;
    
        public BounceScrollView(Context context) 
        {
            super(context);
            mContext = context;
            initBounceScrollView();
        }
    
        public BounceScrollView(Context context, AttributeSet attrs) 
        {
            super(context, attrs);
            mContext = context;
            initBounceScrollView();
        }
    
        public BounceScrollView(Context context, AttributeSet attrs, int defStyle) 
        {
            super(context, attrs, defStyle);
            mContext = context;
            initBounceScrollView();
        }
    
        private void initBounceScrollView()
        {
            //get the density of the screen and do some maths with it on the max overscroll distance
            //variable so that you get similar behaviors no matter what the screen size
    
            final DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
                final float density = metrics.density;
    
            mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE);
        }
    
        @Override
        protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) 
        { 
            //This is where the magic happens, we have replaced the incoming maxOverScrollY with our own custom variable mMaxYOverscrollDistance; 
            return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent);  
        }
    
    }
    

    Step 2: At your layout, please change

    <ScrollView 
       android:id="@+id/list"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
    />
    

    to

    <com.base.view.BounceScrollView 
       android:id="@+id/list"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
    />
    
    0 讨论(0)
提交回复
热议问题