Android启动器:允许触摸通过动态壁纸

thtygnil  于 2023-01-11  发布在  Android
关注(0)|答案(1)|浏览(142)

我试图创建一个简单的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,但这些都不能解决这个问题。
我该怎么做呢?

xxhby3vn

xxhby3vn1#

回答我自己的问题:在对Launcher3做了一些挖掘之后,我发现我需要在Touch Listener上使用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], 0, null);
}

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

相关问题