今天研究了一下可拖拽的ListView ,当ListView的数据不能充满整个模拟器的时候,系统自带的listview上拖下拽都不好使,显得很单调,
为了实现上拖下拽时也能实现滚动的效果,这时候就需要自定义ListView ,继承系统的ListView。
下面贴上自定义的ListView 。
package com.xiang.widget; import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ListView; public class DenifyMyListView extends ListView implements Runnable {
private float mFirstDownY=0f;
private int mDistance=0;
private int mStep=0;
private boolean mpostive=false;
public DenifyMyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); }
public DenifyMyListView(Context context, AttributeSet attrs) {
super(context, attrs); }
public DenifyMyListView(Context context) {
super(context); }
@Override
public boolean onTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
if(mFirstDownY == 0f && mDistance == 0)
{
mFirstDownY=ev.getY();
return true;//将事件消耗掉
} break;
case MotionEvent.ACTION_CANCEL: break;
case MotionEvent.ACTION_UP:
if(mDistance!=0)
{
mStep=1;
mpostive = ( mDistance > 0);
this.post(this);
return true;
}
mDistance=0;
mFirstDownY=0;
break; case MotionEvent.ACTION_MOVE:
/*
* 若 第一次按下的Y坐标不为0,并且移动时产生不为0的距离,就产生滑动距离一半的空白ListView,
* 显示到页面上,若按下坐标为0即相当于没有按下,没有按下滑动自然不会产生。距离还是初始值0
*/
if(mFirstDownY != 0f)
{
mDistance=(int) (mFirstDownY-ev.getY());
if ((mDistance < 0 && getFirstVisiblePosition() == 0 && getChildAt(0).getTop() == 0)
|| (mDistance > 0 && getLastVisiblePosition() == getCount() - 1))
{
mDistance /= 2;
scrollTo(0, mDistance);
return true;//同样的,消耗掉这一触摸事件
}
}
mDistance=0;
break;
default:
break;
}
return super.onTouchEvent(ev);
}
@Override
public void run() {
mDistance += ( mDistance > 0 ? -mStep : mStep);
scrollTo(0, mDistance);
if((mDistance >=0 && !mpostive)||( mpostive && mDistance <= 0))
{
scrollTo(0, 0);
mDistance=0;
mFirstDownY=0;
return;
}
mStep += 1;
this.postDelayed(this, 10);
} }