简易视频播放器

简易视频播放器

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Demo">

    <SurfaceView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/sur"
        android:layout_above="@id/lay"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lay"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            >
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@mipmap/up"
                android:layout_weight="1"
                android:layout_marginLeft="50dp"
                android:id="@+id/ups"
                />
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@mipmap/start"
                android:layout_weight="1"
                android:layout_marginLeft="20dp"
                a

ndroid:layout_marginRight="20dp"
                    android:id="@+id/start_stop"
                    />
                <Button
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@mipmap/after"
                    android:layout_weight="1"
                    android:layout_marginRight="50dp"
                    android:id="@+id/after"
                    />
            </LinearLayout>
            <RelativeLayout
                android:layout_marginTop="10dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="0:00"
                    android:id="@+id/dang"
                    />
                <SeekBar
                    android:layout_toLeftOf="@id/sum"
                    android:layout_toRightOf="@id/dang"
                    android:layout_marginLeft="10dp"
                    android:layout_marginRight="10dp"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/bar"
                    />
                <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:text="6:56"
                android:id="@+id/sum"
                />
        </RelativeLayout>
    </LinearLayout>

</RelativeLayout>

主类

public class Demo extends AppCompatActivity implements SurfaceHolder.Callback, SeekBar.OnSeekBarChangeListener, View.OnClickListener {

    SurfaceView sur;
    SurfaceHolder holder;
    SeekBar bar;
    Button up;
    Button after;
    Button start_stop;
    TextView dang;
    TextView sum;
    int time;
    MediaPlayer player;
    boolean isPause;
    boolean isStart;
    int times;
    SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
    Date date = new Date();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo);

        sur = findViewById(R.id.sur);
        holder = sur.getHolder();
        holder.addCallback(this);
        bar = findViewById(R.id.bar);
        up = findViewById(R.id.ups);
        after = findViewById(R.id.after);
        start_stop = findViewById(R.id.start_stop);
        dang = findViewById(R.id.dang);
        sum = findViewById(R.id.sum);

        bar.setOnSeekBarChangeListener(this);

        up.setOnClickListener(this);
        start_stop.setOnClickListener(this);
        after.setOnClickListener(this);
    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            //判断进度条是否继续
            if(time*1000 <= times && !isPause) {
                bar.setProgress(time * 1000);
                date.setTime(time * 1000);
                String format = sdf.format(date);
                dang.setText(format);
                Message message = new Message();
                time++;
                handler.sendMessageDelayed(message, 1000);
            }else if(time*1000 >= times){
                time = 0;
                bar.setProgress(time * 1000);
                date.setTime(time * 1000);
                String format = sdf.format(date);
                dang.setText(format);
                Message message = new Message();
                time++;
                handler.sendMessageDelayed(message, 1000);
            }
        }
    };

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        newMideaPlear();
        player.setDisplay(holder);//设置让surfaceview来播放视频.
        player.prepareAsync();//异步准备.
    }

    private void newMideaPlear() {
        player = new MediaPlayer();
        try {
            player.setDataSource("/sdcard/Vadio/cat.mp4");
        } catch (IOException e) {
            e.printStackTrace();
        }

        player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                player.setLooping(true);//设置循环播放
                times = player.getDuration();//获取视频长度
                int jin = times;
                date.setTime(jin);
                String format = sdf.format(date);
                sum.setText(format);
                bar.setMax(times);//设置进度条最大值
                player.start();//开始播放
                Message message = new Message();
                message.arg1 = time;
                handler.sendMessage(message);
                isStart = true;
            }
        });
    }

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

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        player.stop();//停止播放
        player.release();//释放资源
    }




    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        player.seekTo(seekBar.getProgress());//设置mediaplayer的播放进度
        handler.removeCallbacksAndMessages(null);//删除所有handler的信息.
        Message message = new Message();
        time = seekBar.getProgress()/1000;
        handler.sendMessage(message);
    }


    //点击事件
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.ups://进度后退5秒钟
                if(time >= 5){
                    time-=5;
                }else{
                    time = 0;
                }
                player.seekTo(time*1000);//设置mediaplayer的播放进度
                handler.removeCallbacksAndMessages(null);//删除所有handler的信息.
                Message message = new Message();
                handler.sendMessage(message);
                break;
            case R.id.start_stop://暂停及开始
                if(isPause){
                    player.start();
                    isPause = false;
                    start_stop.setBackgroundResource(R.mipmap.start);
                }else{
                    player.pause();
                    isPause = true;
                    start_stop.setBackgroundResource(R.mipmap.stop);
                }
                Message message1 = new Message();
                handler.sendMessage(message1);
                break;
            case R.id.after://进度条前进5秒钟
                if(time+5 <= times){
                    time+=5;
                }else{
                    time = times;
                }
                player.seekTo(time*1000);//设置mediaplayer的播放进度
                handler.removeCallbacksAndMessages(null);//删除所有handler的信息.
                Message mes = new Message();
                handler.sendMessage(mes);
                break;
                default:
                    break;
        }
    }
}

效果图

可实现拖动进度条,快进,快退,循环播放,暂停,继续

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wangwei_weibo/article/details/91625127