【问题标题】:How to set onTouchEvent on my custom component如何在我的自定义组件上设置 onTouchEvent
【发布时间】:2013-08-17 05:26:17
【问题描述】:

My full code here

我正在学习 Android 开发,并且正在尝试创建一个简单的单词搜索游戏。 首先,我创建了一个 LetterTile 类,它代表屏幕上的一个字母,并且这个类有自己绘制的方法。

然后我创建了一个 LetterMap 类,它是一个 LetterTile 的矩阵(如果我们使用 LetterMap(6, 6),它将在屏幕上绘制一个 6x6 的 LetterTile 矩阵)。

现在我想做的是,当我触摸一个 LetterTile 对象时,我可以用它做点什么。此时,我不能这样做,因为在 MainGamePanel 中我初始化了 LetterMap 对象,而不是 LetterTile 对象。

您可以在我的代码中看到,如果我初始化 LetterTile 对象,我只是使用 onTouchEvent 来处理问题,但现在我不知道如何处理 LetterMap

我做错了吗?还是我玩这个游戏的方法不对?

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 我不知道我是否理解您的代码,但我认为您的问题是 SurfaceView 的 onTouchEvent() 覆盖了 LetterTile 的 onTouchEvent。在这种情况下,我会覆盖你的surfaceView 的onInterceptTouch() 方法。请参阅下面的链接,也许这会对您有所帮助:stackoverflow.com/questions/16191914/…。否则,您必须提供更多信息,当您触摸 LetterTile 时发生了什么,尝试调试并查看您正在跳转哪些断点,哪些没有。
  • 我定义的LetterTile和LetterMap还不是View。 LetterTile 是一个类(不是 View),具有在画布上绘制自身的方法,LetterMap 是一个组合了一些 LetterTile 的对象(类), LetterMap 的 draw 方法简单地调用每个 LetterTile 的 draw 方法。然后在SurfaceView的onDraw方法中,在屏幕上绘制LetterMap(从而绘制一个LetterTile的矩阵)。当我触摸 LetterTile 时,我只想让它发光或有什么东西表明我触摸了它(我认为这并不重要),但重要的是我如何触摸每个 LetterTile,而不是整个 LetterMap
  • 这样你就可以触摸你的 LetterMap 了吗?这是正确的吗?当我查看您的代码时,我看不到您的 letterMap 的 TouchEvent。另一个问题:为什么你不使用视图?这是有原因的吗?
  • 你可以在MainGamePanel中创建一个LetterTile对象,取消MainGamePanel的onTouchEvent方法的注释,然后你可以移动那个LetterTile,这样我的代码就可以控制单独的LetterTile触摸事件了,对吧?问题是 LetterTile 是 LetterMap 的一部分,但是在 MainGamePanel 中我只有 LetterMap 对象,我不知道如何控制 LetterMap 中每个 LetterTile 的触摸事件。
  • 第二个问题的答案是:我不知道在这种情况下如何使用自定义视图(通过代码),我试试这个mobile.tutsplus.com/tutorials/android/…,但他们使用 XML 实现。对不起,如果我的解释不清楚

标签: android custom-component touch-event


【解决方案1】:

抱歉,我之前没有编译过您的代码。现在我这样做了,并在其中查看了更多细节。

  1. 当我取消注释 MainPanel 的 onTouchEvent 并添加一个 LetterTile 时,我无法按照您的描述控制 touchEvent(我为 LetterTile 的 onTouchEvent 设置了一个断点,但调试器不会跳转到它)。

  2. 我认为您必须使用视图来处理这种情况。因为它们为您提供了所需的所有方法,因此您不必自己实现它们。抱歉,我无法解决您的问题。

custom views 的 android 教程是一个好的开始。

【讨论】:

  • 谢谢!但是如果我的 LetterTile 是 View 对象,我是否需要将 LetterMap 设为 ViewGroup 对象?或者 LetterMap 也只是一个视图?此外,由于构造函数是 LetterTile(Context context, AttributeSets attrs),如何在 LetterMap 类中初始化 LetterTile 对象?这真是令人困惑
  • 因为我的 LetterMap 是一个 LetterTile 数组,所以我需要在 LetterMap 类中创建 LetterTile 对象
  • 换句话说,我如何动态地(以编程方式)创建自定义视图
  • 当您的 LetterMap 是 ViewGroup 时,您可以使用以下方法为其设置子视图:addView(letterTile)。因此,在创建 LetterMap 的实例后,您可以调用一个示例方法init()(您必须自己编写),在该方法中创建您的 LetterTile 并将其添加到您的 LetterMap。 LetterMap 本身可以通过 `setContentView(letterMap)' 添加到您的 Activity 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 2011-11-16
  • 2015-10-29
相关资源
最近更新 更多