注:由于这是三星特有的问题,我也在他们的developer board上问过。
我目前正在android中实现一个实时墙纸,我正在监听墙纸引擎中的onOffsetsChanged()方法,以便在用户刷过主屏幕时更改墙纸。这对我的私人galaxy标签和cm9自定义rom很有用。在我的公司设备上,一个股票galaxy s3,它不工作。当主屏幕改变时,touchwiz不会调用onoffsetschanged。
搜索这个主题并没有产生任何显著的结果,除了对this app的描述,开发人员说:“修正了在最新的touchwiz启动程序上滚动,onOffsetsChanged()不会被调用。”现在我只想联系开发人员,但不幸的是它也是一个三星应用程序。
是否有人知道在不依赖于on offsets更改的情况下获得当前偏移的解决方法?有人在自己的墙纸上碰到过这个问题吗?是否有人知道这是有意的,或者我可以假设未来的touchwiz版本将再次使用该方法?
最佳答案
一些开发人员使用touch events而不是system onoffsetschanged()来处理touchwiz。我认为,目前唯一更好的方法是使用混合事件系统,它将以这样的方式工作:
1)始终假设onOffsetsChanged()消息未正确发送(使布尔属性默认为false)。
2)这意味着您应该实现ontouch()方法以正确模拟onoffsetschanged()。仅当boolean属性仍然为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
}
}
}
这个代码只是一个例子。注意,将float与==进行比较是不正确的,但在这种情况下它可能会起作用。
而且,看起来三星视差LWPS的工作原理是一样的。如果您有一个带有touchWiz和其他正常工作的启动程序(通常发送onOffsetsChanged())的设备,您可以自己尝试:
1)首先在touchwiz上设置视差lwp(重要!)看看它只依赖于ontouchevent()
2)将发射器换成另一个。请注意,lwp现在依赖于onOffsetsChanged()
3)再次将启动程序更改为touchwiz,并查看swiping不再适用于此lwp。
因此,我建议在每个onresume()事件上添加一个新的值,将boolean offsetChangedWorking再次更改为false。这将防止启动程序更改时出现此类错误。