Android 自定义弹性ListView

弹性ListView

import android.content.Context;
import android.content.res.Configuration;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.ListView;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * Created by Noah on 2016/1/16.
 */
public class BounceListView extends ListView {

    private static final float MAX_Y_OVERSCROLL_DISTANCE = 200;

    private float mMaxYOverscrollDistance;

    public BounceListView(Context context) {
        this(context, null);
    }
    public BounceListView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public BounceListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initBounceListView();
    }

    private void initBounceListView(){
        final DisplayMetrics metrics = getContext().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) {
        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, (int)mMaxYOverscrollDistance, isTouchEvent);
    }

    /**
     * 设置本App所有的ListView弹性粒度
     * @param ctx
     * @param size
     * @return
     */
    public  boolean configGlobalMaxOverScrollDistance(Context ctx,int size)
    {
        try {
            final DisplayMetrics metrics = ctx.getResources().getDisplayMetrics();
            final float density = metrics.density;
            int value = (int) (density * size);
            mMaxYOverscrollDistance = value;

            ViewConfiguration config = ViewConfiguration.get(ctx);
            Field mOverscrollDistance =  ViewConfiguration.class.getDeclaredField("mOverscrollDistance");
            if(!mOverscrollDistance.isAccessible() || !Modifier.isPublic(mOverscrollDistance.getModifiers()))
            {
                mOverscrollDistance.setAccessible(true);
            }
            mOverscrollDistance.setInt(config,value);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}


你可能感兴趣的:(Android 自定义弹性ListView)