Android SurfaceView播放视频时横竖屏的调整

摘要:
水平屏幕上录制的视频在水平屏幕上播放,垂直屏幕上录制视频在垂直屏幕上播放。将以下属性“android:configChanges=”orientation|keyboardHidden|screenSize”添加到负责在mainifest文件中播放的活动,以覆盖“活动”的onConfigurationChanged方法:@OverridepublicvotionConfigurationCha

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

在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);
            }
        }

免责声明:文章转载自《Android SurfaceView播放视频时横竖屏的调整》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇详解S7源码(1)----Typesdb2 sqlcode下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

node.js 实现接口-操作文件进行用户增删改查

首先安装npm,使用npm安装express npm install express -S /* * @Author: yinxin * @Date: 2020-03-27 10:18:41 * @LastEditTime: 2020-03-30 20:17:26 * @LastEditors: Please set LastEditors...

小程序 大转盘 抽奖 canvas animation

项目需求运用到大转盘 可设置概率 可直接自定义结果 效果如下  ​ 两种方法及结合法 一 通过canvas 实现 但是因为定时器原因 手机端卡顿严重 故而最终使用了方法二 但也是该记录下 学习canvas 二 通过小程序Api animation完成完美解决卡顿问题 更精确定位 有样式缺陷 css无法解决样式 自动分配问题 故结合一二两种方法 出现第三种...

CSS布局属性

一、CSS布局属性 Width:设置对象的宽度(widteight:设置对象的高度(Height:45px;)。ackground:设置对象的背景颜色、背景图像。 1.背景颜色 background:#09F; 2.背景图像 background:url(file:///C|/Users/Administrator/Desktop/huipu.jpg) r...

offsetLeft, offsetTop以及postion().left , postion().top有神马区别

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">...

浅谈CSS中的百分比

结论: 标准流中的元素,看其属性有没有继承性。对于width和margin-left,它是可以继承的,它会参照父元素或者祖先元素(其实是包含块);对于height,它没有继承性,父元素或者祖先元素会自适应其所有子元素的高度和(这点是需要注意的)。 绝对定位参照的是离它最近的父元素或祖先元素,如果没有父元素或祖先元素,那么参照的是初始包含块(不同的浏览器可...

一个简单的WPF MVVM实例【转载】

引用地址:http://blog.csdn.net/yl2isoft/article/details/20838149 1新建WPF应用程序WPFMVVMExample 程序结构如下图所示。 2Model实现 在Model文件夹下新建业务类StudentModel(类文件StudentModel.cs),类的详细代码如下所示。 [csharp]vie...