9

注意:因为这是三星特有的问题,所以我也在他们的开发板上问过。

我目前正在 Android 中实现动态壁纸,并且我正在监听我的壁纸引擎中的 onOffsetsChanged() 方法,以在用户在他的主屏幕上滑动时更改壁纸。这在我的带有 CM9 自定义 rom 的私人 Galaxy Tab 上效果很好。在我的公司设备上,一个股票 Galaxy S3,它不起作用。当主屏幕更改时,Touchwiz 不会以某种方式调用 onOffsetsChanged。

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

有谁知道在不依赖 onOffsetsChanged 的​​情况下获取当前偏移量的解决方法?有没有人在自己的壁纸中遇到过这个问题?有谁知道这是否是故意的,或者我是否可以假设未来的 Touchwiz 版本将再次使用该方法?

4

1 回答 1

7

一些开发人员正在使用触摸事件而不是系统 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。这应该可以防止启动器更改出现此类错误。

于 2013-03-28T14:40:17.753 回答