Android开发Android开发Android开发经验谈

JiaoZiVideoPlayer 全屏显示不全

2018-11-30  本文已影响23人  Ready_I

视频 GitHub地址 https://github.com/lipangit/JiaoZiVideoPlayer

引发原因

int widthPixel;
int heightPixel;
DisplayMetrics outMetrics = new DisplayMetrics();
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(outMetrics);
heightPixel = outMetrics.heightPixels;
widthPixel  = outMetrics.widthPixels;

通过使用获取屏幕宽高来对全屏ViewGroup设置宽高。导致有的手机底部状态栏可能为透明,屏幕全屏显示导致覆盖不全底部状态栏
出现下面这个图片问题


小米6X

然后把代码修改为 获取屏幕实际分辨率,不管状态栏高度

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
  wm.getDefaultDisplay().getRealMetrics(outMetrics);
}else {
  wm.getDefaultDisplay().getMetrics(outMetrics);
}

看起小米6X是没问题了,但是使用华为Mate9,发现底部导航栏把屏幕给遮盖了
如图


小米6X
华为Mate9

最后如何避免由于底部状态栏导致屏幕全屏显示问题。那么就是获取应用在屏幕中的实际分辨率

获取当前app绘制区域

Rect outRect = new Rect();
(JZUtils.scanForActivity(getContext())).findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect);
heightPixel = outRect.height();
widthPixel  = outRect.width();

应用在分屏的情况下全屏也是ok的
如图


分屏

这个方式获取屏幕高度发现没有问题了,但有一个小缺陷

-----如果在全屏情况下,手动控制底部导航栏显示隐藏,就会导致全屏显示不完全或者遮盖问题。

-----如果不是全屏情况下,手动控制底部导航栏显示隐藏则不会出现这种问题。

目前下面为个人修改的JiaoZiVideoPlayer全屏显示代码

  public void startWindowFullscreen() {
        Log.i(TAG, "startWindowFullscreen " + " [" + this.hashCode() + "] ");
        hideSupportActionBar(getContext());

        ViewGroup vp = (JZUtils.scanForActivity(getContext()))//.getWindow().getDecorView();
                .findViewById(Window.ID_ANDROID_CONTENT);
        View old = vp.findViewById(R.id.jz_fullscreen_id);
        if (old != null) {
            vp.removeView(old);
        }
        textureViewContainer.removeView(JZMediaManager.textureView);
        try {
            Constructor<JZVideoPlayer> constructor = (Constructor<JZVideoPlayer>) JZVideoPlayer.this.getClass().getConstructor(Context.class);
            JZVideoPlayer jzVideoPlayer = constructor.newInstance(getContext());
            jzVideoPlayer.setId(R.id.jz_fullscreen_id);
            int widthPixel;
            int heightPixel;
            
            // 用户绘制区域
            Rect outRect = new Rect();
            (JZUtils.scanForActivity(getContext())).findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect);
            heightPixel = outRect.height();
            widthPixel  = outRect.width();
            
            LayoutParams lp = new LayoutParams(heightPixel, widthPixel);
            lp.setMargins((widthPixel - heightPixel) / 2, -(widthPixel - heightPixel) / 2, 0, 0);
//            FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
//                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            vp.addView(jzVideoPlayer, lp);
//            jzVideoPlayer.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
//                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN);
            jzVideoPlayer.setUp(dataSourceObjects, currentUrlMapIndex, JZVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN, objects);
            jzVideoPlayer.setState(currentState);
            jzVideoPlayer.addTextureView();
            JZVideoPlayerManager.setSecondFloor(jzVideoPlayer);
            final Animation ra = AnimationUtils.loadAnimation(getContext(), R.anim.start_fullscreen);
            jzVideoPlayer.setAnimation(ra);
            jzVideoPlayer.setRotation(90);
            JZUtils.setRequestedOrientation(getContext(), SCREEN_ORIENTATION_PORTRAIT);//强制横屏显示

            onStateNormal();
            jzVideoPlayer.progressBar.setSecondaryProgress(progressBar.getSecondaryProgress());
            jzVideoPlayer.startProgressTimer();
            CLICK_QUIT_FULLSCREEN_TIME = System.currentTimeMillis();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
上一篇 下一篇

猜你喜欢

热点阅读