2017-01-01 61 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