2011-01-23 47 views
1

我想创建我的第一个Android应用程序,但对我来说这太神秘了,所以我问。Android中的事件。如何捕捉我的类/对象中的事件?

我的程序使用FrameLayout和圆。当我点击背景时,我想要一个新的圆圈出现。这很容易。在MainActivity我只是设置FrameLayout.setOnTouchListener。没关系。

但我也想删除圈子,当我触摸它。我的圈子有更多的属性,所以我创建了自己的课程并将其命名为Ball。这个球类延伸View类和实现OnTouchListener。比我添加的方法:

boolean onTouch(View arg0, MotionEvent arg1) 

它也有效。但是如果我想在我的程序中捕获这两个事件(FrameLayout.onTouchBall.onTouch),那么只有一个被捕获。点击哪里并不重要。我的程序总是我点击背景的东西。

我不知道该怎么用它做:(

球被添加像这样(构造函数的话):

mPaint.setColor(c); 
this.x = x; 
this.y = y; 
this.r = r; 

并调用构造函数:

myNewBall = new Ball(x,y,r,c) 

而且球被添加到的FrameLayout:

myLayout.addView(currentBall); 

你能帮忙吗?

回答

0

我不熟悉的FrameLayout等,但它听起来像是你将不得不这样做:

  1. 保持你的球对象的数组或链表。
  2. 在您的点击处理程序中,检查点击点是否在任何球内。
  3. 如果是这样,请移除该球。

要找出一个点击点是一个圆内:

ball position is ballx, bally 
click position is clickx, clicky 

for each ball: 
    distx = clickx - ballx 
    disty = clicky - bally 
    dist = square root of (distx*distx + disty*disty) 
    if (dist < ball radius) then click is within ball 
+0

这是我认为是缺乏系统性。我希望Ball-object通过它自己来管理它的事件。内部。不是外部处理的事件。但是,如果android无法按照我的设想处理事件,那么这将是唯一的方法。 – Racky 2011-01-23 13:54:59

1

Ball.onTouch()回报true?如果是这样,您的Ball将消耗该事件,并且不会通知FrameLayout

它应该返回false来指示应该一直调用其他处理程序的框架。但是,这意味着您的Ball将不会收到与onTouch相关的后续活动。

另一种选择是让您的Ball.onTouch()额外运行与FrameLayout.onTouch()相同的呼叫(请使用常用方法?)。

http://developer.android.com/guide/topics/ui/ui-events.html

onTouch() - 这返回一个布尔值指示监听器是否需用此事件。重要的是,这个事件可以有多个相互关联的动作。因此,如果您在收到向下操作事件时返回false,则表示您没有使用该事件,并且对此事件的后续操作也不感兴趣。因此,你会被称为该事件中的任何其他操作,如手指的手势,或最终的后续行动事件