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

标签 java android

我使用了一项服务,该服务以 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);
           }
        });
    }
}

在我的用户界面中,我用按钮(带有适当的监听器)覆盖了屏幕,以便我可以轻松地发现按下了哪个按钮。然而,主要 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/

相关文章:

java - spring mvc 未定义名为 'springSecurityFilterChain' 的 bean

android - 将 .NET Standard 类库转换为 native aar/jar

java - 使用循环绘制多个形状 - Android Canvas

android - 使用 Facebook SDK 4.1.2 创建登录按钮时出现问题

android - Cordova Phonegap 本地通知不起作用

java - 在 OnClick android 上启动后台服务

java - Camunda BPM 执行和可变范围误解

java - 更改 Java 应用程序图标?

java - GC 和在 for 循环中赋值

java - Android - 微调器 + setOnClickListener