开发者

Events in Android. How to catch events in my classes / objects?

开发者 https://www.devze.com 2023-02-06 01:06 出处:网络
I\'m trying to create my first android application, but it\'s all too mysterious for me, so I am asking.

I'm trying to create my first android application, but it's all too mysterious for me, so I am asking.

My program uses FrameLayout and Circles. When I click background I want a new circle to appear. That's easy. In MainActivity I just set FrameLayout.setOnTouchListener. That's OK.

But I also want to delete circle when I touch it. My circles have more properties, so I created my own class and named it Ball. This Ball class extends View class and implements OnTouchListener. Than I added method:

boolean onTouch(View arg0, MotionEvent arg1)

It works too. But If I want to catch both events in my program (FrameLayout.onTouch and Ball.onTouch) than only one is catched. It does not matter where I click. My program always things that I clicked background.

I do not know what to do with it :(

Balls are added like this (constructor does it):

mPaint.setColor(c);
this.x = x;
this.y = y;
th开发者_开发问答is.r = r;

And constructor is called:

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

And ball is added to FrameLayout:

myLayout.addView(currentBall);

Can you help please?


Does your Ball.onTouch() return true? If so, your Ball will consume the event and the the FrameLayout won't be notified.

It should return false to indicate to the framework it should keep calling other handlers. However, this means your Ball won't get follow-up events related to the onTouch.

The other alternative is to make your Ball.onTouch() additionally run the same call (call a common method?) as FrameLayout.onTouch().

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

onTouch() - This returns a boolean to indicate whether your listener consumes this event. The important thing is that this event can have multiple actions that follow each other. So, if you return false when the down action event is received, you indicate that you have not consumed the event and are also not interested in subsequent actions from this event. Thus, you will not be called for any other actions within the event, such as a finger gesture, or the eventual up action event.


I'm not familiar with FrameLayout etc but it sounds like you'll have to do this:

  1. Maintain an array or linked list of your ball objects.
  2. In your click handler, check if the click point is inside any ball.
  3. If so, remove that ball.

To find out if a click point is within a circle:

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

精彩评论

暂无评论...
验证码 换一张
取 消