我可以在 Android Studio 中使用哪个组件来创建触摸板?
Which component can I use in Android Studio for the purpose of creating a touchpad?
我一直在 Android Studio 中寻找可用于创建触摸板的 View/Component。我需要跟踪鼠标移动的能力,以便我在服务器端使用该信息来处理它并模拟鼠标移动。
什么最适合这个目的?
那将是 ScrollView or a HorizontalScrollView。
不幸的是,Shishdem 的回答并不令我满意。我基本上想要实现的是为学校项目制作触摸板原型。 ScrollView
包含要在其中滚动的元素,我需要跟踪适合我的服务器应用程序在 PC 上移动光标时处理的手指移动信息。
我在这里找到了解决方案:Track touch and pointer movements
我需要创建一个 android.view.VelocityTracker
and track touch velocity to further send that data to my PC server and simulate mouse movements via java.awt.Robot
within onTouchEvent
。该组件可以是任何东西,在我的例子中是 Button
。
这里是 class 处理触摸板视图触摸事件的工作代码:
private VelocityTracker mVelocityTracker = null;
@Override
public boolean onTouchEvent(MotionEvent event) {
int index = event.getActionIndex();
int action = event.getActionMasked();
int pointerId = event.getPointerId(index);
switch(action) {
case MotionEvent.ACTION_DOWN:
if(mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
}
else {
mVelocityTracker.clear();
}
mVelocityTracker.addMovement(event);
break;
case MotionEvent.ACTION_MOVE:
mVelocityTracker.addMovement(event);
mVelocityTracker.computeCurrentVelocity(1000);
// Log velocity of pixels per second
// Those values can be used to be sent to the server
Log.d("Velocity", "X velocity: " + mVelocityTracker.getXVelocity(pointerId));
Log.d("Velocity", "Y velocity: " + mVelocityTracker.getYVelocity(pointerId));
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mVelocityTracker.recycle();
mVelocityTracker = null;
break;
}
return true;
}
万一崩溃
请注意,在上面的 link 示例中,没有这一行:
mVelocityTracker.recycle();
mVelocityTracker = null; // this line
但在我的例子中,如果我没有将 mVelocityTracker
分配给 null
每次回收,它会崩溃并出现以下错误:
2021-10-05 09:30:21.711 4385-4385/com.example.javaapp E/InputEventReceiver: Exception dispatching input event.
2021-10-05 09:30:21.711 4385-4385/com.example.javaapp E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
2021-10-05 09:30:21.713 4385-4385/com.example.javaapp E/MessageQueue-JNI: java.lang.IllegalStateException: Already in the pool!
at android.util.Pools$SimplePool.release(Pools.java:120)
at android.util.Pools$SynchronizedPool.release(Pools.java:179)
at android.view.VelocityTracker.recycle(VelocityTracker.java:87)
关于该问题的更多信息:VelocityTracker causes crash on Android 4.4
我一直在 Android Studio 中寻找可用于创建触摸板的 View/Component。我需要跟踪鼠标移动的能力,以便我在服务器端使用该信息来处理它并模拟鼠标移动。
什么最适合这个目的?
那将是 ScrollView or a HorizontalScrollView。
不幸的是,Shishdem 的回答并不令我满意。我基本上想要实现的是为学校项目制作触摸板原型。 ScrollView
包含要在其中滚动的元素,我需要跟踪适合我的服务器应用程序在 PC 上移动光标时处理的手指移动信息。
我在这里找到了解决方案:Track touch and pointer movements
我需要创建一个 android.view.VelocityTracker
and track touch velocity to further send that data to my PC server and simulate mouse movements via java.awt.Robot
within onTouchEvent
。该组件可以是任何东西,在我的例子中是 Button
。
这里是 class 处理触摸板视图触摸事件的工作代码:
private VelocityTracker mVelocityTracker = null;
@Override
public boolean onTouchEvent(MotionEvent event) {
int index = event.getActionIndex();
int action = event.getActionMasked();
int pointerId = event.getPointerId(index);
switch(action) {
case MotionEvent.ACTION_DOWN:
if(mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
}
else {
mVelocityTracker.clear();
}
mVelocityTracker.addMovement(event);
break;
case MotionEvent.ACTION_MOVE:
mVelocityTracker.addMovement(event);
mVelocityTracker.computeCurrentVelocity(1000);
// Log velocity of pixels per second
// Those values can be used to be sent to the server
Log.d("Velocity", "X velocity: " + mVelocityTracker.getXVelocity(pointerId));
Log.d("Velocity", "Y velocity: " + mVelocityTracker.getYVelocity(pointerId));
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mVelocityTracker.recycle();
mVelocityTracker = null;
break;
}
return true;
}
万一崩溃
请注意,在上面的 link 示例中,没有这一行:
mVelocityTracker.recycle();
mVelocityTracker = null; // this line
但在我的例子中,如果我没有将 mVelocityTracker
分配给 null
每次回收,它会崩溃并出现以下错误:
2021-10-05 09:30:21.711 4385-4385/com.example.javaapp E/InputEventReceiver: Exception dispatching input event.
2021-10-05 09:30:21.711 4385-4385/com.example.javaapp E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
2021-10-05 09:30:21.713 4385-4385/com.example.javaapp E/MessageQueue-JNI: java.lang.IllegalStateException: Already in the pool!
at android.util.Pools$SimplePool.release(Pools.java:120)
at android.util.Pools$SynchronizedPool.release(Pools.java:179)
at android.view.VelocityTracker.recycle(VelocityTracker.java:87)
关于该问题的更多信息:VelocityTracker causes crash on Android 4.4