【问题标题】:How to forward click event to Launcher app?如何将点击事件转发到 Launcher 应用程序?
【发布时间】:2020-08-27 09:58:47
【问题描述】:

我有一个以编程方式放置在主屏幕上的小部件,我让用户可以将它拖到他想要的位置。我在视图中添加了一个 OnTouchListener 以获取运动事件(这样我下次可以记住屏幕上的视图位置),它会在我点击主屏幕的任何位置触发,即使这在我的视图之外。

我想要实现的是将 MotionEvent.ACTION_UP 转发到 Launcher 应用程序,这样,如果用户单击应用程序图标,该应用程序就会启动。或者,在我的视图之外单击时不接收此事件。这是我所做的:

 LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 inflatedViewWidget = inflater.inflate(R.layout.mtc_appwidget, null);

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                        WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                        0,
                        PixelFormat.TRANSLUCENT);
final WindowManager wm = (WindowManager) context.getSystemService(WINDOW_SERVICE);
wm.addView(inflatedViewWidget, params);

OnTouchListener:

inflatedViewWidget.setClickable(true);
inflatedViewWidget.setOnTouchListener(new View.OnTouchListener() {
       public boolean onTouch(View v, MotionEvent event) {

                        int action = event.getAction();
                        switch (action) {
                            case MotionEvent.ACTION_UP:
                                //how to forward event to Launcher app?
                                break;

【问题讨论】:

  • 手动启动应用程序而不是将事件转发到启动器应用程序怎么样?看到这个答案:stackoverflow.com/a/11262904/9167710
  • 您是否暗示您已经创建了自定义启动器应用程序 UI 并以编程方式放置小部件和其他应用程序图标?

标签: java android android-windowmanager


【解决方案1】:

AFAIK,不允许在另一个应用程序中点击,这将允许覆盖应用程序让您点击支付按钮,例如,您需要 root 或调试功能。

所以诀窍是使用窗口大小。 您的小部件的窗口大小和位置应始终与可点击区域相匹配。 您可以使用 WindowManager 上的 updateViewLayout method 来执行此操作。

一个很好的例子可以在这里找到: https://medium.com/@kevalpatel2106/create-chat-heads-like-facebook-messenger-32f7f1a62064

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    相关资源
    最近更新 更多