自定义View实现单击,双击效果

来源:互联网 发布:c语言指针和引用 编辑:程序博客网 时间:2024/06/16 06:31

自定义View,

1. 自定义一个Runnable线程TouchEventCountThread ,  用来统计500ms内的点击次数

2. 在MyView中的 onTouchEvent 中调用 上面的线程

3. 自定义一个Handler, 在TouchEventHandler 中 处理 统计到的点击事件, 单击, 双击, 三击, 都可以处理

 

核心代码如下:  

复制代码
public class MyView extends View {   ......    // 统计500ms内的点击次数    TouchEventCountThread mInTouchEventCount = new TouchEventCountThread();    // 根据TouchEventCountThread统计到的点击次数, perform单击还是双击事件    TouchEventHandler mTouchEventHandler = new TouchEventHandler();    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                if (0 == mInTouchEventCount.touchCount) // 第一次按下时,开始统计                    postDelayed(mInTouchEventCount, 500);                break;            case MotionEvent.ACTION_UP:                // 一次点击事件要有按下和抬起, 有抬起必有按下, 所以只需要在ACTION_UP中处理                mInTouchEventCount.touchCount++;                // 如果是长按操作, 则Handler的消息,不能将touchCount置0, 需要特殊处理                if(mInTouchEventCount.isLongClick) {                    mInTouchEventCount.touchCount = 0;                    mInTouchEventCount.isLongClick = false;                }                break;            case MotionEvent.ACTION_MOVE:                break;            case MotionEvent.ACTION_CANCEL:                break;            default:                break;        }        return super.onTouchEvent(event);    }    public class TouchEventCountThread implements Runnable {        public int touchCount = 0;        public boolean isLongClick = false;        @Override        public void run() {            Message msg = new Message();            if(0 == touchCount){ // long click                isLongClick = true;            } else {                msg.arg1 = touchCount;                mTouchEventHandler.sendMessage(msg);                touchCount = 0;            }        }    }    public class TouchEventHandler extends Handler {        @Override        public void handleMessage(Message msg) {            Toast.makeText(mContext, "touch " + msg.arg1 + " time.", Toast.LENGTH_SHORT).show();
            //在此处可以判断msg.arg1的数值是1还是2,来判断单击还是双击        }    }    ......}
0 0
原创粉丝点击