2017-01-01 60 views
1

我正在ExoPlayer之上开发一个自定义用户界面,并且我注意到当我点击屏幕时,控件(PlaybackControlView)隐藏。Exoplayer hide PlaybackControlView onClick(不是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时都必须进行修改。

我能想到的第二个解决方案就是自己尝试自己处理它,例如,添加我自己的侦听器,以及自己显示和隐藏控件。我还没有尝试过,但似乎有可能。

是否有另一个更好的解决方案,如重写监听器等?

更新:我使用的定制UI通过虚报exo_playback_control_view.xml

回答

1

通过查看this answer,你可以看到一个OnTouchListener#onTouch被称为前View#onTouchEvent,所以你可以设置一个OnTouchListener到视图,消耗MotionEvent它将不会传递给onTouchEvent方法。

例如,仅使用此代码“onTouch:LISTENER !!!”触摸时的观点,而不是记录“的onTouchEvent:的onTouchEvent !!!”:

编辑 - 添加您的要求为click事件处理我加入了使用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行动,但它不使用'GestureDetector'和'SimpleOnGestureListener',使用使用点击的onClick – AMD