一些开发人员正在使用触摸事件而不是系统 onOffsetsChanged() 来使用 TouchWiz。我认为,目前唯一更好的方法是使用混合事件系统,它将以这种方式工作:
1)始终假设 onOffsetsChanged() 消息未正确发送(使布尔属性默认为 false)。
2)这意味着你应该实现onTouch()方法来正确模仿onOffsetsChanged()。仅当布尔属性仍然为假时才收听 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) {
// Do sth here
}
}
public void onTouchEvent(MotionEvent paramMotionEvent) {
if (offsetChangedWorking == false) {
// Do sth else here
}
}
}
此代码只是一个说明。请注意,将浮点数与 == 进行比较是不正确的,但在这种情况下它可能会起作用。
此外,三星 Parallax LWP 的工作方式似乎相同。如果您的设备带有 TouchWiz 和其他一些正常工作的启动器(通常会发送 onOffsetsChanged()),您可以自己尝试:
1) 首先在 TouchWiz 上设置视差 LWP(很重要!),看看它只依赖于 onTouchEvent()
2) 将启动器更改为另一个。看到 LWP 现在依赖于 onOffsetsChanged()
3) 再次将启动器更改为 TouchWiz,然后看到滑动不再适用于此 LWP。
所以我建议添加的是在每个 onResume() 事件上将布尔 offsetChangedWorking 再次更改为 false。这应该可以防止启动器更改出现此类错误。