注意:由于这是三星特有的问题,我也在developer board上提出了问题。
我目前正在Android中实现动态壁纸,我正在使用壁纸引擎中的onOffsetsChanged()方法来更改壁纸,当用户在主屏幕上滑动时。这在我的私有Galaxy Tab上使用CM9自定义ROM很有效。在我的公司设备上,一个股票Galaxy S3,它不起作用。不知何故,当主屏幕发生变化时,Touchwiz不会调用onOffsetsChanged。
除了this app的描述之外,谷歌搜索该主题没有产生任何重大结果,其中开发人员声明:“修复了最新的TouchWiz启动器上的滚动,其中onOffsetsChanged()没有被调用。”现在我只是联系开发者,但不幸的是它也是一个三星应用程序。有没有人知道解决方法来获取当前的偏移而不依赖于onOffsetsChanged?有没有人在自己的壁纸中遇到这个问题?有谁知道这是故意还是我可以假设未来的Touchwiz版本会再次使用该方法?
答案 0 :(得分:7)
一些开发人员正在使用触摸事件而不是系统onOffsetsChanged()来使用TouchWiz。我认为,目前唯一更好的方法是使用混合事件系统,它将以这种方式工作:
1)始终假设未正确发送onOffsetsChanged()消息(将布尔属性默认为false)。
2)这意味着你应该实现onTouch()方法来正确模仿onOffsetsChanged()。仅当布尔属性仍然为false时才听取onTouch()
3)调用onOffsetsChanged()时,请检查xOffset参数。如果它既不是0.0f也不是0.5f,那么将boolean属性更改为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()事件再次将boolean offsetChangedWorking更改为false。这可以防止启动器更改时出现此类错误。