3

我正在尝试调整 Google 的 CubeLiveWallpaper 演示以在动态壁纸中创建视差效果。我已经移除了立方体并显示了我自己的图像,这很棒,但我碰壁了。

我的理解是,我应该能够使用 onOffsetsChanged() 中的 xPixels 来确定在画布上绘制位图的位置。假设我还没有说疯话,逻辑会规定每次用户滑动时 xPixels 都必须是不同的值。我已经用日志声明证明这不会发生。事实上,onOffsetsChanged() 接收到的值都不会改变。结果是我的图像不动。

首先,我将提供日志输出,然后是代码。

日志(从 Dalvik 调试监视器复制)。在任一方向上的每次滑动都会产生此输出。

02-23 20:09:29.859: D/onOffsetsChanged(1039): xOffset (0.500000) | yOffset (0.000000) | xStep (0.000000) | yStep (0.000000) | xPixels (-160) | yPixels (0)

onOffsetsChanged

  public void onOffsetsChanged( float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels )
  {
     Log.d( "onOffsetsChanged", String.format("xOffset (%f) | yOffset (%f) | xStep (%f) | yStep (%f) | xPixels (%d) | yPixels (%d)",
            xOffset,
            yOffset,
            xStep,
            yStep,
            xPixels,
            yPixels) );

     mOffset = xPixels;  // mOffset is a member of my class
     drawFrame();
  }

我认为包括下面的代码是不必要的,因为绘图操作是在 onOffsetsChanged 中分配 mOffset 之后进行的,但是看到我是如何在这里寻求帮助的人,我已经失去了假设事情的权利。

画框()

  void drawFrame()
  {
     final SurfaceHolder holder = getSurfaceHolder();

     Canvas c = null;

     try
     {
        c = holder.lockCanvas();

        if( c != null )
        {
           drawBackdrop( c );
        }
     }
     finally
     {
        if( c != null )
        {
           holder.unlockCanvasAndPost( c );
        }
     }

     mHandler.removeCallbacks( drawFrameRunnable );

     if( mVisible )
     {
        mHandler.postDelayed( drawFrameRunnable, 1000 / 25 );
     }
  }

绘制背景()

  void drawBackdrop( Canvas c )
  {
     c.save();
     c.drawColor( Color.BLACK );

     c.drawBitmap( backdropBmp,
                   mOffset,
                   0,
                   null );
     c.restore();
  }

作为最后一点,我会提到,据我所知,我的手机支持滚动壁纸。我知道例如 Galaxy S3 没有(来源: http ://androidforums.com/samsung-galaxy-s3/586033-galaxy-s3-cheated-some-us-leaving-out-scrolling-wallpapers.html )。我从 Play 商店下载了几张动态壁纸,它们都已成功滚动。我假设那些开发人员并没有以某种方式跳过一堆箍来破解我设备的相同功能。我正在使用三星 Transform Ultra。

谢谢您的帮助!

4

0 回答 0