要实现的效果就是,滑动ListView到顶部或者底部时会继续向上或者向下滑动一段距离。
效果如下:
通过查看ListView源码,ListView中有一个控制滑动到边缘的处理方法,如下所示:
protected boolean overScrollBy(int deltaX, int deltaY,
int scrollX, int scrollY,
int scrollRangeX, int scrollRangeY,
int maxOverScrollX, int maxOverScrollY,
boolean isTouchEvent)
这里面的maxOverScrollY参数就可以实现我们要实现的效果了,其默认值是0,也就是没有弹性效果。
我们可以自定义一个ListView重写overScrollBy方法,修改maxOverScrollY的值,这样就实现了弹性效果。
自定义的ListView代码如下:
package com.yzx.mylistview;
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.widget.ListView;
/**
* Created by yzx on 2016/5/2.
*/
public class FlexibleListView extends ListView {
private static int mMaxOverDistance = 50;
private Context mContext;
public FlexibleListView(Context context) {
super(context);
this.mContext = context;
initView();
}
public FlexibleListView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
initView();
}
public FlexibleListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
initView();
}
private void initView(){
DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
float density = metrics.density;
mMaxOverDistance = (int) (mMaxOverDistance*density);
}
@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, mMaxOverDistance,
isTouchEvent);
}
}
FlexibleListViewTest文件代码:
package com.yzx.mylistview;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
/**
* Created by yzx on 2016/5/2.
*/
public class FlexibleListViewTest extends Activity {
private FlexibleListView mFlexibleListView;
private String[] data = new String[30];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.flexible);
for (int i=0; i<30; i++) {
data[i] = ""+i;
}
mFlexibleListView = (FlexibleListView) findViewById(R.id.flexible_listview);
mFlexibleListView.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
data));
}
}
flexible.xml文件代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.yzx.mylistview.FlexibleListView
android:id="@+id/flexible_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>