Android Touchwiz未调用OnOffsetChanged

Android Touchwiz未调用OnOffsetChanged,android,live-wallpaper,Android,Live Wallpaper,注:由于这是一个专门针对三星的问题,我也在他们的网站上问了这个问题 我目前正在安卓系统中实现一个实时墙纸,我正在我的墙纸引擎中收听OnOffsetChanged()方法,当用户在其主屏幕上滑动时,可以更改墙纸。这在我的私有Galaxy标签上和CM9定制rom上非常有效。在我公司的股票Galaxy S3设备上,它不起作用。当主屏幕更改时,Touchwiz不会调用OnOffsetChanged 谷歌搜索这个主题并没有产生任何重要的结果,除了对的描述,开发人员说:“修复了最新TouchWiz启动器上的

注:由于这是一个专门针对三星的问题,我也在他们的网站上问了这个问题

我目前正在安卓系统中实现一个实时墙纸,我正在我的墙纸引擎中收听OnOffsetChanged()方法,当用户在其主屏幕上滑动时,可以更改墙纸。这在我的私有Galaxy标签上和CM9定制rom上非常有效。在我公司的股票Galaxy S3设备上,它不起作用。当主屏幕更改时,Touchwiz不会调用OnOffsetChanged

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


是否有人知道一种不依赖OnOffsetChanged而获得当前偏移的解决方法?有人在自己的壁纸中遇到过这个问题吗?有人知道这是故意的还是我可以假设未来的Touchwiz版本将再次使用该方法吗?

一些开发人员使用touch事件而不是system OnOffsetChanged()来处理Touchwiz。我认为,目前唯一更好的方法是使用混合事件系统,它将以这种方式工作:

1)始终假定OnOffsetChanged()消息未正确发送(使布尔属性默认为false)。
2)这意味着您应该实现onTouch()方法来正确模拟OnOffsetChanged()。仅当布尔属性仍然为false时才侦听onTouch()。
3)调用onOffsetChanged()时,请检查xOffset参数。如果它既不是0.0f也不是0.5f,则将布尔属性更改为true,并仅侦听onOffsetChanged()

代码将类似于:

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
        }
    }
}
此代码只是一个说明。注意,比较float和==是不正确的,但在这种情况下可能会起作用

此外,三星视差LWP似乎也在以同样的方式工作。如果您有一个带有TouchWiz的设备和其他正常工作的启动器(通常发送OnOffsetChanged()),您可以自己尝试:

1) 首先在TouchWiz上设置视差LWP(很重要!),然后查看它是否仅取决于onTouchEvent() 2) 把启动器换成另一个。请参见LWP现在依赖于OnOffsetChanged()
3) 再次将启动程序更改为TouchWiz,并查看刷卡不再适用于此LWP


因此,我建议在每个onResume()事件上再次将布尔值offsetChangedWorking更改为false。这应该可以通过更改启动器来防止此类错误。

我在互联网上看到很多人对此表示不满。我很确定三星这样做是有原因的,但不管是什么,我认为这是错误的一步。在我的LWP中,我通常会在为S3用户推荐go launcher的描述上做一个注释(这可以解决问题)。我从来没有找到一个体面的解决办法,如果你这样做,请让我们知道。我真的希望SAM能在下一个型号上修复它。但是滚动在S3中可以工作。非常感谢详细的回复!我也有同样的问题。如果有人为此实现了touchevent方法,请将其粘贴到这里。我最近遇到了这个问题,并编写了一个可以与TouchWiz启动器配合使用的解决方案。请参阅代码。