SurfaceView(4),SurfaceView+MediaPlayer实现一个简单视频播放器

在这里插入图片描述

SurfacePlayer播放器

package com.zhangyu.surfaceplayer;

import android.content.Context;
import android.media.MediaPlayer;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;

import com.example.zhangyu.common.Utils.ScreenUtils;

import java.io.IOException;

public class SurfacePlayer extends SurfaceView {
    private static final String TAG = "SurfacePlayer";
    private SurfaceHolder holder;
    private MediaPlayer mediaPlayer;
    private String videoPath;

    public SurfacePlayer(Context context) {
        this(context, null);
    }

    public SurfacePlayer(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SurfacePlayer(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        holder = getHolder();
        holder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                if (mediaPlayer != null) {
                    mediaPlayer.setDisplay(holder);
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                Log.d(TAG, "surfaceChanged: \nwidth=" + width + "\nheight=" + height);
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                Log.d(TAG, "surfaceDestroyed: ");
                if (mediaPlayer != null) {
                    mediaPlayer.release();
                }
            }
        });
    }

    public void playVideo(String videoPath) {
        this.videoPath = videoPath;
        mediaPlayer = new MediaPlayer();
        try {
            mediaPlayer.setDataSource(videoPath);
            mediaPlayer.prepare();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                    mediaPlayer.setLooping(true);

                    getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                        @Override
                        public void onGlobalLayout() {
                            int videoWidth = mediaPlayer.getVideoWidth();
                            int videoHeight = mediaPlayer.getVideoHeight();

                            ViewGroup parent = (ViewGroup) getParent();
                            int parentWidth = parent.getWidth();
                            int parentHeight = parent.getHeight();

                            int[] maxSize = ScreenUtils.getMaxSize(videoWidth, videoHeight, parentWidth, parentHeight);
                            Log.d(TAG, "onPrepared: \nvideoWidth=" + videoWidth + "\nvideoHeight=" + videoHeight + "\nparentWidth=" + parentWidth + "\nparentHeight=" + parentHeight + "\nmaxSize[0]=" + maxSize[0] + "\nmaxSize[1]=" + maxSize[1]);

                            ViewGroup.LayoutParams params = getLayoutParams();
                            params.width = maxSize[0];
                            params.height = maxSize[1];
                            setLayoutParams(params);

                            getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        }
                    });

                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void onResume() {
        if (!TextUtils.isEmpty(videoPath)) {
            playVideo(videoPath);
        }
    }

    public void onDestroy(){
        if (mediaPlayer != null) {
            mediaPlayer.release();
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值