[Android/安卓]屏幕旋转时改变SurfaceView(视频)宽高

本文详细解析了在自定义SurfaceView时,如何处理屏幕旋转导致的SurfaceView旋转问题,特别是针对播放器应用中SurfaceView宽高需由视频宽高决定的情况,提供了等比例缩放至屏幕宽高的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要解决自定义SurfaceView时,屏幕发生旋转后,SurfaceView也会跟随旋转的问题(因为是做播放器,所以SurfaceView宽高需要由视频宽高决定),最后SurfaceView还需要等比例缩放成屏幕的宽高。

    int mWidth = getMeasuredWidth();
    int mHeight = getMeasuredHeight();
    int oldAngle = 90;

    /**
     * 旋转更新(屏幕旋转时调用,0和180 -> 横屏,90和270 -> 竖屏)
     * 屏幕旋转需要考虑旋转后的高宽变化,例如:竖屏时,高比宽大,横屏时:高比宽小。
     * 所以旋转后要确定那边为宽,那边为高,然后将视频等比例缩放至屏幕相应大小。
     * @param angle     旋转角度。传入0、180、90、270
     */
    private void updateOrientation(int angle) {
        if( videoWidth <= 0 || videoHeight <= 0 ) return;
        //需要改变宽高的LayoutParams
        ViewGroup.LayoutParams lp = getLayoutParams();
        //是否为横版视频
        boolean isLandscapeVideo = videoWidth > videoHeight;
        //是否为横屏
        boolean isLandscapeScreen = angle == 0 || angle == 180;
        /* 因为横竖屏原因,高宽会发生改变,所以需要取最值来判断高宽 */
        int max = mWidth < mHeight ? mHeight : mWidth;
        int min = mWidth > mHeight ? mHeight : mWidth;

        //-1为平放状态
        if( angle == -1 ) angle = oldAngle;

        /* 屏幕旋转一共四种结果:竖屏横视频、竖屏竖视频、横屏横视频、横屏竖视频
         * 其次,这是经过一段很长的代码精简而来,请不要尝试去理解这些代码。
         * 大概意思是横竖屏时判断当前视频的横竖,对高宽进行等比缩放 */
        if( (isLandscapeVideo && isLandscapeScreen) || (!isLandscapeVideo && !isLandscapeScreen) ) {
            /* 横屏横视频 和 竖屏竖视频 */
            lp.width = Utils.calcAspectRatio(
                    videoWidth, videoHeight, isLandscapeScreen ? min : max, false
            );
            if( lp.width > ( isLandscapeScreen ? max : min ) ) {
                lp.height = Utils.calcAspectRatio(
                        videoWidth, videoHeight, isLandscapeScreen ? max : min, true
                );
                lp.width = isLandscapeScreen ? max : min;
            }else {
                lp.height = isLandscapeScreen ? min : max;
            }
        }else {
            /* 竖屏横视频 和 横屏竖视频 */
            lp.width = min + Utils.calcAspectRatio(videoHeight, videoWidth, min, isLandscapeScreen);
            lp.height = isLandscapeScreen ? min : lp.width - min;
            lp.width = isLandscapeScreen ? lp.width - min : min;
        }
        setLayoutParams( lp );

        if( angle != -1 ) oldAngle = angle;
    }

上述代码中的 calcAspectRatio 方法传送门:计算分辨率长宽比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米歪(MiWi)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值