События в Android.Как ловить события в моих классах / объектах? - PullRequest
1 голос
/ 23 января 2011

Я пытаюсь создать свое первое приложение для Android, но оно слишком загадочно для меня, поэтому я спрашиваю.

Моя программа использует FrameLayout и круги.Когда я нажимаю фон, я хочу, чтобы появился новый круг.Это легко.В MainActivity я просто установил FrameLayout.setOnTouchListener.Это нормально.

Но я также хочу удалить круг, когда я касаюсь его.Мои круги имеют больше свойств, поэтому я создал свой собственный класс и назвал его Ball.Этот класс Ball расширяет класс View и реализует OnTouchListener.Чем я добавил метод:

boolean onTouch(View arg0, MotionEvent arg1)

Это тоже работает.Но если я хочу перехватить оба события в моей программе (FrameLayout.onTouch и Ball.onTouch), то перехватывается только одно.Неважно, где я нажимаю.Моя программа всегда делает то, что я щелкнул фоном.

Я не знаю, что с этим делать: (

Шарики добавляются так (конструктор делает это):

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

И конструктор называется:

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

И мяч добавлен в FrameLayout:

myLayout.addView(currentBall);

Можете ли вы помочь, пожалуйста?

Ответы [ 2 ]

1 голос
/ 23 января 2011

Ваш Ball.onTouch() возвращает true?Если это так, ваш Ball будет использовать событие, а FrameLayout не будет уведомлен.

Он должен вернуть false, чтобы указать платформе, что он должен продолжать вызывать другие обработчики.Однако это означает, что ваш Ball не получит последующие события, связанные с onTouch.

Другая альтернатива - заставить ваш Ball.onTouch() дополнительно выполнить тот же вызов (вызывать общий метод?) как FrameLayout.onTouch().

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

onTouch () - этот возвращает логическое значение, чтобы указать, использует ли ваш слушатель это событие .Важно то, что это событие может иметь несколько действий, которые следуют друг за другом.Таким образом, если вы возвращаете false при получении события действия вниз, вы указываете, что вы не использовали событие и также не заинтересованы в последующих действиях из этого события.Таким образом, вы будете не вызываться для любых других действий в рамках события, таких как жест пальцем или событие возможного действия вверх .

0 голосов
/ 23 января 2011

Я не знаком с FrameLayout и т. Д., Но, похоже, вам придется это сделать:

  1. Поддерживать массив или связанный список объектов вашего шара.
  2. Inваш обработчик кликов, проверьте, находится ли точка щелчка внутри какого-либо шара.
  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...