Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Exoplayer隐藏播放控制视图onClick(非onTouch)_Java_Android_Mediacontroller_Exoplayer - Fatal编程技术网

Java Exoplayer隐藏播放控制视图onClick(非onTouch)

Java Exoplayer隐藏播放控制视图onClick(非onTouch),java,android,mediacontroller,exoplayer,Java,Android,Mediacontroller,Exoplayer,我正在ExoPlayer上开发一个自定义UI,我注意到控件(PlaybackControlView)在触摸屏幕时隐藏,而不是在单击时隐藏 我想更改为单击并检查如何更改事件侦听器,但到目前为止还没有找到简单的解决方案。我检查了源代码SimpleExoPlayerView.java,发现它实际上是硬编码的: @Override public boolean onTouchEvent(MotionEvent ev) { if (!useController || player == n

我正在ExoPlayer上开发一个自定义UI,我注意到控件(
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

查看,您可以看到在
视图#onTouchEvent
之前调用了
OnTouchListener#onTouch
,因此您可以将
OnTouchListener
设置为视图,使用
MotionEvent
,它将不会传递到
onTouchEvent
方法

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

编辑-要添加点击事件处理请求,我添加了使用,使用-所以现在点击“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;
        }
    }
}

我也面临着同样的问题,但我通过将集合控制器IDEONTOUCH的exoplayerview属性流动来解决这个问题

我使用以下代码行

mExoPlayerView!!.controllerHideOnTouch=false

对于我来说,始终在exo player上显示控件是可行的使用
hide\u on\u 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"/>


谢谢。我确实按照你的建议做了,而且很有效。所以在本例中,我实际上使用了第二种方法,在这里我取消了默认操作,然后自己处理,例如在onClick上。如果这是您的问题的一个好答案,请接受它:)您的解决方案正确地停止了ontouch操作,但是使用OnClick时它不起作用使用
GestureDetector
SimpleOnGestureListener
,使用