gpt4 book ai didi

java - 在后台线程中模拟 Android 中的触摸事件

转载 作者:行者123 更新时间:2023-11-29 19:42:34 28 4
gpt4 key购买 nike

我使用了一种服务,它以 3 秒的间隔向处理程序发布代码,以持续生成简单的触摸事件(按下按钮)。

这是服务代码:

public class BackgroundTouchService extends IntentService
{
public BackgroundTouchService() {
super("BackgroundTouchService");
}

@Override
protected void onHandleIntent(Intent intent)
{
final MotionEvent event = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
MotionEvent.ACTION_BUTTON_PRESS, 400, 400, 0);

final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run()
{
View v = new View(getApplication());
v.onTouchEvent(event);
handler.postDelayed(this, 3000);
}
});
}
}

在我的 UI 中,我用按钮覆盖了屏幕(带有适当的监听器),以便我可以轻松地发现按下了哪个按钮。但是,主要 Activity 加载完毕,然后什么也没有发生。这是为什么?

编辑:正如 Vojtěch Sáze 正确指出的那样,上述代码中的处理程序与主线程没有关联,因此不能用于通过生成触摸事件来修改 UI。因此,我在主 Activity 本身中编写了处理程序的代码:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

startTouch();
}

private void startTouch()
{
final MotionEvent event = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
MotionEvent.ACTION_BUTTON_PRESS,400.0f, 400.0f, 0);

final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run()
{
onTouchEvent(event);
handler.postDelayed(this, 3000);
}
});
}
}

但是,这仍然没有做任何事情。有什么想法吗?

解决方案:好的,所以在MotionEvent.obtain方法的事件类型参数中我本来指定了ACTION_BUTTON_PRESS,但是,当我习惯于将事件分开指定ACTION_DOWN和ACTION_UP时,这似乎起作用了。欢迎任何关于为什么会发生这种情况的解释。如果有人需要这个,这里是代码:

final MotionEvent event = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
MotionEvent.ACTION_DOWN,400.0f, 400.0f, 0);
final MotionEvent event2 = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
MotionEvent.ACTION_UP, 400.0f, 400.0f, 0);

final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run()
{
dispatchTouchEvent(event);
dispatchTouchEvent(event2);
handler.postDelayed(this, 3000);
}
});

最佳答案

我认为您需要使用 dispatchTouchEvent 方法将触摸事件发送到 View 。

关于java - 在后台线程中模拟 Android 中的触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38390582/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com