[mobilesafe] 02_双击事件-以及触摸事件和长按事件执行顺序

Android 4.0

一、双击事件

Android中双击事件:Android中没有提供双击的API:1、第一次点击,记录第一次点击的时间;
2、第二次点击,判断是否第一次时间大于零,如果大于,那么说明前面已经点击了一次,并记录第二次点击的时间;
3、如果第二次点击的时间减去第一次的时间小于500毫秒,那么属于双击事件;
4、如果有触摸事件,那么触摸事件不能返回true,否则该事件就consume,后面的点击事件就不生效了。
核心代码:
// 10、双击事件
iv_dragview.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.i(TAG"iv_dragview单击了~~");
        // b) 第二次点击
        if (firstClickTime > 0) {
            secondClickTime = System.currentTimeMillis();
            long dTime = secondClickTime - firstClickTime;
            if (dTime < 400) {// 为双击事件
                Log.i(TAG"iv_dragview双击了~~");
                // iv_dragview居中
                int l = window_width / 2 - iv_dragview.getWidth() / 2;
                int r = window_width / 2 + iv_dragview.getWidth() / 2;
                iv_dragview.layout(l, iv_dragview.getTop(), r, iv_dragview.getBottom());
            }
        }
        // a)第一次点击
        firstClickTime = System.currentTimeMillis();
    }
});
二、双击事件以及触摸事件和长按事件执行顺序
注意1:如果同时设置了 setOnTouchListener事件,触摸事件已经返回false,那么该事件被consume,点击事件和双击事件就无法响应了。
setOnTouchListener(l)触摸事件
setOnLongClickListener(l)长按事件
setOnClickListener(l)点击事件
1)先触发触摸事件的
MotionEvent.ACTION_DOWN,如果有拖动,触发 MotionEvent.ACTION_MOVE
2)如果长按了,触发长按事件
3)接着,手松开触发  MotionEvent.ACTION_UP  
4)最后触发点击事件
注意2:一定要将setOnTouchListener(l)触摸事件设置为false,否则事件会被消耗consume掉,后面的setOnLongClickListener(l)长按事件setOnClickListener(l)点击事件就无法触发。

package cn.zengfansheng.touchandclick;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
 
public class MainActivity extends Activity {
    protected static final String TAG = "MainActivity";
    private Button bt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        bt = (Button) this.findViewById(R.id.bt);
 
        // 1、单击事件
        bt.setOnClickListener(new OnClickListener() {
 
            @Override
            public void onClick(View v) {
                Log.i(TAG, "单击了");
            }
        });
 
        // 2、触摸事件
        bt.setOnTouchListener(new OnTouchListener() {
 
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    Log.i(TAG, "MotionEvent.ACTION_DOWN、、、");
                    break;
                case MotionEvent.ACTION_MOVE:
                    Log.i(TAG, "MotionEvent.ACTION_MOVE、、、");
                    break;
                case MotionEvent.ACTION_UP:
                    Log.i(TAG, "MotionEvent.ACTION_UP、、、");
                    break;
                }
                // return true;//不能写true,否则就消耗了该事件,后面的点击事件就无效了
                return false;
            }
        });
        // 3、长按事件
        bt.setOnLongClickListener(new OnLongClickListener() {
 
            @Override
            public boolean onLongClick(View v) {
                Log.i(TAG, "LongClick...");
                return false;
            }
        });
    }
}
结果: