我设计了一种使用视差滚动的动态壁纸。为了将墙纸缩放到用户屏幕的大小,我使用:

int height = getApplicationContext().getResources().getDisplayMetrics().heightPixels;

然后,通过将height除以图像的高度来缩放图像。在这种情况下,图像为1000x563。这样可以确保图像适合用户的身高尺寸,并且有足够的宽度可用于视差滚动。

这在大多数手机上都可以正常工作,但是由于某些原因,在某些LG手机上,图片滚动得太远了。例如,在分辨率为1920x1080,具有四个主屏幕的LG G2上,通过第三个主屏幕(从左侧滑动时),右边的10%左右的图像开始闪烁,整个第四个主屏幕还显示闪烁的失真。

我不知道为什么会这样,因为我使用的缩放器应该给我足够的宽度来滚动浏览。 height / 563 = 3.1545923。将定标器3.1545923乘以图像的宽度(1,000),得出3,154。如果屏幕宽度为1080,则视差滚动只需要两倍,即2,160。

我已经在onOffsetsChanged方法中添加了Log语句,这是我从xOffset和xPixelsOffset获得的内容:

屏幕1:
xPixelOffset:0.0
xOffset:0.0

屏幕2:
xPixelOffset:-360.0
x偏移量:0.3334

屏幕3:
xPixelOffset:-720.0
xOffset:0.6667

屏幕4:
xPixelOffset:-1080.0
xOffset:1.0

我在Note 3上尝试了相同的代码,并且一切正常。该手机具有与LG G2相同的精确分辨率(尽管屏幕更大)(除了高度稍高(1920 vs. 1776),因为G2的底部有一个菜单栏,该菜单栏远离了可用的主屏幕)。

有任何想法吗? LG手机上的视差滚动似乎比其应滚动的远,但不应这样做,因为从上方的xPixelOffset值正确地从0变为1080。

谢谢。

最佳答案

在解决了一段时间后,我仍然不明白为什么会这样,但是我找到了解决方法。我不是在我的xPixelOffset方法中使用draw(),而是使用一个自定义变量mmPixel,该变量由以下公式计算:

mmPixel = (float) (((xOffset *.5) * screenWidth) * -1);


这与使用xPixelOffset基本相同,不同之处在于每次滑动仅将其移动一半。我仍然不明白为什么我需要除以2,因为偏移为1080,并且我的图像缩放到更大,但是如果其他任何人遇到此问题,这也应该起作用。

这也解决了我之前未提到的另一个问题,但是某些启动器(由于某种原因)无法将图像尽可能远地移动。例如,使用Nova Launcher,使用xPixelOffset仅将图像总共移动了360像素。我不知道为什么有些启动器会这样做,但是放弃xPixelOffset并根据屏幕的宽度和xOffset手动计算它也可以解决此问题。

10-08 08:47