首页 > 解决方案 > Android Launcher:允许触摸通过动态壁纸

问题描述

我正在尝试创建一个简单的 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="falseand android:focusable="false",并将我的所有视图设置为setOnTouchListener返回 false ,但这些都不能解决问题。

我该怎么做呢?

标签: androidtouchlive-wallpaperandroid-launcher

解决方案


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

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], 0, null);
}

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


推荐阅读