Exoplayer 隐藏 PlaybackControlView onClick(不是 onTouch)
Exoplayer hide PlaybackControlView onClick (not onTouch)
我正在 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
使用自定义 UI
通过查看 this answer,您可以看到 OnTouchListener#onTouch
在 View#onTouchEvent
之前被调用,因此您可以为视图设置 OnTouchListener
,使用 MotionEvent
并且不会传递到 onTouchEvent
方法。
例如,使用此代码仅在触摸视图时记录 "onTouch: LISTENER!!!",而不是 "onTouchEvent: onTouchEvent!!!":
编辑 - 添加您对点击事件处理的请求我添加了 GestureDetector
, using 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;
}
}
}
我遇到了同样的问题,但我通过设置 controllerHideOnTouch 属性 of exoplayerview
解决了这个问题
我被以下代码行使用
mExoPlayerView!!.controllerHideOnTouch=false
对我有用
要始终显示 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"/>
我正在 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
使用自定义 UI通过查看 this answer,您可以看到 OnTouchListener#onTouch
在 View#onTouchEvent
之前被调用,因此您可以为视图设置 OnTouchListener
,使用 MotionEvent
并且不会传递到 onTouchEvent
方法。
例如,使用此代码仅在触摸视图时记录 "onTouch: LISTENER!!!",而不是 "onTouchEvent: onTouchEvent!!!":
编辑 - 添加您对点击事件处理的请求我添加了 GestureDetector
, using 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;
}
}
}
我遇到了同样的问题,但我通过设置 controllerHideOnTouch 属性 of exoplayerview
解决了这个问题我被以下代码行使用
mExoPlayerView!!.controllerHideOnTouch=false
对我有用
要始终显示 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"/>