使用SurfaceView+Medaplayer+SeekBar完成视频的播放加进度条
来源:互联网 发布:中国农业生产总值数据 编辑:程序博客网 时间:2024/05/22 20:54
在主页面中activity_main布局中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="alice.bw.com.day03surfaceviewmedaplayerseekbar3.MainActivity">
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="400dp" />
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/play_bt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="播放" />
<Button
android:id="@+id/pause_bt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="暂停" />
</LinearLayout>
</LinearLayout>
在主页面Activity中
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{
private SurfaceView surfaceView;
private SeekBar seekBar;
private SurfaceHolder holder;
private MediaPlayer player;
//更改进度的广播
private ProgressReceiver receiver;
private boolean flag = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
//初始化 各种组件
private void init() {
// 实例化 播放器
player = MediaPlayer.create(this, R.raw.a);
// surfaceView
surfaceView = ((SurfaceView) findViewById(R.id.surfaceView));
//进度条
seekBar = ((SeekBar) findViewById(R.id.seekBar));
// 广播接收者
receiver = new ProgressReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("alice.com.player");
//动态注册
registerReceiver(receiver, filter);
//surfaceHolder
holder = surfaceView.getHolder();
holder.addCallback(this);
// 固定surfaceView的屏幕大小
holder.setKeepScreenOn(true);
//SURFACE_TYPE_PUSH_BUFFERS表明该Surface不包含原生数据,
// Surface用到的数据由其他对象提供,在Camera图像预览中就使用该类型的Surface,
// 有Camera负责提供给预览Surface数据,这样图像预览会比较流畅。
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// 给seekBar 设置一个最大值 , 最大值是 MediaPlayer的 长度
seekBar.setMax(player.getDuration());
seekBar.setProgress(0);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
/*
参数二: 代表当前seekBar滑动的进度
参数三: true 表示手指拖拽 false 表示 设置进度
当拖动条发生变化时调用该方法
*/
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
if (b)
player.seekTo(i);
}
//当用户开始滑动滑块时调用该方法(即按下鼠调用一次)
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
Log.d("sxl", "onStartTrackingTouch: ");
player.pause();
}
//当用户结束对滑块滑动时,调用该方法(即松开鼠标)
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
Log.d("sxl", "onStopTrackingTouch: ");
player.start();
}
});
}
public void onClick(View view) {
switch (view.getId()) {
case R.id.play_bt:
// 开始播放
if (player != null && !player.isPlaying())
player.start();
break;
case R.id.pause_bt:
if (player != null && player.isPlaying())
player.pause();
break;
}
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
// 设置 显示 View
if (player != null)
player.setDisplay(surfaceHolder);//绑定
// 开启 记录时间的 线程
new MyThread().start();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
class MyThread extends Thread {
@Override
public void run() {
super.run();
Intent intent = new Intent();
intent.setAction("alice.com.player");
while (flag) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (player != null) {
// 发送广播 更新 seekBar 当前进度
int currentPosition = player.getCurrentPosition();
intent.putExtra("progress", currentPosition);
sendBroadcast(intent);
}
}
}
}
class ProgressReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int progress = intent.getIntExtra("progress", 0);
//接收进度 并更新 seekBar
seekBar.setProgress(progress);
}
}
// 销毁的时候需要处理
@Override
protected void onDestroy() {
super.onDestroy();
flag = false;
unregisterReceiver(receiver);
if (player != null) {
player.release();
player = null;
}
}
}
在java代码中动态注册了广播所以在清单文件中不用再注册了
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="alice.bw.com.day03surfaceviewmedaplayerseekbar3">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
- 使用SurfaceView+Medaplayer+SeekBar完成视频的播放加进度条
- 使用SurfaceView+MediaPlayer+SeekBar实现视频播放
- 【Android】Android开发实现进度条效果,SeekBar的简单使用。音量,音乐播放进度,视频播放进度等
- 使用SurfaceView 播放视频
- 使用SurfaceView播放视频
- 使用Surfaceview播放视频
- SurfaceView播放视频控件的使用
- Android两种播放视频的方法(SurfaceView+MediaPlayer+SeekBar)跟(VideoView+MediaController)
- 多媒体(视频播放器)Mediaplayer+SurfaceView+Seekbar
- 视频播放器(SurfaceView+MediaPlayer+SeekBar,VideoView+MediaController)
- android使用SurfaceView播放视频
- 使用SurFaceView实现视频播放
- 使用SurfaceView&MediaPlayer播放视频
- 使用surfaceView实现视频播放
- 使用SurfaceView+MediaPlayer视频播放
- 我的Android进阶之旅------>Android如何通过自定义SeekBar来实现视频播放进度条
- Android-SeekBar进度条的使用
- 简单的视频播放surfaceView
- 自己写的一个猜拳小游戏(C语言)
- JQuery实用控件
- 栈和队列 生成窗口最大数组
- Python错误:bs4.FeatureNotFound: Couldn't find a tree builder with the features you
- Linux下TCP最大连接数受限问题
- 使用SurfaceView+Medaplayer+SeekBar完成视频的播放加进度条
- CF876C 暴力
- Network-based recommendation algorithms--A review
- C++笔记——类模板
- 欢迎使用CSDN-markdown编辑器
- 猜数字游戏
- XBanner轮播和pullToRefreshListView刷新条目
- Java中集合类的使用、区别、总结
- 数据结构与算法(Java描述)-7、链式堆栈及其栈的应用