Android动态壁纸 - onOffsetChanged

时间:2011-03-27 05:07:05

标签: android live-wallpaper

是否有更好的方法可以在画布内移动位图,而不是每次都重绘一次布局图?

public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) {


             final SurfaceHolder holder = getSurfaceHolder();                                                   
             Canvas c = null;
             try {
                  c = holder.lockCanvas();
                  if (c != null) {                                  
                            c.drawBitmap(this.ImageI, xPixels, 0, null);                                                                    
                            c.drawBitmap(this.ImageII, xPixels, 0, paint);  



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

            }

2 个答案:

答案 0 :(得分:1)

您可以像通常那样在您正在阅读和修改位置或图像的情况下通过偏移更改来执行此操作。我使用onOffsetsChanged将信息提供给一个常量变量,该变量在我的绘图例程中随着它的变化自动更新。

首先定义你想要使用的常量......

Private float mXOffset = 0,
              mYOffset = 0,
              mXStep   = 0,
              mYStep   = 0,
              mXPixels = 0,
              mYPixels = 0;

在此示例中,我将捕获onOffsetsChanged事件中的所有值,您只需定义并捕获将要使用的偏移量,步长或像素。

public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) {

mXOffset = xOffset;
mYOffset = yOffset;
mXStep   = xStep;
mYStep   = yStep;
mXPixels = xPixels;
mYPixels = yPixels; 

DrawStuff();   
}

获得此数据后,它将为您的应用程序提供更多功能和灵活性。您现在可以像下面这样调用画布更新,并且每次调用绘制例程时偏移都会更改,您可以使用这些数字来修改图像的位置,移动速度或任何其他您想要的数学计算。

private void DrawStuff(){
        final SurfaceHolder holder = getSurfaceHolder();                                                   
             Canvas c = null;
             try {
                  c = holder.lockCanvas();
                  if (c != null) {                                  
                      c.drawBitmap(this.ImageI, mXPixels,mYPixels + mYOffset,null);                                                                    
                      c.drawBitmap(this.ImageII, xPixels, 0, paint);  
                                 }
                 } finally {
                    if (c != null) holder.unlockCanvasAndPost(c);
                }

    }

依此类推。希望这就是你所问的我并不完全清楚。如果您有需要,这还可以让您在其他地方使用这些偏移,步骤和位置。

答案 1 :(得分:1)

你在问:有更好的方法吗? 答案是不。您需要重绘整个场景,背景和所有帧。 另外,一般来说,你不想画入onOffsetsChanged;只需更新您在runnable中使用的变量。看看SDK中Cube示例的工作原理。乔伊的例子也是正确的。希望这有帮助