我正在编写一个Android应用程序来构建一个(例如)640 * 480像素的屏幕外位图并在SurfaceView中显示它。请注意,图像的大小比手机上的实际显示大。
应用程序的工作方式是它最初显示图像的左上角(0,0),然后我希望能够滚动图像。
我的Surfaceview类实现onMeasure回调并返回1024 * 768的大小,该大小显示与手机屏幕对应的图像区域。我想实现对滚动的支持,由于文档非常有限(只有一堆类和没有一致性的调用),我发现这几乎是不可能的。我试过调用scrollBy,但这不起作用。
如果有人对如何进行有任何指示,我将不胜感激。
答案 0 :(得分:6)
一旦开始使用SurfaceView,您将进入一个空白区域的世界,您可以自己绘制它们的方式。你自己做所有事情 - 这意味着你也需要自己实现滚动。这样做并非易事,但也不是太难。
一种方法是: - 扩展SurfaceView并实现SurfaceHolder.Callback - 使用getHolder()。addCallback(this)来获取回调 - 使用OnTouch事件来实现滚动行为(即,在响应时,从MotionEvent中拾取x,y位置并适当地设置偏移量。)
实现一个线程来处理图像的更新。网上有这样的例子(对不起 - 现在没有任何手)。
或者,使用离屏位图并通过普通ImageView绘制(将ImageView调整为位图大小并将其放置在滚动视图中)。
编辑:
看到这仍然是视图,可能值得指出,从那时起,我已经实现并发布了一个小型库,实现了上述功能的框架(受到许多评论的启发)所以,等等。它可以在Github上找到:https://github.com/micabyte/android_game
答案 1 :(得分:2)
我刚刚为自己的游戏解决了这个问题,我的surfaceView是Google改编的LunarLander示例。
除了我在doDraw方法中使用我自己的私有Canvas绘制我自己的私有Bitmap,然后使用下面的代码将其中的一些复制到画布时,所有内容都是相同的。
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())