可拖拽的ListView

今天研究了一下可拖拽的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);
    }

}

 

转载于:https://www.cnblogs.com/xiang1992/p/3407118.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值