VideoView全屏播放视频出现拉伸变形解决

本文介绍如何使用SurfaceView实现视频背景播放效果,解决VideoView视频拉伸问题,通过关键代码实现视频适配屏幕且不拉伸,并提供完整的Java代码示例。

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

博主要实现的效果是:一个视频作为背景(全屏、不可点击)循环播放,下方放一个按钮,点击按钮跳转到下一个界面。

刚开始使用的是VideoView,VideoView防止视频拉伸很麻烦,网上的帖子基本上都是自定义一个VideoView。之后搜到了用SurfaceView来实现视频播放的帖子,实现起来很简单,代码量也少。下面跟大家分享一下这个方法。

1.xml,将原先的VideoView替换成SurfaceView:

<SurfaceView
        android:id="@+id/sv_start"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
         />

2.java代码:

        private SurfaceView svStart;
        private MediaPlayer player;
        private SurfaceHolder holder;

        svStart = findViewById(R.id.sv_start);
        holder = svStart.getHolder();
        holder.addCallback(this);
        holder.setKeepScreenOn(true);
        player = new MediaPlayer();
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);

        player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                      svStart.setLayoutParams(lp);
                if (!player.isPlaying()) {
                    player.start();
                }
            }
        });
        try {
            AssetFileDescriptor file = getResources().openRawResourceFd(R.raw.start_movie);
            player.setDataSource(file.getFileDescriptor(), file.getStartOffset(),
                    file.getLength());
            player.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
            player.setLooping(true);
            player.prepare();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

@Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        player.setDisplay(holder);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

@Override
    protected void onDestroy() {
        super.onDestroy();        
        if (player.isPlaying()) {
            player.stop();
        }
        player.release();
    }

关键代码就这一句:

player.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);

有了这句代码,视频就不会出现拉伸变形了。

还有ondestroy里面的代码,如果不加上的话,activity挂掉之后仍然会有视频的声音。

 

使用过程中有什么问题给我留言,会尽快回复。

欢迎参观博主的其他博客。

 

      最后推荐给一些想进大厂或者还没有拿到心仪offer的攻城狮们一本书,由大厂java面试官胡书敏编写,满满的干货,助你进到想去的公司。

 

博主上传资源下载链接:

本文源码:

https://download.youkuaiyun.com/download/yonghuming_jesse/10646274

环状百分比显示视图源码:

https://download.youkuaiyun.com/download/yonghuming_jesse/10677919

自制免费无广告小说阅读APP下载:

https://download.youkuaiyun.com/download/yonghuming_jesse/10390364

科大讯飞语音评测服务接入源码:

https://download.youkuaiyun.com/download/yonghuming_jesse/10616924

android饺子播放器使用源码:

https://download.youkuaiyun.com/download/yonghuming_jesse/10619119

视频播放前显示视频第一帧源码:

https://download.youkuaiyun.com/download/yonghuming_jesse/10646332

 

 

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JesseAndroid

每一份支持都是我创作的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值