2016-07-10 2 views
1

Для практической цели я создаю настраиваемый элемент Tooltip. Чтобы использовать элемент управления Tooltip, хост UIControl (например, Button) будет назначен моему элементу управления Tooltip, и я хочу, чтобы мой элемент Tooltip мог прослушивать событие нажатия мыши на элементе управления хостингом (то есть Button) и показывать/соответственно отклонить.Android: Как прослушивать MouseEvent на другом представлении и обрабатывать событие в моем пользовательском представлении

У меня возникли проблемы с поиском способа прослушивания событий мыши управления хостингом. Я пробовал:

  1. Установить хостинг Контрольного setOnTouchListener, это работает, но он будет перекрывать существующую OnTouchListener хостинговой Control, таким образом undeserable.

  2. Перейдите на адрес управления хостингом ViewGroup и добавьте ** наблюдателя в ViewGroup. Но нет никакого способа наблюдать за событием мыши на ViewGroup.

Так слушает событие мыши другого управления, выполненное из пользовательского представления, если да, то какой рекомендуемый способ его реализовать?

Спасибо.


Я также думал, что другой способ сделать это, как следует:

  1. Получить ViewGroup хостинговой контроля;

  2. В окне ViewGroup добавьте прозрачный вид для прослушивания события мыши.

  3. В обработчике события мыши прозрачного представления проверьте, произошло ли событие мыши в управлении хостинга.

  4. Если это произошло в Хостинговом контроле, ответьте соответствующим образом.

Я попытаюсь использовать этот подход после публикации моего вопроса, но, похоже, это ресурсоемкий способ реализации чего-то, казалось бы, простого.

Я сообщу вам, если этот подход работает или нет, любые комментарии/мысли очень ценятся.

Спасибо ~!

+0

Как я понимаю, у вас есть пользовательские кнопки, которые уже имеют собственный OnTouchListener. Я прав? –

ответ

0

Попробуйте использовать этот подход. Я уже пробовал этот подход с OnClickListener, и он отлично работает.

public class CustomButton extends Button { 

     private OnTouchListener outsideListener; 

     private OnTouchListener innerListener = new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (outsideListener != null) { 
        outsideListener.onTouch(v, event); 
       } 
       //some code here ... 
      } 
     }; 

     @Override 
     public void setOnTouchListener(OnTouchListener listener) { 
      outsideListener = listener; 
     } 

     public CustomButton(Context context) { 
      super(context); 
      super.setOnTouchListener(innerListener); 
     } 

     public CustomButton(Context context, AttributeSet attrs) { 
      super(context, attrs); 
      super.setOnTouchListener(innerListener); 
     } 

     public CustomButton(Context context, AttributeSet attrs, int defStyleAttr) { 
      super(context, attrs, defStyleAttr); 
      super.setOnTouchListener(innerListener); 
     } 
    } 
+0

Привет, Sazanvoich, спасибо за ваш ответ. Возможно, я не очень хорошо себя объяснил. Я реализую собственный инструмент ToolTip. Чтобы использовать мою подсказку, другому разработчику нужно только указать, какой элемент управления будет прикреплен к моему элементу ToolTip. Тогда мой элемент управления ToolTip будет обрабатывать остальные, не требуя, чтобы их управление было написано определенным образом. –

0

Как я уже упоминал в своем вопросе, я подумал о том, как реализовать то, что я хотел. Я делюсь своим способом реализации здесь. Но все же, это, кажется, ресурсоемкий способ решения, казалось бы, простой проблемы. Если у вас есть более легкое решение или какой-либо комментарий, оставьте комментарий. Очень ценится ~!

Мой класс пользовательских MaterialTooltip:

public class MaterialToolTip { 
    /// Implementation 
} 

Пример того, как использовать мой MaterialToolTip класс:

public class MainActivity extends AppCompatActivity { 
    MaterialToolTip toolTip; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // anchorButton is the button to which ToolTip will be added to. 
     Button anchorButton = (Button)findViewById(R.id.button);    


     this.toolTip = new MaterialToolTip.Builder(this) 
      //.anchorView property is used to specify the view that will use this tooltip 
      .anchorView(anchorButton) 
      .maxWidth(R.dimen.simpletooltip_max_width) 
      .build(); // that's all the consumer needs to do, as soon as the tooltip is attached to the View, the tooltip decided when to show/dismiss by listening to View's event. 
    } 
} 

В моем MaterialToolTip классе:

  1. Создать прозрачный вид, что прослушивает событие мыши

    @SuppressLint("ViewConstructor") 
    public class ToolTipPressInterceptView extends View { 
    
        OnAnchorViewMouseEventListener mListener; 
    
        ToolTipPressInterceptView(Context context, View anchorView) { 
         super(context); 
    
        //get the anchorView's onScreenLocation 
        int[] output = new int[2]; 
        anchorView.getLocationOnScreen(output); 
    
        anchorViewRect = new RectF(output[0], output[1], output[0] + anchorView.getMeasuredWidth(), output[1] + anchorView.getMeasuredHeight()) ; 
    
        //set the dimension to match parent 
        this.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
        this.setOnTouchListener(new OnTouchListener() { 
         @Override 
         public boolean onTouch(View v, MotionEvent event) { 
          switch (event.getAction()){ 
           case MotionEvent.ACTION_DOWN:{ 
            if (anchorViewRect.contains(event.getX(), event.getY())){ 
             mListener.onMouseEvent(AnchorViewMouseEventType.PRESSED); 
            } 
           } 
           case MotionEvent.ACTION_UP:{ 
            if (anchorViewRect.contains(event.getX(), event.getY())){ 
             mListener.onMouseEvent(AnchorViewMouseEventType.RELEASED); 
            } 
           } 
          } 
          return false; 
         } 
        }); 
    } 
    
    } 
    
  2. Получить ViewGroup элемента управления хостинга и добавить прозрачный вид в ViewGroup;

    частный MaterialToolTip (Builder builder) { // .. Другая логика инициализации // .. добавьте TransparentView в ViewGroup; mRootView = (ViewGroup) mAnchorView.getRootView(); ToolTipPressInterceptView view = новый ToolTipPressInterceptView (mContext, mAnchorView);

    //mAnchorViewTouchListener is listener to Mouse Event 
        view.setOnTouchListener(mAnchorViewTouchListener); 
        mRootView.addView(view); 
    

    }

  3. Если произошло на хостинг контроля, реагировать соответственно.

    частный окончательный View.OnTouchListener mAnchorViewTouchListener = новый

    View.OnTouchListener() { @Override общественного логический onTouch (View v, MotionEvent событие) { ИНТ действие = MotionEventCompat.getActionMasked (событие);

     switch(action) { 
          case (MotionEvent.ACTION_DOWN) : 
           // show 
           show(); 
          case (MotionEvent.ACTION_UP) : 
           // dismiss 
           dismiss(); 
         } 
    
         return false; //return false so the other handlers is able to 
        } 
    };