Android 启动器:允许触摸传递到动态壁纸

问题描述

我正在尝试创建一个简单的 Android 启动器。

我还使用了动态壁纸 (Kustom LWP),我可以点击其中的某些区域来执行操作。

我可以使用这些样式属性查看壁纸:

<item name="android:windowIsTranslucent">true</item>
<item name="android:windowShowWallpaper">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>

但是,如果我尝试点击墙纸上的某个项目,则触摸不会通过。

我尝试了 android:clickable="falseandroid:focusable="false",并将我的所有视图设置为具有返回 false 的 setonTouchListener,但这些都不能解决问题。

我该怎么做?

解决方法

回答我自己的问题:在 Launcher3 中进行了一些挖掘后,我发现我需要在主屏幕视图的触摸侦听器上使用 WallpaperManagersendWallpaperCommand 函数:

import android.app.WallpaperManager;

private final int[] mTempXY = new int[2];
WallpaperManager mWallpaperManager = WallpaperManager.getInstance(context);

...

homeScreenView.setOnTouchListener((v,event) -> {
    onWallpaperTap(v,event);
    return true;
});

...

protected void onWallpaperTap(View view,MotionEvent ev) {
    final int[] position = mTempXY;
    view.getLocationOnScreen(position);

    int pointerIndex = ev.getActionIndex();
    position[0] += (int) ev.getX(pointerIndex);
    position[1] += (int) ev.getY(pointerIndex);

    MainActivity.mWallpaperManager.sendWallpaperCommand(view.getWindowToken(),ev.getAction() == MotionEvent.ACTION_UP
                    ? WallpaperManager.COMMAND_TAP : WallpaperManager.COMMAND_SECONDARY_TAP,position[0],position[1],null);
}

现在我的壁纸可以接收触摸输入。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...