2009-07-08 59 views
11

我正在编写一个android应用程序,该应用程序可以生成640 * 480像素的离屏位图,并将其显示在SurfaceView中。请注意,图像的尺寸大于手机上的实际显示。Android SurfaceView滚动

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

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

如果任何人有关于如何进行这个任何指针将不胜感激。

回答

6

一旦你开始使用一SurfaceView,你正在为自己,你有像素的空白区域的世界,你是你自己吸引他们怎么想。你自己做一切 - 这意味着你也需要自己实现滚动。这不是微不足道的,但也不是太难。

一种方式做到这一点如下: - 扩展SurfaceView和实施SurfaceHolder.Callback - 使用getHolder()的addCallback(这)抓取回调 - 使用OnTouch事件来实现滚动行为(即响应时,从MotionEvent中提取x,y位置并适当设置偏移量)。

实现一个线程来处理图像的更新。在网络上有这样的例子(抱歉 - 现在没有任何东西)。

可替代地,使用离屏位图,并经一个正常的ImageView绘制(大小的ImageView位图的尺寸,并将其放置在一个滚动视图)。


编辑:

看到这仍然是越来越意见,认为这段时间以来,我已经实现并发布为开放源代码实现了一个框架一个小型图书馆,它可能是值得指出的上述功能(受到此处许多评论的启发,等等)。它可以在Github上找到:https://github.com/micabyte/android_game

2

我只是解决了这个对于我自己的比赛,我的surfaceView是LunarLander例如通过谷歌的适应。

一切都只是我对我自己的私人位图绘制​​与在doDraw方法我自己的私人画布,然后复制它的一些在画布上我使用的代码下面给出的相同。

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

的矩形对象定义drawBitmap如何缩放/从源位图(我的私人位图)到目的地(我被赋予了doDraw()

mScrollX和Y是画在画布上变换像素将被显示在矩形的左上角(相对于大型私人位图)

mSurfaceWidth /高度将显示

只要确保滚动值是可接受的RA内的矩形的大小nges [0,privateBitmapWidth-mSurfaceWidth]

自己更新滚动值,不过请您(例如在onTouchEvent()中)