2015-06-14 3 views
1

Мне было интересно, есть ли способ узнать, где именно была нажата кнопка, и предпринимать различные действия в зависимости от того, где пользователь постучал по ней. Что-то вроде:Обнаружение местоположения, в котором была нажата кнопка

fooBtn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     switch(onClickLocation){ 
      case LEFT: 
       foo(); 
       break; 
      case RIGHT: 
       bar(); 
       break; 
      case MIDDLE: 
       baz(); 
       break; 
     } 
    } 
}); 
+0

Координаты крана относительно координат и размеров кнопки кажутся логичным началом. – J0e3gan

ответ

1

Не используется OnClickListener. OnTouchListener дает вам MotionEvent, который вы можете использовать, чтобы определить, где произошло событие касания.

Например, здесь я зарегистрировать какOnClickListener и OnTouchListener на том же View (так называемый row):

row.setOnClickListener(this); 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    row.setOnTouchListener(new View.OnTouchListener() { 
    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     v 
     .findViewById(R.id.row_content) 
     .getBackground() 
     .setHotspot(event.getX(), event.getY()); 

     return(false); 
    } 
    }); 
} 

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

В вашем случае, либо:

  • не делать реальную работу в onTouch() или

  • кэша последней видели точка касания в onTouch() но не делает работу до onClick()

Моя кишка говорит мне, что последнее должно дать вам лучшие результаты (например, вы не будете неправильно толковать длинный щелчок), но я h ave не пытался делать то, что вы ищете.

+0

Это не сработает, так как оно будет поставлять getId только из внешнего виджета (строки). Как я могу определить, какой из двух моих дочерних виджетов был нажат (т. Е. Получить щелчок getId щелчка дочернего виджета из строки)? – powder366

+0

@ powder366: «Это не сработает, поскольку оно будет только доставлять getId из внешнего большинства виджета (строки)» - um, этот код не использует 'getId()'. «Как я могу определить, какой из двух моих дочерних виджетов был нажат» - вызов 'setOnTouchListener()' для каждого виджета. Или, IIRC, существуют методы в 'ViewGroup', которые могут дать вам ребенка с заданной координатой x/y в' ViewGroup'. – CommonsWare

+0

Использование setOnTouchListener работает, но затем событие toTouch и его setHotspot никогда не вызывается, кажется, теперь мой дочерний вид onTouch потребляет событие и не доставляет его во внешнюю большую строку представления. Есть идеи? – powder366