如何使用平移/缩放在某种表面上绘制大量图像?

时间:2010-12-15 01:11:04

标签: android image zoom pan

我是Android的新手,但我有一些Java知识,我已经开始阅读Android文档和一些书,但我刚开始。但即使我已经阅读了更多内容,如果没有真正的Android编程经验,很难知道推荐的方式去做我想做的事情......

我需要的是拥有某种表面,我可以绘制/绘制/任何大量的图像,可能是具有透明度的PNG。我需要能够使用所有这些图像平移和缩放此表面。我还需要能够点击这些图像中的任何一个,并知道哪个图像被点击了。

我一直在阅读索尼爱立信开发人员的One Finger Zoom Tutorial,这对我想做的事情来说似乎是一个很好的解决方案。但我有点困惑,因为该代码是针对单个位图图像的,我需要在一些表面/画布上绘制大量的代码。

我正在考虑两种方法来实现这一目标:

  1. 以某种方式调整代码,以便我可以在Canvas上绘制每个图像(来自onDraw()),但这就是我感到困惑的地方,我不知道如何实现这一目标导致当前代码对于单个图像来说很简单,没什么可说的。
  2. 将我的所有图片叠加到一个位图中,并将该位图用作Canvas的背景(再次来自onDraw())。我可以将Canvas中的图像位置保存到数组或其他内容中,并将其用作参考,以查看用户是否单击了其中任何一个。我想这可能就是这样吗?
  3. 所以,实际上,这就是我要问的问题:

    • 如果上述第一种方法更好,请帮助我了解如何实现这一目标。
    • 如果第二个更好,你能否给我一些提示我如何覆盖所有这些图像,保存位置并通过触摸事件检测它们?
    • 如果有更好的方法来处理这一切,我很乐意听到它。

    这是一个我正在考虑开发的非常基本的游戏,在你走这条路之前,OpenGL太多了我需要的东西,我想一步一步。首先学习Android编程,有一天学习OpenGL。

4 个答案:

答案 0 :(得分:2)

为什么不查看是否可以使用(或扩展)与MapView一起使用的ItemizedOverlay。 ItemizedOverlay允许您添加“标记”,通常是PNG drawable,它们都可以是不同的。它们响应Touch事件或手势,并根据屏幕位置(通过MapProjection转换为地图坐标)进行布局。 (我在我正在研究的地图应用程序中使用它们)。布局有自己的draw()方法,它需要一个MapView,但你可以将其置零或可能禁用任何地图图层显示并显示其他类型的背景 - 这里需要进行一些实验。

答案 1 :(得分:1)

让我直截了当。你想要多个图像,每个图像都可以触摸吗? 如果是这样,也许你应该更抽象地思考。

也许将每个图像视为一个视图对象(只是一个想法)会更容易,因为视图对象已经内置了onTouchListeners

答案 2 :(得分:1)

我认为你的第一个解决方案(在下面插入)是最好的。

  

以某种方式调整代码,以便我可以在Canvas上绘制每个图像(来自onDraw()),但这就是我感到困惑的地方,我不知道如何实现这一点,因为当前代码对于单个图像来说很简单,没有太多可以解释的。

根据您的使用情况,我会让您的View包含适当结构的图像,ArrayList(如果您没有对许多随机插入/删除进行操作)可能。在onDraw()方法上,只需迭代这个位图列表并绘制每个位图。

为了使它们可触摸,使用setOnTouchListener方法(或覆盖onTouch(),如果你是继承View,我没有读取你提供的链接)提供一个处理程序,只要调用视图就会调用它。处理程序将被赋予每个触摸事件的位置,您可以使用该位置来确定触摸的图像(如果有)。如何测试碰撞当然取决于游戏的具体情况。

这种方法不是最干净的,但它是最简单的(并且最快取决于你如何做到这一点!)。就个人而言,OpenGL是令人生畏的,但是克服学习曲线将来会有很大回报(比如vim或emacs!),它是针对这种用例而制作的。

有关处理触摸事件的详细信息,请参阅此链接。 http://developer.android.com/guide/topics/ui/ui-events.html

答案 3 :(得分:1)

这个问题有点陈旧,但我有一个解决方案,还有一个问题: - )

为了设法删除多个图像,我用这个类创建一个ArrayList(ColorBall):

private Bitmap img; // the image of the ball
private int coordX = 0; // the x coordinate at the canvas
private int coordY = 0; // the y coordinate at the canvas
private int id; // gives every ball his own id, for now not necessary
private static int count = 1;
private boolean goRight = true;
private boolean goDown = true;
private int height = 50;
private int width = 50; 
private Rect mRectSrc = new Rect();
private Rect mRectDst = new Rect();

在视图中,当我点击时,如果我在图像的限制范围内点击,我会修改coordX和coordY(易于使用if (x > ball.getX() && x < ball.getX()+ball.getWidth() && y > ball.getY() && y < ball.getY()+ball.getHeight())进行检查。)。

在OnDraw事件中,我只是遍历数组中的所有元素,然后将它们绘制在相应的位置。

for (ColorBall ball : colorballs) {
    canvas.drawBitmap(ball.getBitmap(), ball.getX(), ball.getY(), null);
}

然而,我仍然坚持缩放。我正在尝试解决它,如下面的帖子(http://stackoverflow.com/questions/6422759/zoom-a-bitmap-with-drawbitmap-and-rectangles-android),但我仍然阻止它: - (

干杯