手把手教你Android全局触摸事件监听
在Android开发中,对于某些需要全局响应的触摸事件,我们需要对整个Activity设置触摸事件监听器。本文将手把手地教你如何在Android中实现全局触摸事件的监听。
实现原理
在Android中,我们可以通过在Activity中重写onTouchEvent()方法来监听触摸事件。onTouchEvent()方法接收一个MotionEvent对象,该对象封装了事件的各种详细信息,如事件类型、触摸点坐标等。因此我们可以通过解析MotionEvent对象的信息来实现我们所需要的功能。
实现步骤
- 在Activity的onCreate()方法中获取整个布局的父容器,并注册触摸事件监听器。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewGroup rootView = (ViewGroup) findViewById(android.R.id.content);
rootView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
// 处理触摸事件
return false;
}
});
}
}
- 在触摸事件监听器中解析MotionEvent对象的信息,实现所需功能。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewGroup rootView = (ViewGroup) findViewById(android.R.id.content);
rootView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// 处理按下事件
break;
case MotionEvent.ACTION_MOVE:
// 处理滑动事件
break;
case MotionEvent.ACTION_UP:
// 处理松开事件
break;
}
return false;
}
});
}
}
示例1:全局拦截滑动事件
有时候我们需要在整个Activity中拦截滑动事件,比如屏蔽上下滑动操作,只允许左右滑动。实现方法如下:
public class MainActivity extends AppCompatActivity {
private float mLastX;
private float mLastY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewGroup rootView = (ViewGroup) findViewById(android.R.id.content);
rootView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
mLastX = motionEvent.getRawX();
mLastY = motionEvent.getRawY();
break;
case MotionEvent.ACTION_MOVE:
float x = motionEvent.getRawX();
float y = motionEvent.getRawY();
float diffX = x - mLastX;
float diffY = y - mLastY;
if (Math.abs(diffX) > Math.abs(diffY)) {
// 左右滑动
return true;
} else {
// 上下滑动
return false;
}
case MotionEvent.ACTION_UP:
break;
}
return false;
}
});
}
}
在该示例中,我们记录了按下事件时的x、y坐标,在滑动事件中计算出x、y坐标的差值,并判断滑动方向,返回true表示将该事件拦截,false表示不拦截。
示例2:全局隐藏软键盘
当我们点击屏幕某个区域时,如果软键盘弹出了,需要点击两下才能将软键盘隐藏,这是很不方便的。因此我们可以通过对屏幕的触摸事件进行监听,在用户点击屏幕其他区域时自动隐藏软键盘。实现方法如下:
public class MainActivity extends AppCompatActivity {
private InputMethodManager mImm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
ViewGroup rootView = (ViewGroup) findViewById(android.R.id.content);
rootView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
View focusedView = getCurrentFocus();
if (isShouldHideInput(focusedView, motionEvent)) {
hideInputMethod(focusedView.getWindowToken());
}
}
return false;
}
});
}
private boolean isShouldHideInput(View focusedView, MotionEvent event) {
if (focusedView != null && (focusedView instanceof EditText)) {
int[] l = { 0, 0 };
focusedView.getLocationInWindow(l);
int left = l[0], top = l[1], bottom = top + focusedView.getHeight(), right = left + focusedView.getWidth();
if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) {
// 点击的区域在EditText内部,不需要隐藏软键盘
return false;
} else {
return true;
}
}
// 如果焦点不是EditText则忽略
return false;
}
private void hideInputMethod(IBinder token) {
if (token != null) {
mImm.hideSoftInputFromWindow(token,
InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
在该示例中,我们获取了系统的InputMethodManager对象,在触摸事件中判断是否需要隐藏软键盘并调用hideSoftInputFromWindow()方法进行隐藏。
以上就是实现Android全局触摸事件监听的完整攻略,希望能对你有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:手把手教你Android全局触摸事件监听 - Python技术站