0

有没有更好的方法来移动画布内的位图而无需每次都重绘位图?

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);
                        }

            }
4

2 回答 2

1

你在问:有没有更好的方法?答案是不。你需要重绘你的整个场景、背景和所有的每一帧。另外,一般来说,您不想绘制 onOffsetsChanged;只需更新您在可运行文件中使用的变量。看看 SDK 中的 Cube 示例是如何工作的。乔伊的例子也是正确的。希望这可以帮助

于 2011-03-27T14:28:39.770 回答
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);
                }

    }

等等等等。希望这是您要问的,我并不完全清楚。如果您有需要,这也将使您能够在其他地方使用这些偏移、步骤和位置。

于 2011-03-27T05:50:42.827 回答