欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android自定义长按事件,android自定义事件

来源: 开发者 投稿于  被查看 33714 次 评论:272

Android自定义长按事件,android自定义事件


Android系统自带了长按事件,setOnLongClickListener即可监听。但是有时候,你不希望用系统的长按事件,比如当希望长按的时间更长一点的时候。这时候就需要自己来定义这个长按事件了。

1.[Java]代码

package chroya.fun;   
  
import android.content.Context;   
import android.view.MotionEvent;   
import android.view.View;   
import android.view.ViewConfiguration;   
  
public class LongPressView1 extends View{   
    private int mLastMotionX, mLastMotionY;   
    //是否移动了   
    private boolean isMoved;   
    //是否释放了   
    private boolean isReleased;   
    //计数器,防止多次点击导致最后一次形成longpress的时间变短   
    private int mCounter;   
    //长按的runnable   
    private Runnable mLongPressRunnable;   
    //移动的阈值   
    private static final int TOUCH_SLOP = 20;   
  
    public LongPressView1(Context context) {   
        super(context);   
        mLongPressRunnable = new Runnable() {   
               
            @Override  
            public void run() {   
                mCounter--;   
                //计数器大于0,说明当前执行的Runnable不是最后一次down产生的。   
                if(mCounter>0 || isReleased || isMoved) return;   
                performLongClick();   
            }   
        };   
    }   
  
    public boolean dispatchTouchEvent(MotionEvent event) {   
        int x = (int) event.getX();   
        int y = (int) event.getY();   
           
        switch(event.getAction()) {   
        case MotionEvent.ACTION_DOWN:   
            mLastMotionX = x;   
            mLastMotionY = y;   
            mCounter++;   
            isReleased = false;   
            isMoved = false;   
            postDelayed(mLongPressRunnable, ViewConfiguration.getLongPressTimeout());   
            break;   
        case MotionEvent.ACTION_MOVE:   
            if(isMoved) break;   
            if(Math.abs(mLastMotionX-x) > TOUCH_SLOP    
                    || Math.abs(mLastMotionY-y) > TOUCH_SLOP) {   
                //移动超过阈值,则表示移动了   
                isMoved = true;   
            }   
            break;   
        case MotionEvent.ACTION_UP:   
            //释放了   
            isReleased = true;   
            break;   
        }   
        return true;   
    }   
}  

用户评论