安卓10源码环境 如何调用系统级 java api 来监听手机触摸 app_process来执行 请给出代码
要使用系统级 Java API 监听手机触摸,需要使用 Android 框架中的 MotionEvent 类。以下是一个示例代码,可以在 app_process 中执行:
import android.view.MotionEvent;
import android.view.ViewConfiguration;
public class TouchListener implements Runnable {
private static final int TOUCH_MOVE_THRESHOLD = ViewConfiguration.getTouchSlop();
private int mLastX;
private int mLastY;
public void run() {
while (true) {
MotionEvent event = getNextEvent();
if (event.getAction() == MotionEvent.ACTION_MOVE) {
int x = (int) event.getX();
int y = (int) event.getY();
int dx = x - mLastX;
int dy = y - mLastY;
if (Math.abs(dx) > TOUCH_MOVE_THRESHOLD || Math.abs(dy) > TOUCH_MOVE_THRESHOLD) {
onMove(x, y);
mLastX = x;
mLastY = y;
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {
onUp();
break;
}
}
}
private MotionEvent getNextEvent() {
// TODO: Implement this method to get the next touch event.
return null;
}
private void onMove(int x, int y) {
// TODO: Implement this method to handle touch move events.
}
private void onUp() {
// TODO: Implement this method to handle touch up events.
}
}
在上面的代码中,我们首先定义了一个 TouchListener 类,它实现了 Runnable 接口。然后在 run() 方法中,我们使用 getNextEvent() 方法获取下一个触摸事件,如果是 ACTION_MOVE 事件,就判断是否超过了 TOUCH_MOVE_THRESHOLD 阈值,如果是,就调用 onMove() 方法处理移动事件,并更新 mLastX 和 mLastY 变量。如果是 ACTION_UP 事件,就调用 onUp() 方法处理触摸结束事件,并跳出循环。
在使用这个 TouchListener 类之前,我们需要实现 getNextEvent() 方法来获取下一个触摸事件。这个方法可以使用 Android 框架中的 InputEventReceiver 类来实现。以下是一个简单的实现示例:
import android.os.Looper;
import android.os.SystemClock;
import android.view.InputDevice;
import android.view.InputEvent;
import android.view.InputEventReceiver;
import android.view.MotionEvent;
public class TouchEventReceiver extends InputEventReceiver {
private final Looper mLooper;
private final TouchListener mTouchListener;
public TouchEventReceiver(Looper looper, TouchListener touchListener) {
super(looper);
mLooper = looper;
mTouchListener = touchListener;
}
@Override
public void onInputEvent(InputEvent event) {
if (event instanceof MotionEvent) {
mTouchListener.onTouchEvent((MotionEvent) event);
}
super.onInputEvent(event);
}
public void sendTouchEvent(int action, int x, int y) {
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis();
MotionEvent event = MotionEvent.obtain(
downTime, eventTime, action, x, y, 0);
event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
dispatchEvent(event);
}
public void quit() {
mLooper.quit();
}
}
在上面的代码中,我们定义了一个 TouchEventReceiver 类,它继承自 InputEventReceiver 类。在构造函数中,我们传入了一个 Looper 对象和一个 TouchListener 对象。在 onInputEvent() 方法中,我们判断事件是否是 MotionEvent,并调用 TouchListener 的 onTouchEvent() 方法处理事件。在 sendTouchEvent() 方法中,我们创建一个新的 MotionEvent 对象,并调用 dispatchEvent() 方法将事件分发给 InputEventReceiver。在 quit() 方法中,我们退出 Looper 循环。
最后,我们可以在 app_process 中创建 TouchListener 和 TouchEventReceiver 对象,并调用 TouchListener 的 run() 方法来监听触摸事件。以下是一个示例代码:
import android.os.Handler;
import android.os.Looper;
public class Main {
public static void main(String[] args) {
Looper.prepareMainLooper();
TouchListener touchListener = new TouchListener();
TouchEventReceiver touchEventReceiver = new TouchEventReceiver(
Looper.myLooper(), touchListener);
touchListener.setTouchEventReceiver(touchEventReceiver);
new Handler().post(touchListener);
Looper.loop();
touchEventReceiver.quit();
}
}
在上面的代码中,我们首先调用 Looper.prepareMainLooper() 方法来创建主线程的 Looper 对象。然后创建 TouchListener 和 TouchEventReceiver 对象,并将它们互相绑定。最后调用 Handler 的 post() 方法来启动 TouchListener 的 run() 方法,并调用 Looper.loop() 方法进入主线程的消息循环。在循环结束后,我们调用 TouchEventReceiver 的 quit() 方法退出 Looper 循环
原文地址: http://www.cveoy.top/t/topic/ckM0 著作权归作者所有。请勿转载和采集!