您的位置:首页 > 移动开发 > Android开发

android ScrollView ListView的回弹效果

2013-12-02 17:46 561 查看
平常我们在使用ScrollView或者ListView的时候,最终的效果在各个系统上并不相同,有的系统支持滑动到顶后能后还能继续向下滑动一段距离,比如魅族的系统,这样可以很清晰的提示用户到达边界,但是有的系统,比如MIUI并不支持,其实android系统默认是支持这种滑动方式的,就在函数:

[java] view plaincopy

protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent)  

这个函数是定义在View中的,在滑动到边界的时候系统会调用这个函数

其中maxOverScrollX和maxOVerScrollY为超出边界的最大值,但是系统默认值是0,既不会超出边界,有些定制过得系统会修改此值,就实现了回弹的效果

我们要实现这种回弹效果,只要继承ScrollView或者ListView,重写 overScrollBy 方法,修改参数即可,下面以ListView为例

[java] view plaincopy

package com.example.test;  

  

import android.content.Context;  

import android.util.AttributeSet;  

import android.widget.ListView;  

  

public class ScrollBackListView extends ListView{    

    private static final int MAX_SCROLL = 200;    

    private static final float SCROLL_RATIO = 0.5f;// 阻尼系数  

         

    private Context mContext;    

         

    public ScrollBackListView(Context context){    

        super(context);    

        mContext = context;    

    }    

         

    public ScrollBackListView(Context context, AttributeSet attrs){    

        super(context, attrs);    

        mContext = context;    

    }    

         

    public ScrollBackListView(Context context, AttributeSet attrs, int defStyle){    

        super(context, attrs, defStyle);    

        mContext = context;    

    }    

         

    @Override    

    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent){     

        int newDeltaY = deltaY;  

        int delta = (int) (deltaY * SCROLL_RATIO);  

        if (delta != 0) newDeltaY = delta;  

        return super.overScrollBy(deltaX, newDeltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, MAX_SCROLL, isTouchEvent);      

    }  

}  

其中deltaX,deltaY为本次滑动偏移,scrollX,scrollY为当前总偏移,我们可以给deltaY乘以一个小数来达到一种阻尼的效果

结果截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息