onWffsetsChanged没有被Touchwiz调用

时间:2013-01-10 12:43:18

标签: android live-wallpaper

注意:由于这是三星特有的问题,我也在developer board上提出了问题。

我目前正在Android中实现动态壁纸,我正在使用壁纸引擎中的onOffsetsChanged()方法来更改壁纸,当用户在主屏幕上滑动时。这在我的私有Galaxy Tab上使用CM9自定义ROM很有效。在我的公司设备上,一个股票Galaxy S3,它不起作用。不知何故,当主屏幕发生变化时,Touchwiz不会调用onOffsetsChanged。

除了this app的描述之外,谷歌搜索该主题没有产生任何重大结果,其中开发人员声明:“修复了最新的TouchWiz启动器上的滚动,其中onOffsetsChanged()没有被调用。”现在我只是联系开发者,但不幸的是它也是一个三星应用程序。

有没有人知道解决方法来获取当前的偏移而不依赖于onOffsetsChanged?有没有人在自己的壁纸中遇到这个问题?有谁知道这是故意还是我可以假设未来的Touchwiz版本会再次使用该方法?

1 个答案:

答案 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。这可以防止启动器更改时出现此类错误。