自定义视频播放

package tv.buka.android.ui.home;

import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;

import java.io.IOException;
import java.util.Formatter;
import java.util.Locale;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import tv.buka.android.R;
import tv.buka.android.base.BaseActivity;

public class PlayerActivity extends BaseActivity {

    String str = "http://jzvd.nathen.cn/c6e3dc12a1154626b3476d9bf3bd7266/6b56c5f0dc31428083757a45764763b0-5287d2089db37e62345123a1be272f8b.mp4";
    @BindView(R.id.faceView)
    SurfaceView faceView;
    @BindView(R.id.back)
    ImageView back;
    @BindView(R.id.bofangzanting)
    ImageView bofangzanting;
    @BindView(R.id.seekBar)
    SeekBar seekBar;
    @BindView(R.id.start)
    TextView start;
    @BindView(R.id.stop)
    TextView stop;
    MediaPlayer mediaPlayer;
    int duration;
    @BindView(R.id.title_name)
    TextView titleName;
    @BindView(R.id.title_top)
    LinearLayout titleTop;
    @BindView(R.id.title_bottom)
    LinearLayout titleBottom;

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0) {
                titleTop.setVisibility(View.GONE);
                titleBottom.setVisibility(View.GONE);
            }
        }
    };

    Runnable r = new Runnable() {
        @Override
        public void run() {
            if (mediaPlayer != null){
                int mCurrentPosition = mediaPlayer.getCurrentPosition();//获取player当前进度,毫秒表示
                int total = mediaPlayer.getDuration();
                seekBar.setProgress(mCurrentPosition);//seekbar同步歌曲进度
                seekBar.setMax(total);//seekbar设置总// 时长
                stop.setText(calculateTime(total));
                start.setText(calculateTime( mCurrentPosition));
            }
            handler.postDelayed(this,500);//延迟一秒运行线程
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player);
        ButterKnife.bind(this);

        titleName.setText("测试");
        titleName.setVisibility(View.GONE);
        mediaPlayer = new MediaPlayer();

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //获取SurfaceHolder 可以通过该接口来操作SurfaceView中的Surface
        final SurfaceHolder surfaceHolder = faceView.getHolder();
        //设置Meiaplayer的准备监听
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                //准备完成后播放
                mediaPlayer.start();

                duration = mediaPlayer.getDuration();

                updateSeekBar();

            }
        });

        handler.sendEmptyMessageDelayed(0,5000);

        surfaceHolder.addCallback(new SurfaceHolder.Callback() {
            //当SurfaceView中Surface创建时回掉
            //该方法表示Surface已经创建完成,可以在该方法中进行绘图操作
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                mediaPlayer.reset();
                try {
                    //设置视屏文件图像的显示参数
                    mediaPlayer.setDisplay(holder);

                    //file.getAbsolutePath()本地视频
                    //uri 网络视频
                    mediaPlayer.setDataSource(PlayerActivity.this, Uri.parse(str));

                    //prepare();表示准备工作同步进行,(准备工作在UI线程中进行)
                    //当播放网络视频时,如果网络不要 会报ARN 所以不采用该方法
                    //mediaPlayer.prepare();
                    //异步准备 准备工作在子线程中进行 当播放网络视频时候一般采用此方法
                    mediaPlayer.prepareAsync();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            //当SurfaceView的大小发生改变时候触发该方法
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }

            //Surface销毁时回掉
            //当Surface销毁时候,同时把MediaPlayer也销毁
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                if (mediaPlayer != null) {
                    mediaPlayer.stop();
                    //释放资源
                    mediaPlayer.release();
                }
            }
        });

        //设置 surfaceView点击监听
        faceView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        titleTop.setVisibility(View.VISIBLE);
                        titleBottom.setVisibility(View.VISIBLE);
                        handler.sendEmptyMessageDelayed(0,5000);
                        break;
                }
                //返回True代表事件已经处理了
                return true;
            }
        });

        //暂停播放
        bofangzanting.setOnClickListener(new View.OnClickListener() {

            private int zanTinZhi;

            @Override
            public void onClick(View view) {
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.pause();
                    zanTinZhi = mediaPlayer.getCurrentPosition();
                    bofangzanting.setImageDrawable(getResources().getDrawable(R.drawable.bofang));
                } else {
                    mediaPlayer.start();
                    mediaPlayer.seekTo(zanTinZhi);
                    bofangzanting.setImageDrawable(getResources().getDrawable(R.drawable.zantin));
                }
            }
        });
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {

                Log.e("progress",progress+"+++"+ duration+"*****"+seekBar.getMax());
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

               mediaPlayer.seekTo(seekBar.getProgress());

            }
        });
    }

    @OnClick({R.id.back, R.id.bofangzanting, R.id.seekBar})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.back:
                mediaPlayer.stop();
                handler.removeCallbacks(r);
                this.finish();
                break;
            case R.id.bofangzanting:
                break;
            case R.id.seekBar:
                break;
        }
    }

    //计算歌曲时间
    private String calculateTime(int time){
        // 转换成字符串的时间
        StringBuilder mFormatBuilder = new StringBuilder();
        Formatter mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
        int totalSeconds = time / 1000;
        int seconds = totalSeconds % 60;

        int minutes = (totalSeconds / 60) % 60;
        int hours = totalSeconds / 3600;

        mFormatBuilder.setLength(0);
        if (hours > 0) {
            return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString();
        } else {
            return mFormatter.format("%02d:%02d", minutes, seconds).toString();
        }
    }

    private void updateSeekBar(){
        runOnUiThread(r);

    }
}

猜你喜欢

转载自blog.csdn.net/zjy_android/article/details/80107514