2

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

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

我一直在阅读索尼爱立信开发人员的单指变焦教程,它看起来是我想做的一个很好的解决方案。但我有点困惑,因为该代码是针对单个位图图像的,我需要在一些表面/画布上绘制很多它们。

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

  1. Canvas以某种方式调整代码,以便我可以在(from )上绘制每个图像,onDraw()但这就是我感到困惑的地方,我不知道如何实现这一点,因为当前代码对于单个图像来说很简单,没有太多需要考虑的.
  2. 将我所有的图像叠加到一个位图中,并将该位图用作Canvas(再次来自onDraw())的背景。我可以将这些图像位置保存Canvas到数组或其他东西中,并将其用作参考,以查看用户是否单击了其中的任何一个。我想这是可能的吗?

所以,实际上,这就是我要问的:

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

这是一个我正在考虑开发的非常基本的游戏,在你这样做之前,OpenGL 对我的需要来说太过分了,我想一次迈出一步。先学Android编程,再学OpenGL。

4

4 回答 4

2

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

于 2010-12-24T01:03:34.300 回答
1

让我说清楚。您想要多个图像,每个图像都可以触摸吗?如果是这样,也许您应该更抽象地思考一下。

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

于 2010-12-15T01:36:38.083 回答
1

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

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

根据您的用例,我会让您的视图在适当的结构中包含您的图像,一个 ArrayList (如果您不做许多随机插入/删除)也许。在 onDraw() 方法中,只需向下迭代这个位图列表并绘制它们中的每一个。

为了使它们可触摸,请使用 setOnTouchListener 方法(或覆盖 onTouch() 如果您是 View 的子类,我没有阅读您提供的链接)来提供一个处理程序,该处理程序将在调用视图时调用。处理程序将获得每个触摸事件的位置,您可以使用它来确定触摸了哪个图像(如果有)。你如何测试碰撞当然取决于你的游戏的细节。

这种方法不是最干净的,但它是最简单的(也是最快的,取决于你是怎么做的!)。就个人而言,OpenGL 令人生畏,但克服学习曲线将在未来获得巨大回报(如 vim 或 emacs!),它是为这种用例而设计的。

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

于 2010-12-30T01:10:03.867 回答
1

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

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

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 事件中,我只是遍历 Array 中的所有元素,然后在对应的位置绘制它们。

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)解决它,但我仍然被它阻止:-(

干杯

于 2011-06-21T09:18:56.393 回答