您的位置:首页 > 产品设计 > UI/UE

【Android UI】具有弹性的ListView

2016-05-03 11:20 393 查看
要实现的效果就是,滑动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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: