2017-01-01 11 views
1

Я разрабатываю пользовательский интерфейс поверх ExoPlayer, и я заметил, что элементы управления (PlaybackControlView) скрываются, когда я касаюсь экрана, а не когда я нажимаю.Exoplayer hide PlaybackControlView onClick (not onTouch)

Я хотел изменить на клик и проверить, как я могу изменить прослушиватель событий, но до сих пор не мог найти простого решения. Я проверил источник SimpleExoPlayerView.java и я заметил, что это на самом деле зашиты:

@Override 
    public boolean onTouchEvent(MotionEvent ev) { 
    if (!useController || player == null || ev.getActionMasked() != MotionEvent.ACTION_DOWN) { 
     return false; 
    } 
    if (controller.isVisible()) { 
     controller.hide(); 
    } else { 
     maybeShowController(true); 
    } 
    return true; 
    } 

До сих пор я мог думать о двух решений. Один из них заключается в том, чтобы изменить исходный код ExoPlayer, но мне это не нравится, так как мне придется делать изменения каждый раз, когда я обновляю ExoPlayer.

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

Есть ли еще лучшее решение, например, переопределение слушателей и т. Д.?

Обновление: Я использую пользовательский интерфейс раздувая exo_playback_control_view.xml

ответ

1

Глядя на this answer вы можете увидеть, что OnTouchListener#onTouch называется ПЕРЕД View#onTouchEvent, так что вы можете установить OnTouchListener к мнению, потребляют MotionEvent и не будет передан на метод onTouchEvent.

Например, используя этот код только "onTouch: LISTENER !!!" регистрируется при касании точки зрения, а не «onTouchEvent: onTouchEvent !!!»:

EDIT - добавить свой запрос на обработку событий нажмите я добавил использование GestureDetector, используя this answer - так что теперь на клик «onSingleTapUp: TAP DETECTED "также регистрируется.

public class TouchingView extends View { 

    private final static String TAG="TouchingView"; 

    private OnTouchListener touchListener; 
    private GestureDetector gestureDetector; 

    public TouchingView(Context context) { 
     super(context); 
     touchListener = new TouchListener(); 
     gestureDetector = new GestureDetector(getContext(), 
         (GestureDetector.OnGestureListener) touchListener); 
     setOnTouchListener(touchListener); 
    } 

    public TouchingView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     touchListener = new TouchListener(); 
     gestureDetector = new GestureDetector(getContext(), 
         (GestureDetector.OnGestureListener) touchListener); 
     setOnTouchListener(touchListener); 
    } 

    public TouchingView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     touchListener = new TouchListener(); 
     gestureDetector = new GestureDetector(getContext(), 
         (GestureDetector.OnGestureListener) touchListener); 
     setOnTouchListener(touchListener); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     Log.d(TAG, "onTouchEvent: onTouchEvent!!!"); //not logged 
     return super.onTouchEvent(event); 
    } 

    private class TouchListener extends GestureDetector.SimpleOnGestureListener 
           implements View.OnTouchListener{ 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      Log.d(TAG, "onTouch: LISTENER!!!"); //logged upon every touch event. twice upon click (for UP and for DOWN) 
      gestureDetector.onTouchEvent(event); 
      return true; //preventing the view's onTouchEvent from firing 
     } 

     @Override 
     public boolean onSingleTapUp(MotionEvent e) { //you can override onSingleTapConfirmed if you don't want doubleClick to fire it 
      Log.d(TAG, "onSingleTapUp: TAP DETECTED"); //logged only upon click 
      return true; 
     } 
    } 
} 
+0

спасибо. Мне понравилось, что вы предлагаете здесь, и это работает. Поэтому в этом случае я фактически использую второй метод, в котором я отменяю действие по умолчанию и обрабатываю себя, например, на onClick. – AMD

+0

Я рад, что вам это нравится. Пожалуйста, примите это, если это хороший ответ на ваш вопрос :) –

+0

Ваше решение правильно останавливает действия ontouch, однако оно не работает при использовании onClick – AMD

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

  • Нет связанных вопросов^_^