VideoView按原始视频比例播放

正常还是建议用mediaplayer+sufaceview 实现视频播放。但是由于只是实现简单的播放功能我就使用了videoview,用videoview播放视频存在的问题就是在固定好的宽高内播放视频不是原始视频比例,所以这就需要做出一些设置更改。

关键的问题是获取视频的宽高有了这个就可以自定义的去设置播放的视频比例

通过onPrepared回调获取mediaplayer对象,这样我们就可以获取到了视频的kuanga

mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() {
                    @Override
                    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
                        //FixMe 获取视频资源的宽度
                        mVideoWidth = mp.getVideoWidth();
                        //FixMe 获取视频资源的高度
                        mVideoHeight = mp.getVideoHeight();
                      
                        scale = (float) mVideoWidth / (float) mVideoHeight;
                        refreshPortraitScreen(showVideoHeight == 0 ? DensityUtil.dip2px(context, 300) : showVideoHeight);
                    }
                });
               
            }
        });
 //重新刷新 竖屏显示的大小  树屏显示以宽度为准
    public void refreshPortraitScreen(int height) {
        if (height == 0) {
            height = showVideoHeight;
        }
        if (mVideoHeight > 0 && mVideoWidth > 0) {
            //FixMe 拉伸比例

            mVideoWidth = (int) (height * scale);//FixMe 设置surfaceview画布大小
//            mVideoHeight = (int) (mVideoWidth / scale);
            mVideoView.getHolder().setFixedSize(mVideoWidth, height);
            L.i("竖屏时视频的宽高==", "宽=" + mVideoWidth + ",高=" + mVideoHeight);
            //FixMe 重绘VideoView大小,这个方法是在重写VideoView时对外抛出方法
            mVideoView.setMeasure(mVideoWidth, height);
            //FixMe 请求调整
            mVideoView.requestLayout();
        }
    }
ds

refreshPortraitScreen(int height) 方法就是根据视频宽高的比例来重新绘制 画布和 VideoView的大小。这样我们就可以自定义的显示视频并且保持原始比例。

public class DiyVideoView extends VideoView {
    private int width;
    private int height;

    public DiyVideoView(Context context) {
        super(context);
    }

    public DiyVideoView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setMeasure(int width, int height) {
        this.width = width;
        this.height = height;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 默认高度,为了自动获取到focus
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = width;
// 这个之前是默认的拉伸图像
        if (this.width > 0 && this.height > 0) {
            width = this.width;
            height = this.height;
        }
        setMeasuredDimension(width, height);
    }

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值