问题描述
我正在尝试创建一个简单的 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="false
和 android:focusable="false"
,并将我的所有视图设置为具有返回 false 的 setonTouchListener
,但这些都不能解决问题。
我该怎么做?
解决方法
回答我自己的问题:在 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],null);
}
现在我的壁纸可以接收触摸输入。