zoukankan      html  css  js  c++  java
  • Android SurfaceView播放视频时横竖屏的调整

    对于横屏录制的视频就横屏播放,对于竖屏录制的视频就竖屏播放。

    在mainifest文件里对负责播放的Activity添加以下属性

        android:configChanges="orientation|keyboardHidden|screenSize"

     重写Acitivity的onConfigurationChanged方法:

        @Override
            public void onConfigurationChanged(Configuration newConfig) {
                super.onConfigurationChanged(newConfig);
    
            }

    根据视频的属性来区分

        @Override
            public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
                if (width == 0 || height == 0) {
                    Log.e(TAG, "invalid video width(" + width + ") or height(" + height
                            + ")");
                    return;
                }
                Logger.d(TAG, "onVideoSizeChanged " + width + " height:" + height);
                mIsVideoSizeKnown = true;
                mVideoHeight = height;
                mVideoWidth = width;
                int wid = mMediaPlayer.getVideoWidth();
                int hig = mMediaPlayer.getVideoHeight();
                // 根据视频的属性调整其显示的模式
    
                if (wid > hig) {
                    if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
                        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    }
                } else {
                    if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
                        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    }
                }
                DisplayMetrics dm = new DisplayMetrics();
                getWindowManager().getDefaultDisplay().getMetrics(dm);
                mSurfaceViewWidth = dm.widthPixels;
                mSurfaceViewHeight = dm.heightPixels;
                if (width > height) {
                    // 竖屏录制的视频,调节其上下的空余
    
                    int w = mSurfaceViewHeight * width / height;
                    int margin = (mSurfaceViewWidth - w) / 2;
                    Logger.d(TAG, "margin:" + margin);
                    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                            RelativeLayout.LayoutParams.MATCH_PARENT,
                            RelativeLayout.LayoutParams.MATCH_PARENT);
                    lp.setMargins(margin, 0, margin, 0);
                    mSurfaceView.setLayoutParams(lp);
                } else {
                    // 横屏录制的视频,调节其左右的空余
    
                    int h = mSurfaceViewWidth * height / width;
                    int margin = (mSurfaceViewHeight - h) / 2;
                    Logger.d(TAG, "margin:" + margin);
                    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                            RelativeLayout.LayoutParams.MATCH_PARENT,
                            RelativeLayout.LayoutParams.MATCH_PARENT);
                    lp.setMargins(0, margin, 0, margin);
                    mSurfaceView.setLayoutParams(lp);
                }
            }
  • 相关阅读:
    CodeForces 408E Curious Array(组合数学+差分)
    CodeForces 519E A and B and Lecture Rooms(倍增)
    洛谷 4051 [JSOI2007]字符加密(后缀数组)
    哇,两门学考都是A(〃'▽'〃)
    BZOJ 1977 严格次小生成树
    XJOI 3606 最大子矩形面积/LightOJ 1083 Histogram(单调栈/笛卡尔树)
    XJOI 3629 非严格次小生成树(pqq的礼物)
    XJOI 3363 树4/ Codeforces 739B Alyona and a tree(树上差分+路径倍增)
    [转载]别让用户发呆—设计中的防呆策略
    Linux下的链接文件
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4218244.html
Copyright © 2011-2022 走看看