【问题标题】:Android SurfaceView scrollingAndroid SurfaceView 滚动
【发布时间】:2010-11-08 22:59:20
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android scroll surfaceview


    【解决方案1】:

    一旦您开始使用 SurfaceView,您就将自己带入了一个拥有空白像素区域的世界,并且您可以自己按照自己的意愿绘制它们。您自己做所有事情 - 这意味着您也需要自己实现滚动。做起来不简单,但也不是太难。

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

    实现一个线程来处理图像的更新。网络上有这样的例子(抱歉 - 目前没有可用的例子)。

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


    编辑:

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

    【讨论】:

      【解决方案2】:

      我刚刚为自己的游戏解决了这个问题,我的 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() 中)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多