Java 如何在android中创建可反弹的滚动视图?

Java 如何在android中创建可反弹的滚动视图?,java,android,Java,Android,如何在类似iPhone的Android系统中创建反弹滚动视图?在Android系统中称为overscroll。 看到和 (例如) 仅从API第9级开始提供。 然而,三星的设备似乎在安卓2.2中支持本机的overscroll,并在安卓中为scrollview添加了效果反弹 步骤1:在package com.base.view中创建新文件BounceScrollView public class BounceScrollView extends ScrollView { private st

如何在类似iPhone的Android系统中创建反弹
滚动视图

在Android系统中称为overscroll。
看到和 (例如)

仅从API第9级开始提供。

然而,三星的设备似乎在安卓2.2中支持本机的overscroll,并在安卓中为scrollview添加了效果反弹

步骤1:在package 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"
/>


我改进了这个答案的版本:。 因此,我的版本是(例如HorizontalScrollView):

公共类HorizontalOverScrollView扩展了HorizontalScrollView{
专用静态最终整数宽度\偏差\过卷\距离=3;
专用时间内插器;
私人内线距离;
私人内部管理时间;
私人长时间;
/**
*实例化{@link HorizontalOverScrollView}对象。
*/
公共水平OverScrollView(最终上下文){
超级(上下文);
init();
}
/**
*实例化{@link HorizontalOverScrollView}对象。
*/
public HorizontalOverScrollView(最终上下文、最终属性集属性){
超级(上下文,attrs);
init();
}
/**
*实例化{@link HorizontalOverScrollView}对象。
*/
public HorizontalOverScrollView(最终上下文、最终属性集属性、最终int defStyleAttr){
super(上下文、attrs、defStyleAttr);
init();
}
私有void init(){
final int widthPixels=getContext().getResources().getDisplayMetrics().widthPixels;
mMaxOverscrollDistance=宽度像素/宽度偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差偏差;
mAnimTime=getContext().getResources().getInteger(android.R.integer.config_mediumAnimTime);
mInterpolator=新减速器插值器();
}
@凌驾
受保护的布尔overScrollBy(int deltaX、int deltaY、int scrollX、int scrollRangeX、int scrollRangeY、int maxOverScrollX、int maxoverscroly、boolean isTouchEvent){
int overscrolldance=mmaxoverscrolldance;
如果(ISTOUCHENT){
mStartTime=AnimationUtils.currentAnimationTimeMillis();
}否则{
final long elapsedTime=AnimationUtils.currentAnimationTimeMillis()-mStartTime;
float interpolation=mInterpolator.getInterpolation((float)elapsedTime/mAnimTime);
插值=插值>1?1:插值;
OvercrollDistance-=OvercrollDistance*插值;
过交叉距离=过交叉距离<0?0:过交叉距离;
}
返回super.overScrollBy(deltaX、deltaY、scrollX、scrollY、scrollRangeX、scrollRangeY、overScrollDistance、maxOverScrollY、isTouchEvent);
}
}

只需使用
OverScrollDecororHelper

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

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

Android 2.2是API级别8-你是说2.1吗?有效备注:应该读“API级别9”;我编辑了accordinglyhi,谢谢你的解决方案,对我来说效果很好。请更新您的代码,您有一个小错误:initBounceListView()应该是initBounceScrollView();)@Thien感谢您提供的解决方案。您知道我们如何在此bouncescrollview中添加页眉和页脚吗?如果滚动视图中的内容小于滚动视图高度,是否有任何方法可以产生反弹效果?@ArturMovse可能会使用android:overScrollMode=“always”设置来设置滚动视图,但缓慢滚动时会出现不平滑的情况。当缓慢完成时,在某个点拉动顶部或底部时,它会弹跳。
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);
    }
}
ScrollView scrollView = (ScrollView) findViewById(R.id.scroll_view);
OverScrollDecoratorHelper.setUpOverScroll(scrollView);

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