Exoplayer隐藏PlaybackControlView onClick(不是onTouch)

时间:2017-01-01 11:01:43

标签: java android mediacontroller exoplayer

我正在ExoPlayer上开发自定义用户界面,我注意到当我触摸屏幕时,控件(PlaybackControlView)会隐藏,而不是在我点击时隐藏。

我想更改为单击并检查我如何更改事件侦听器,但到目前为止找不到简单的解决方案。我检查了源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

来使用自定义UI

3 个答案:

答案 0 :(得分:3)

通过查看this answer,您可以看到在OnTouchListener#onTouch之前调用View#onTouchEvent,因此您可以为视图设置OnTouchListener,使用MotionEvent并且它不会传递到onTouchEvent方法。

例如,仅使用此代码" onTouch:LISTENER !!!"在触摸视图时记录,而不是" onTouchEvent:onTouchEvent !!!":

编辑 - 添加您对点击事件处理的请求我使用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;
        }
    }
}

答案 1 :(得分:0)

我遇到同样的问题,但我通过流动设置exoplayerview的controllerHideOnTouch属性解决了这个问题

我使用下面的代码行

mExoPlayerView!!.controllerHideOnTouch=false

为我工作

答案 2 :(得分:0)

要始终在exo播放器上显示控件,请使用hide_on_touch属性:

<com.google.android.exoplayer2.ui.PlayerView
    android:id="@+id/video_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:controller_layout_id="@layout/layout_exo_player"
    app:show_timeout="0"
    app:hide_on_touch="false"/>