一些开发者正在使用触摸事件而非系统onOffsetsChanged()来处理TouchWiz。我认为,目前唯一更好的方法是使用混合事件系统,它将按如下方式工作:
1) 始终假设onOffsetsChanged()消息未正确发送(使布尔属性默认为false)。
2) 这意味着您应该实现onTouch()方法以正确模拟onOffsetsChanged()。仅在布尔属性仍为false时侦听onTouch()。
3) 当调用onOffsetsChanged()时,请检查xOffset参数。如果它既不是0.0f也不是0.5f,则将布尔属性更改为true,并仅侦听onOffsetsChanged()。
代码将类似于:
public class myEngine extends WallpaperService.Engine {
private boolean offsetChangedWorking = false;
public void onOffsetsChanged (float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {
if (offsetChangedWorking == false && xOffset != 0.0f && xOffset != 0.5f) {
offsetChangedWorking = true;
}
if (offsetChangedWorking == true) {
}
}
public void onTouchEvent(MotionEvent paramMotionEvent) {
if (offsetChangedWorking == false) {
}
}
}
这段代码只是一个示例。请注意,使用“==”比较浮点数是不正确的,但在这种情况下可能会起作用。
另外,三星视差LWP的工作方式似乎也是相同的。如果您拥有一个带有TouchWiz和其他正常工作的启动器(可以正常发送onOffsetsChanged())的设备,您可以自己试试:
1)首先在TouchWiz上设置视差LWP,并查看它仅依赖于onTouchEvent()
2)将启动器更改为其他启动器。查看LWP现在依赖于onOffsetsChanged()
3)再次将启动器更改为TouchWiz,并查看左右滑动对于此LWP不再起作用。
因此,我建议在每个onResume()事件中都将布尔值offsetChangedWorking再次更改为false。这应该可以防止由于启动器更改而导致的此类错误。