提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、连续点击事件监听
TextView bts = (TextView) findViewById(R.id.bts);
bts.setOnClickListener(new View.OnClickListener() {
long[] mHints = new long[5];//点击5次,长度为5
@Override
public void onClick(View v) {
System.arraycopy(mHints, 1, mHints, 0, mHints.length - 1);
mHints[mHints.length - 1] = SystemClock.uptimeMillis();
if (SystemClock.uptimeMillis() - mHints[0] <= 3000){ //判断点击5次的总时间小于3秒
Toast.makeText(getApplicationContext(), "当你点击5次之后才会出现", Toast.LENGTH_SHORT).show();
}
}
});
二、长按事件监听
第一种方法自定义长按事件,可设置长按时间
第一步创建一个类
LongClickUtils.java
import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;
public class CustomLongClick{
private static final String TAG = "CustomLongClick";
/**
* handler 外界handler(为了减少handler的泛滥使用,最好全局传handler引用,如果没有就直接传 new Handler())
* longClickView 被长按的视图(任意控件)
* delayMillis 长按时间,毫秒
* longClickListener 长按回调的返回事件
*/
public static void setLongClick(final Handler handler, final View longClickView, final long delayMillis, final View.OnLongClickListener longClickListener) {
longClickView.setOnTouchListener(new View.OnTouchListener() {
private int TOUCH_MAX = 50;
private int mLastMotionX;
private int mLastMotionY;
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
// 抬起时,移除已有Runnable回调,抬起就算长按了(不需要考虑用户是否长按了超过预设的时间)
handler.removeCallbacks(r);
break;
case MotionEvent.ACTION_MOVE:
if (Math.abs(mLastMotionX - x) > TOUCH_MAX
|| Math.abs(mLastMotionY - y) > TOUCH_MAX) {
// 移动误差阈值
// xy方向判断
// 移动超过阈值,则表示移动了,就不是长按,移除 已有的Runnable回调
handler.removeCallbacks(r);
}
break;
case MotionEvent.ACTION_DOWN:
// 每次按下重新计时
// 按下前,先移除 已有的Runnable回调,防止用户多次单击导致多次回调长按事件的bug
handler.removeCallbacks(r);
mLastMotionX = x;
mLastMotionY = y;
// 按下时,开始计时
handler.postDelayed(r, delayMillis);
break;
}
return true;
}
private Runnable r = new Runnable() {
@Override
public void run() {
if (longClickListener != null) {// 回调给用户,用户可能传null,需要判断null
longClickListener.onLongClick(longClickView);
}
}
};
});
}
}
第二步调用
MainActivity.java中调用
TextView bts = (TextView) findViewById(R.id.bts);
CustomLongClick.setLongClick(new Handler(), bts, 5000, new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if(v == bts){
Toast.makeText(getApplicationContext(), "当你长按5秒之后才会出现", Toast.LENGTH_SHORT).show();
}
return true;
}
});
第二种方法,使用系统长按事件
TextView bts = (TextView) findViewById(R.id.bts);
bts.setOnLongClickListener(new View.OnLongClickListener(){
@Override
public boolean onLongClick(View v) {
if(v == bts){
Toast.makeText(getApplicationContext(), "当你长按之后才会出现", Toast.LENGTH_SHORT).show();
}
return false;
}
});
三、屏幕触摸事件处理
对指定的控件监听屏幕触摸事件
TextView im = (TextView)findViewById(R.id.tex);
im.setOnTouchListener(new View.OnTouchListener() {
//onTouch方法响应触摸事件
@Override
public boolean onTouch(View v, MotionEvent event) {
//判断是否为按下事件
if(event.getAction() == MotionEvent.ACTION_DOWN){
im.setText("按下");
}
//判断是否为移动事件
if(event.getAction() == MotionEvent.ACTION_MOVE){
im.setText("滑动");
}
//判断是否为弹起事件
if(event.getAction() == MotionEvent.ACTION_UP){
im.setText("基于监听的单点触摸响应");
}
return true;
}
});
监听详细的触摸事件
TextView im = (TextView) findViewById(R.id.aat);
im.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
// 单指
case MotionEvent.ACTION_DOWN:
sa.setText("单指触碰");
d = 1;
break;
// 双指
case MotionEvent.ACTION_POINTER_DOWN:
sa.setText("双指触碰");
d += 1;
break;
// 手指放开
case MotionEvent.ACTION_UP:
sa.setText("最后一个手指放开放开");
d = 0;
break;
case MotionEvent.ACTION_POINTER_UP:
sa.setText("双指放开");
d -= 1;
break;
// 滑动事件
case MotionEvent.ACTION_MOVE:
if (d == 1) {
// 是一个手指拖动
sa.setText("单指滑动");
} else if (d > 1) {
// 两个手指滑动
sa.setText(d + "指滑动");
} else {
sa.setText("无触摸");
}
break;
}
return true;
}
});
}
四、屏幕手势事件处理
1.新建一个类GesTurel实现GestureDetector.OnGestureListener
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.TextView;
public class GesTurel implements GestureDetector.OnGestureListener {
TextView txtt;
public GesTurel(TextView txtt) {
this.txtt = txtt;
}
//刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
@Override
public boolean onDown(MotionEvent motionEvent) {
txtt.setText("手指接触到屏幕");
return false;
}
//手指按在触摸屏上,它的时间范围在按下起效,在长按之前
@Override
public void onShowPress(MotionEvent motionEvent) {
txtt.setText("手指按住了屏幕");
}
//手指离开触摸屏的那一刹那
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
txtt.setText("手指离开屏幕");
return false;
}
// 手指在触摸屏上滑动。
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
txtt.setText("手指正在滑动");
return false;
}
//手指按在持续一段时间,并且没有松开。
@Override
public void onLongPress(MotionEvent motionEvent) {
txtt.setText("手指按住很久了");
}
//手指在触摸屏上迅速移动,并松开的动作。
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
txtt.setText("迅速滑动");
return false;
}
}
2.调用监听
MainActivity.java
public class MainActivity extends AppCompatActivity {
GesTurel gl;
GestureDetector de;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView txtt = (TextView)findViewById(R.id.sh_tx);
//实例化手势监听对象和手势识别对象
gl = new GesTurel(txtt); //手势监听器
de = new GestureDetector(this, gl); //手势识别,GestureDetector为系统提供的手势识别类
}
//将TouchEvent事件传给手势识别对象
@Override
public boolean onTouchEvent(MotionEvent event) {
return de.onTouchEvent(event);
}
}