13

我正在编写一个 android 应用程序,它构建一个(比如说)640*480 像素的屏幕外位图,并将其显示在 SurfaceView 中。请注意,图像的大小大于手机上的实际显示。

该应用程序的工作方式是它最初显示图像的左上角 (0,0),然后我希望能够滚动图像。

我的 Surfaceview 类实现了 onMeasure 回调并返回 1024*768 的大小,它显示了与手机屏幕对应的图像区域。我想实现对滚动的支持,由于文档非常有限(只是一堆类和没有连贯性的调用),我发现这几乎是不可能的。我试过只调用scrollBy,但这不起作用。

如果有人对如何进行有任何指示,将不胜感激。

4

2 回答 2

8

一旦你开始使用 SurfaceView,你就将自己移动到一个拥有空白像素区域的世界,你可以自己按照自己的方式绘制它们。您自己做所有事情 - 这意味着您也需要自己实现滚动。这不是微不足道的事情,但也不是太难。

一种方法如下: - 扩展 SurfaceView 并实现 SurfaceHolder.Callback - 使用 getHolder().addCallback( this ) 来获取回调 - 使用 OnTouch 事件来实现滚动行为(即,响应时,拿起 x ,y 从 MotionEvent 定位并适当地设置偏移量)。

实现一个线程来处理图像的更新。网上有这样的例子(对不起 - 现在没有任何可用的)。

或者,使用屏幕外位图并由普通 ImageView 绘制(将 ImageView 调整为位图大小并将其放置在滚动视图中)。


编辑:

看到这仍在获得意见,可能值得指出的是,从那时起,我已经实现并作为开源发布了一个小型库,该库实现了上述功能的框架(受 SO 上的许多评论启发,其中其他)。可以在 Github 上找到:https ://github.com/micabyte/android_game

于 2010-02-07T12:51:35.217 回答
3

我刚刚为我自己的游戏解决了这个问题,我的 surfaceView 是 Google 对LunarLander示例的改编。

一切都是一样的,除了我在 doDraw 方法中使用我自己的私有 Canvas 绘制我自己的私有位图,然后使用下面的代码将其中的一些复制到我给出的画布上。

Rect src = new Rect(mScrollX, mScrollY, mScrollX+mSurfaceWidth, mScrollY+mSurfaceHeight);
Rect dst = new Rect(0, 0, mSurfaceWidth, mSurfaceHeight);
surfaceCanvas.drawBitmap (mLevelBitmap, src, dst, null);

Rect 对象定义 drawBitmap 如何将像素从源位图(我的私有位图)缩放/转换到目标(我在 doDraw() 中绘制的画布)

mScrollX 和 Y 是要显示的矩形的左上角(相对于大私有位图)

mSurfaceWidth/Height 是要显示的矩形的大小

只需确保滚动值在可接受的范围内 [0,privateBitmapWidth-mSurfaceWidth]

随意更新滚动值,(例如在 onTouchEvent() 中)

于 2010-02-10T03:56:44.640 回答