package android.car.server.input;
import android.car.utils.InputIoctl;
import android.car.utils.touch.TouchWriter;
import android.os.SystemClock;
import android.util.Log;
import android.view.InputDevice;
import android.view.MotionEvent;
import android.view.MotionEvent.PointerCoords;
import java.util.ArrayList;
import static android.car.define.MainConfig.MCU_DEBUG;
import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_MOVE;
import static android.view.MotionEvent.ACTION_POINTER_DOWN;
import static android.view.MotionEvent.ACTION_POINTER_INDEX_MASK;
import static android.view.MotionEvent.ACTION_POINTER_INDEX_SHIFT;
import static android.view.MotionEvent.ACTION_POINTER_UP;
import static android.view.MotionEvent.ACTION_UP;
public class MultiTouchInject {
static final String TAG = "Car-MultiTouchInject";
private static final int MAX_TOUCH_COUNT = 10;
public static boolean USE_TOUCH_WRITER = true;
private int[] mPointerIds = new int[MAX_TOUCH_COUNT];
private PointerCoords[] mPointerCoords = new PointerCoords[MAX_TOUCH_COUNT];
private long mMultiTouchDownTime = 0;
private TouchWriter mTouchWriter;
static class PointerState {
public boolean valid;
public int id;
public int action;
public int x;
public int y;
public void clear() {
valid = false;
id = -1;
action = -1;
x = 0;
y = 0;
}
}
private PointerState[] mPointers = new PointerState[MAX_TOUCH_COUNT];
private ArrayList<PointerState> mActivePointers = new ArrayList<>();
public MultiTouchInject() {
for (int i = 0; i < MAX_TOUCH_COUNT; ++i) {
mPointerCoords[i] = new PointerCoords();
mPointers[i] = new PointerState();
}
String touchInputDevice = InputIoctl.getTouchInputDevicePath();
Log.e(TAG, "touchInputDevice=" + touchInputDevice);
mTouchWriter = new TouchWriter(touchInputDevice);
mTouchWriter.init();
}
/**
* 生成多点action
*/
private int makeMtAction(int id, int action) {
return ((id << ACTION_POINTER_INDEX_SHIFT) & ACTION_POINTER_INDEX_MASK) | action;
}
/**
* 通过id和action生成多点时用的action
*
* @param id
* @param action
* @return
*/
private int getMultiAction(int id, int action) {
// 如果是第一个点或MOVE事件, 则直接使用
switch (action) {
case ACTION_MOVE:
return ACTION_MOVE;
case ACTION_DOWN:
return makeMtAction(id, ACTION_POINTER_DOWN);
case ACTION_UP:
return makeMtAction(id, ACTION_POI
android 模拟触摸
最新推荐文章于 2023-04-12 14:10:08 发布