2014-01-10 2 views
0

Я пытаюсь создать макет, где два вида (в данном случае ImageButtons) находятся точно друг над другом. Оба должны обрабатывать события касания для переключения альфа-кнопок.Touch events for Views друг на друга

Однако только кнопка сверху принимает событие касания (но ничего не делает, поскольку это альфа-значение 0). ButtonBelow не получает никаких событий Touch, когда я нажимаю на кнопки.

кода я использовал для создания представлений и OnTouchListeners:

 // Create 2 Buttons on top of each other 
     final ImageButton buttonBelow = new ImageButton(getActivity());//ImageButton 
     buttonBelow.setImageResource(R.drawable.ic_action_locate); 
     RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     buttonBelow.setLayoutParams(layoutParams); 

     final ImageButton buttonAbove = new ImageButton(getActivity());//ImageButton 
     buttonAbove.setImageResource(R.drawable.ic_action_delete); 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     buttonAbove.setLayoutParams(params); 
     buttonAbove.setAlpha(0.0f); 

     root.addView(buttonBelow); 
     root.addView(buttonAbove); 

     buttonBelow.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_UP && v.getAlpha() > 0) { 
        Log.e("Button", "Pressed below"); 
        buttonBelow.setAlpha(0.0f); 
        buttonAbove.setAlpha(1.0f); 
        return true; 
       } 
       return false; 
      } 
     }); 

     buttonAbove.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_UP && v.getAlpha() > 0) { 
        Log.e("Button", "Pressed above"); 
        buttonBelow.setAlpha(1.0f); 
        buttonAbove.setAlpha(0.0f); 
        return true; 
       } 
       return false; 
      } 
     }); 

Как можно buttonBelow получить сенсорное событие?

ответ

1

Сделайте свой класс реализации View.OnTouchListenerYou, и использовать тот же приемник для двух buttoms, а затем принимать решения в том, что:

class YourClass implements View.OnTouchListener { 

    public void onCreate(Bundle savedInstanceState) { 



     //... 

      buttonBelow.setOnTouchListener(this); 

      buttonAbove.setOnTouchListener(this); 

     } 

     //... 

    public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_UP) { 
      if (buttonBelow.getAlpha() > 0) { 
       buttonBelow.setAlpha(0.0f); 
       buttonAbove.setAlpha(1.0f); 

      } 
      else { 
       buttonBelow.setAlpha(1.0f); 
       buttonAbove.setAlpha(0.0f); 

      } 


     return true; 
     } 
    return false; 
    } 

} 
+0

Хорошо, это сработает, я думаю. Но нельзя просто передать событие касания ко второй кнопке, потому что верхняя часть блокирует его? Я думал, что это то, что возвращал false в onTouch для ... – Mauin

+1

yes, если вы вернете true, это означает, что событие было уничтожено, а false означает, что оно должно быть передано следующему слушателю. это будет моей первой рекомендацией, но я увидел, что вы на самом деле делаете это правильно. Вероятно, система даже не считает, что кнопка ниже подходит для вызова, вы можете проверить ее, если вы загружаете источники Android и отлаживаете ее шаг за шагом. Но в любом случае сделать класс реализацией слушателя и использовать ту же самую функцию для обработки всех кнопок на экране - это хороший, широко используемый и даже предпочтительный подход. Таким образом, вы можете положиться на него и чувствовать себя хорошо! –

+0

Да, просто попробовал, и он работает в этом примере. Однако в моем «реальном» проекте у меня нет ссылок на мои ImageButtons, я создаю их и создаю их TouchListeners в другом месте и не знаю, какие виды находятся друг на друге .. Я посмотрю, смогу ли я сделать такой подход работайте с этой проблемой. Благодаря! – Mauin

0

вы можете удалить оба мнение (IMAGEBUTTON) и добавить его снова к относительному макету в обратном порядке

+0

Но тогда я m застрял в добавлении/удалении просмотров все время. Разумеется, нужно передавать события касания ко всем другим взглядам ?! – Mauin

0

вы не можете сделать, потому что button above, как блокирование один ниже , но вы можете сделать на нижеприведенном верхний один напротив верхних один, используя й и у

buttonAbove.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_UP && v.getAlpha() > 0) { 
       Log.e("Button", "Pressed above"); 
       int y = event.getY(); 
      int x = event.getX(); 
       buttonBelow.setAlpha(x); 
       buttonAbove.setAlpha(y); 
       return true; 
      } 
      return false; 
     } 
    }); 

или путем как в у, но используя, если заявление внутри прикосновения нажмите так:

   if(y > 10) 
       buttonBelow.setAlpha(y); 
       buttonAbove.setAlpha(0);} 
       else{ 
       buttonBelow.setAlpha(x); 
       buttonAbove.setAlpha(y) 
        } 

, но лучше всего, используя один там

Смежные вопросы