【问题标题】:Does SimpleExoPlayerView have controller visibility changed events?SimpleExoPlayerView 是否有控制器可见性更改事件?
【发布时间】:2017-12-14 01:43:46
【问题描述】:

我正在尝试使用 SimpleExoPlayerView 实现全屏模式。我主要使用 setSystemUiVisibility 来解决这个问题。

在 onCreate 期间,我添加了一个 OnSystemUiVisibilityChange 侦听器以同步隐藏播放器控件与操作栏。

    @Override
public void onCreate(Bundle savedInstanceState) {

    View decorView = getWindow().getDecorView();
    decorView.setOnSystemUiVisibilityChangeListener
            (onSystemUiChange());

    hideSystemUI();
}

在 OnSystemUiVisibilityChangeListener 中,我还设置了与 simpleExoplayerViews 超时匹配的超时,因此控件和操作栏同时隐藏。

    @NonNull
private View.OnSystemUiVisibilityChangeListener onSystemUiChange() {
    return new View.OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {
            if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                mSimpleExoPlayerView.showController();
                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //sync the hide system ui with 
                        //simpleExoPlayerView's auto hide timeout
                        hideSystemUI();
                    }
                }, mSimpleExoPlayerView.getControllerShowTimeoutMs());

            } else {
                mSimpleExoPlayerView.hideController();
            }
        }
    };
}

private void hideSystemUI() {
    View rootView = findViewById(R.id.root);
    rootView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
                    | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
    );
}

除了一种情况外,这很好用。如果您点击屏幕,然后在 SimpleExoPlayerView 控件超时之前再次点击它,SimpleExoPlayerView 将被隐藏,但系统 ui 在超时之前不会设置。有什么活动可以代替吗?

我已尝试为我的根布局设置 onClick 和 onTouch 侦听器,但这些事件没有被触发,我怀疑 SimpleExoPlayerView 可能正在吞噬它们?

【问题讨论】:

  • 我遇到了同样的问题。它与SimpleExoPlayerView 无关。 onTouch() 不起作用的原因是,每当设置 SYSTEM_UI_FLAG_FULLSCREEN 时,第一个事件总是由 DecoreView 捕获,并且后续事件可用于其他视图。
  • 您可以尝试使用postDelayed 显示和隐藏。它可能有效,也可能无效,我从未尝试过。
  • 嗯,我去看看,谢谢提示

标签: android exoplayer2.x


【解决方案1】:

ExoPlayer 2.10.4 有它。

exoplayer PlayerView 有一个方法叫做

public void setControllerVisibilityListener(PlayerControlView.VisibilityListener listener) {
}

【讨论】:

    【解决方案2】:

    从 2.6.1 开始,SimpleExoPlayerView 似乎没有任何控件的可见性更改侦听器,但 PlaybackControlView 有。但是,它存储在SimpleExoPlayerView 的私有字段中,并且没有内置的方法可以访问它。要设置自己的侦听器,您必须:

    • SimpleExoPlayerView.java 复制到您的项目并进行必要的更改,
    • 使用反射(如果需要,不要忘记添加 proguard 规则),
    • 覆盖exo_simple_player_view.xml并确保它包含PlaybackControlView,然后使用findViewById找到它,
    • 通过遍历视图层次结构手动找到它。

    在我看来,第一个和第三个选项是最好的,但最后一个需要的更改最少,而且效果也很好。这是一个例子:

    import com.google.android.exoplayer2.ui.PlaybackControlView;
    import com.google.android.exoplayer2.ui.SimpleExoPlayerView;
    
    public SomeActivity extends Activity implements PlaybackControlView.VisibilityListener {
    
        private initExoPlayer() {
            // ...
    
            addPlaybackControlVisibilityListener(mSimpleExoPlayerView, this);
        }
    
        @Override
        public void onVisibilityChange(int visibility) {
            // show/hide system ui here
        }
    
        private static void addPlaybackControlVisibilityListener(SimpleExoPlayerView playerView, PlaybackControlView.VisibilityListener listener) {
            PlaybackControlView playbackControlView = findPlaybackControlView(playerView);
            if (playbackControlView != null)
                playbackControlView.setVisibilityListener(listener);
        }
    
        private static PlaybackControlView findPlaybackControlView(ViewGroup viewGroup) {
            for (int i = 0; i < viewGroup.getChildCount(); i++) {
                View child = viewGroup.getChildAt(i);
    
                if (child instanceof PlaybackControlView)
                    return (PlaybackControlView) child;
    
                if (child instanceof ViewGroup) {
                    PlaybackControlView result = findPlaybackControlView((ViewGroup) child);
                    if (result != null)
                        return result;
                }
            }
    
            return null;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-28
      • 2012-08-20
      • 2016-11-22
      • 2015-02-20
      • 2014-10-14
      • 2018-04-03
      • 2010-10-03
      • 1970-01-01
      • 2022-06-30
      相关资源
      最近更新 更多