【问题标题】:How to create bouncable scrollview in android?如何在 android 中创建可弹跳的滚动视图?
【发布时间】:2011-09-19 11:33:29
【问题描述】:

如何在 iPhone 等 Android 中创建反弹ScrollView

【问题讨论】:

    标签: java android


    【解决方案1】:

    在android中为scrollview添加效果反弹

    第一步:在 com.base.view 包中新建文件 BounceScrollView

    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);  
        }
    
    }
    

    第 2 步:请根据您的布局更改

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

    <com.base.view.BounceScrollView 
       android:id="@+id/list"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
    />
    

    【讨论】:

    • 嗨,感谢您的解决方案,对我来说非常有用。请更新您的代码,您有一个小错误:initBounceListView() 应该是 initBounceScrollView() ;)
    • @Thien 感谢您的解决方案。您知道我们如何在此bouncescrollview 中添加页眉和页脚吗?
    • 如果滚动视图内的内容小于滚动视图高度,有什么办法可以产生反弹效果?
    • @ArturMovsesyan 为 ScrollView 使用 android:overScrollMode="always" 设置
    • 但是这样滚动慢的时候就不流畅了。当缓慢完成时,它会在某个点拉动顶部或底部时撞击。
    【解决方案2】:

    我已经改进了这个答案的版本:https://stackoverflow.com/a/13391248/3256989。 所以我的版本是(Horizo​​ntalScrollView 的例子):

    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);
        }
    }
    

    【讨论】:

      【解决方案3】:

      在 Android 中称为过度滚动。
      请参阅http://developer.android.com/reference/android/widget/OverScroller.html 和 (例如)http://developer.android.com/reference/android/widget/ListView.html#setOverscrollFooter(android.graphics.drawable.Drawable

      仅从 API 级别 9 开始可用。
      不过,三星设备似乎确实在 Android 2.2 中原生支持过度滚动

      【讨论】:

      • Android 2.2 是 API 级别 8 - 你的意思是 2.1 吗?
      • 有效备注:应该是“API level 9”;我已经进行了相应的编辑
      【解决方案4】:

      只需使用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

      【讨论】:

      • 它很好用,只是它忽略了图层并且 ScrollView 中的元素与其他所有内容重叠
      猜你喜欢
      • 1970-01-01
      • 2014-03-09
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      相关资源
      最近更新 更多