布局文件
<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;
}
}
}
效果图
可实现拖动进度条,快进,快退,循环播放,暂停,继续