Android移动开发基础教程(慕课版)(第2版)课件 第9单元 综合实战_第1页
Android移动开发基础教程(慕课版)(第2版)课件 第9单元 综合实战_第2页
Android移动开发基础教程(慕课版)(第2版)课件 第9单元 综合实战_第3页
Android移动开发基础教程(慕课版)(第2版)课件 第9单元 综合实战_第4页
Android移动开发基础教程(慕课版)(第2版)课件 第9单元 综合实战_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9单元综合实战Android移动开发基础教程(慕课版)(第2版)9.1视频播放器【知识描述】对于一个视频播放器来说一般会具有拖动条,用户拖动拖动条滑块可以实现视频的快进和快退,在播放的过程中,拖动条应该不断地更新播放的时间和显示视频总时长,同时视频播放器还需要提供暂停/继续播放功能。9.1.1界面布局界面主体部分首先需要添加一个SurfaceView用于显示播放的内容,然后需要显示拖动条和播控按钮。<RelativeLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"><SurfaceViewandroid:id="@+id/svew"android:layout_width="match_parent"android:layout_height="match_parent"/><LinearLayoutandroid:id="@+id/llview"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignBottom="@id/svew"android:background="#777777"android:orientation="vertical"android:paddingBottom="15dp"android:alpha="0.8">9.1.1界面布局<SeekBarandroid:id="@+id/seek_bar"android:layout_width="match_parent"android:layout_height="wrap_content"android:indeterminate="false"/><LinearLayoutandroid:id="@+id/llview_progress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:layout_marginLeft="5dp"android:gravity="left"android:orientation="horizontal"><ImageViewandroid:id="@+id/img_play_pause"android:layout_width="30dp"android:layout_height="30dp"android:clickable="true"android:src="@drawable/pause"/><TextViewandroid:id="@+id/txt_cur_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:text="00:00:00"android:textColor="#FFFFFF"android:textSize="18sp"/><TextViewandroid:id="@+id/txt_total_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="00:00:00"android:textColor="#FFDDBB"android:textSize="18sp"/></LinearLayout></LinearLayout></RelativeLayout>9.1.1界面布局在布局文件中,外层的视图容器使用的布局方式为相对布局方式,其中添加了一个SurfaceView视图,layout_width和layout_height的值都为match_parent,这样可以使播放内容占满整个画面。其后定义了一个纵向线性布局,用于显示拖动条和播控按钮等内容,通过设置android:layout_alignBottom="@id/svew"使得该布局与SurfaceView的底部对齐,设置android:alpha属性让布局具有一定的透明度。在该布局中,首先定义了一个SeekBar用于显示播放的进度和拖动条,然后定义了一个横向线性布局用于显示播控按钮和播放时间。9.1.1界面布局通过设置android:clickable="true"使得该图片可以被单击,用于实现暂停/继续播放功能。界面具体效果如图9.1所示。图9.1界面具体效果9.1.2初始化在浏览文件的过程中,如果浏览到的是文件夹,则进入下级目录;如果浏览到的是视频文件,则调用本单元设计的视频播放器,并将视频的路径作为参数传入,如果浏览到的是其他文件则返回。privatevoidchange(Filefile){StringfileName=file.getName();if(fileName.endsWith(".avi")||fileName.endsWith(".mp4")||fileName.endsWith(".mkv")){//调用本单元设计的视频播放器

Intentintent=newIntent(MainActivity.this,VideoPlayerActivity.class);intent.putExtra("videoUrl",file.getAbsolutePath());startActivity(intent);}if(!file.isDirectory()){return;}mTitle.setText(file.getAbsolutePath());List<File>files=fileMgr.getSubFiles(file);mAdpter.updateFiles(files);mAdpter.notifyDataSetChanged();}9.1.2初始化视频播放Activity启动时,首先在onCreate()方法中设置一些Window参数使得播放界面全屏显示,然后从Intent中获取视频的URL,并做一些组件和播放器的初始化工作,代码具体如下:@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);this.requestWindowFeature(Window.FEATURE_NO_TITLE);this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);setContentView(R.layout.activity_video);//获取视频的路径

Intentintent=getIntent();mVideoUrl=intent.getStringExtra("videoUrl");initWidget();initPlayer();mHandler.postDelayed(task,1000);}9.1.2初始化/***初始化组件**/privatevoidinitWidget(){mSurface=(SurfaceView)findViewById(R.id.svew);mSeekBar=(SeekBar)findViewById(R.id.seek_bar);mtxtCurTime=(TextView)findViewById(R.id.txt_cur_time);mtxtTotalTime=(TextView)findViewById(R.id.txt_total_time);mPlayPause=(ImageView)findViewById(R.id.img_play_pause);//设置播放进度的初始值

mtxtCurTime.setText("00:00:00"+"/");mtxtTotalTime.setText("00:00:00");mSeekBar.setProgress(0);mSeekBar.setMax(100);//为播控按钮设置单击事件监听

mPlayPause.setOnClickListener(newOnClickListener(){@Override9.1.2初始化publicvoidonClick(Viewv){if(mPlayer.isPlaying()){mPlayer.pause();mPlayPause.setImageResource(R.drawable.play);}else{mPlayer.start();mPlayPause.setImageResource(R.drawable.pause);}}});mSeekBar.setOnSeekBarChangeListener(this);}/***初始化播放器**/9.1.2初始化privatevoidinitPlayer(){mPlayer=newMediaPlayer();try{//设置视频源

mPlayer.setDataSource(mVideoUrl);mHolder=mSurface.getHolder();//为SurfaceHolder增加回调函数

mHolder.addCallback(newSurfaceHolder.Callback(){@OverridepublicvoidsurfaceDestroyed(SurfaceHolderholder){}@OverridepublicvoidsurfaceCreated(SurfaceHolderholder){mPlayer.setDisplay(holder);}@OverridepublicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){}});9.1.2初始化

//准备播放源

mPlayer.prepareAsync();//设置播放器准备的回调函数

mPlayer.setOnPreparedListener(newOnPreparedListener(){@OverridepublicvoidonPrepared(MediaPlayermp){if(null!=mp){mp.start();//准备完成就播放视频

mVideoLength=mp.getDuration();//获取视频总时长并显示

mtxtTotalTime.setText(CommonUtils.formatVideoLength(mVideoLength));}}});}catch(Exceptione){e.printStackTrace();}}在组件的初始化initWidget()方法中,首先通过findViewById()方法获取各个控件,然后为进度的显示和进度条的位置设置初始值。通过setOnClickListener()方法为播控按钮设置监听事件。9.1.2初始化在播放器的初始化initPlayer()方法中,首先创建了一个MediaPlayer对象,通过setDataSource()方法设置视频源,然后获取SurfaceView的SurfaceHolder,为其添加回调函数。最后调用MediaPlayer类的prepareAsync()方法异步准备播放源,当播放源准备完毕后,会回调OnPreparedListener的onPrepared()方法,在其中可以启动MediaPlayer对象进行视频播放,并且可以获取视频的总时长。9.1.3播控和进度控制在视频播放中,暂停、继续播放和进度拖动是常见的操作。播控是通过监听图片的单击事件实现的,代码如下所示://为播控按钮设置单击事件监听mPlayPause.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){if(mPlayer.isPlaying()){mPlayer.pause();mPlayPause.setImageResource(R.drawable.play);}else{mPlayer.start();mPlayPause.setImageResource(R.drawable.pause);}}});9.1.3播控和进度控制在播控按钮被单击后,首先判断当前视频的状态.如果处于暂停状态,则调用MediaPlayer类的start()方法继续播放,同时更换播控的图片,显示暂停按钮如果处于播放状态,则调用MediaPlayer类的pause()方法暂停视频播放,同时更换播控的图片,显示播放按钮9.1.3播控和进度控制播放界面和暂停界面如图9.2和图9.3所示。图9.2播放状态图9.3暂停界面9.1.3播控和进度控制拖动拖动条滑块进行视频的快进和快退是通过监听OnSeekBarChangeListener事件实现的。首先在代码中通过setOnSeekBarChangeListener()为拖动条设置事件监听,然后重写OnSeekBarChangeListener的回调函数,在不同的事件触发下执行不同的动作。privatevoidinitWidget(){…………mSeekBar.setOnSeekBarChangeListener(this);}/***拖动条发生改变时回调**/@OverridepublicvoidonProgressChanged(SeekBarseekBar,intprogress,booleanfromUser){mPlayer.seekTo((int)((progress/100.0f)*mVideoLength));}/**9.1.3播控和进度控制

*拖动条被触摸时回调**/@OverridepublicvoidonStartTrackingTouch(SeekBarseekBar){if(mPlayer.isPlaying()){mPlayer.pause();}}/***拖动条被释放时回调**/@OverridepublicvoidonStopTrackingTouch(SeekBarseekBar){if(null!=mPlayer&&!mPlayer.isPlaying()){mPlayer.start();}}onStartTrackingTouch()在拖动条被触摸时回调,其中可以调用MediaPlayer的pause()方法暂停视频的播放。onStopTrackingTouch()在拖动条被释放时回调,此时快进或快退操作已经完成,调用MediaPlayer的start()方法继续播放视频。9.1.3播控和进度控制在播放的过程中,需要根据当前视频播放的时间实时更新滑块的显示位置和视频的当前播放时长,这可以通过Handler和Runnable任务实现,代码具体如下:privateRunnabletask=newRunnable(){@Overridepublicvoidrun(){intprogress=mSeekBar.getProgress();intposition=mPlayer.getCurrentPosition();if(0!=mVideoLength&&mPlayer.isPlaying()){//计算拖动条滑块应该处于的位置

progress=(int)((position/(mVideoLength*1.0f))*100);}mSeekBar.setProgress(progress);//更新当前应该显示的播放时间

mtxtCurTime.setText(CommonUtils.formatVideoLength(position)+"/");if(progress>=100){mHandler.removeCallbacks(this);}else{mHandler.postDelayed(this,1000);//每隔1s执行一次

}}};9.1.3播控和进度控制

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论