版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章Android多媒体技术8.1音频文件播放8.2服务(Service)
8.3视频文件播放
8.4小结
8.1音频文件播放
音频文件的格式众多,除了WAV格式是没有经过压缩的音频格式外,其余格式都属于压缩存储格式,例如MP3格式和WMA格式等。其中,WMA格式(Android系统不支持)的全称为WindowsMediaAudio,是微软公司设计的一种优秀音频压缩格式,而目前流行的高压缩比音频格式为MP3格式。本节将介绍MP3格式音频文件的播放技术。
Android系统的MediaPlayer类集成了MP3音频解码器,这项技术十分成熟,借助MediaPlayer类的对象播放MP3文件只需要调用播放控制方法即可,其流程如图8-1所示。图8-1MediaPlayer对象播放MP3文件流程图本节(甚至是本章)的准备工作是向模拟的SD卡中写入音频(和视频)文件,如图8-2所示。这里向SD卡中传送了三个mp3文件供本节使用,还有另外两个视频文件可供第8.3节使用。这三个音频文件分别为cgq_bzsndm.mp3、cgq_tyrx.mp3和gln_tt.mp3,两个视频文件依次为bear.3GP和wolf.MP4。图8-2模拟器SD卡上的多媒体文件
例8.1
播放MP3文件工程。
新建工程ex08_01,应用名为MyMP3PlayerApp,包名为cn.jxufe.zhangenhe,活动界面名为MyMP3PlayerAct。工程ex08_01包括源文件MyMP3PlayerAct.java、布局文件main.xml、列表框布局文件mp3list.xml、颜色资源文件myguicolor.xml以及图像资源文件play1.png、stop1.png、stop2.png、pause1.png、pause2.png和pause3.png等。其中,6个图像文件用于表示播放控制按钮的状态,如图8-3所示。文件myguicolor.xml与工程ex07_08中的同名文件内容相同。
列表布局文件mp3list.xml的内容如下所示,表示列表框中的每行显示一个文本。图8-3工程ex08_01执行结果
1<?xmlversion="1.0"encoding="utf-8"?>
2<AbsoluteLayout
3android:id="@+id/widget0"
4android:layout_width="fill_parent"
5android:layout_height="fill_parent"
6xmlns:android="/apk/res/android"
7>
8<TextView
9android:id="@+id/mp3name"
10android:layout_width="wrap_content"
11android:layout_height="wrap_content"
12android:text="TextView"
13android:layout_x="10px"
14android:layout_y="10px"
15android:textColor="@drawable/yellow"
16>
17</TextView>
18</AbsoluteLayout>
工程ex08_01的布局如图8-3所示,其布局文件main.xml的内容如下所示:
1<?xmlversion="1.0"encoding="utf-8"?>
2<AbsoluteLayout
3android:id="@+id/widget0"
4android:layout_width="fill_parent"
5android:layout_height="fill_parent"
6xmlns:android="/apk/res/android"
7android:background="@drawable/darkgray"
8>
9<SeekBar
10android:id="@+id/seekbar"
11android:layout_x="10px"
12android:layout_y="10px"
13android:layout_height="wrap_content"
14android:layout_width="460px"
15android:max="100"
16android:progress="0"
17>
18</SeekBar>
19<ImageButton
20android:id="@+id/imbplay"
21android:layout_width="80px"
22android:layout_height="80px"
23android:layout_x="20px"
24android:layout_y="70px"
25android:src="@drawable/play1"
26android:scaleType="fitCenter"
27android:onClick="myPlayMD"
28>
29</ImageButton>
30<ImageButton
31android:id="@+id/imbpause"
32android:layout_width="80px"
33android:layout_height="80px"
34android:layout_x="110px"
35android:layout_y="70px"
36android:src="@drawable/pause1"
37android:scaleType="fitCenter"
38android:onClick="myPauseMD"
39>
40</ImageButton>
41<ImageButton
42android:id="@+id/imbstop"
43android:layout_width="80px"
44android:layout_height="80px"
45android:layout_x="200px"
46android:layout_y="70px"
47android:src="@drawable/stop1"
48android:scaleType="fitCenter"
49android:onClick="myStopMD"
50>
51</ImageButton>
52<TextView
53android:id="@+id/textview"
54android:layout_width="200px"
55android:layout_height="50px"
56android:text=""
57android:layout_x="20px"
58android:layout_y="170px"
59android:textColor="@drawable/green"
60>
61</TextView>
62<ListView
63android:id="@+id/listview"
64android:layout_width="400px"
65android:layout_height="400px"
66android:layout_x="40px"
67android:layout_y="240px"
68>
69</ListView>
70</AbsoluteLayout>
源文件MyMP3PlayerAct.java的代码如下所示:
1packagecn.jxufe.zhangenhe;
2
3importjava.io.File;
4importjava.io.FilenameFilter;
5importjava.io.IOException;
6importjava.util.ArrayList;
7importjava.util.HashMap;
8importjava.util.Timer;
9importjava.util.TimerTask;
10importandroid.app.Activity;
11importandroid.media.MediaPlayer;
12importandroid.media.MediaPlayer.OnCompletionListener;
13importandroid.os.Bundle;
14importandroid.view.View;
15importandroid.widget.AdapterView;
16importandroid.widget.AdapterView.OnItemClickListener;
17importandroid.widget.ImageButton;
18importandroid.widget.ListView;
19importandroid.widget.SeekBar;
20importandroid.widget.SimpleAdapter;
21importandroid.widget.TextView;
22
23publicclassMyMP3PlayerActextendsActivity
24 implementsSeekBar.OnSeekBarChangeListener{
25 privateSeekBarmySeekbar;
26 privateTextViewmytv;
27 privateImageButtonimbplay,imbpause,imbstop;
28 privateListViewlvMP3List;
29 privatebooleanblstop=false;
30 privateintblpause=0;
31 privatestaticfinalStringMP3PATH="/sdcard/";
32 privateMediaPlayermyMP3Player;
33 privateTimertimer;
34 privateTimerTasktimerTask;
35 privatebooleanstopTrack=false;
36第25行定义了进度条对象mySeekbar;第26行定义了静态文本框对象mytv;第27行定义了三个图像按钮控件对象imbplay、imbpause和imbstop;第28行定义了列表框控件对象lvMP3List;第31行定义了SD卡路径常量MP3PATH;第32行定义了MediaPlayer对象myMP3Player;第33、34行定义了定时器对象timer和定时器任务timerTask。
37@Override
38publicvoidonCreate(BundlesavedInstanceState){
39super.onCreate(savedInstanceState);
40setContentView(R.layout.main);
41myInitGUI();
42}第56~63行为lvMP3List列表框列表项的单击事件,当某项被单击时,该项的文本(即要播放音频文件的文件名)显示在静态文本框tv_name中,如图8-3(b)所示。
64 MP3PlayList();
65 myMP3Player=newMediaPlayer();
第65行创建myMP3Player对象。
66 timer=newTimer();
67 timerTask=newTimerTask(){
68 @Override
69 publicvoidrun(){
70 if(!stopTrack){
71 if(myMP3Player.isPlaying
())第79~89行的三个覆盖方法依次表示进度条滑块改变时、改变过程中和停止拖动后的事件方法。为了避免拖动过程中与定时器设定滑块位置冲突,通过boolean量stopTrack进行协调,如第70、83行所示。当滑块停止拖动时,调用seekTo方法将播放文件的位置与滑块的位置同步。
90 publicvoidmyPlayMD(Viewv){
91 if(playMP3()){
92 blstop=true;
93 blpause=1;
94 imbstop.setImageDrawable(getResources()
95 .getDrawable(R.drawable.stop1));
96 imbpause.setImageDrawable(getResources()
97 .getDrawable(R.drawable.pause1));
98 }
99 }第90~99行为“播放”按钮的点击事件方法。第91行调用playMP3方法开始播放音频文件,如果调用成功,则返回真,此时设置变量blstop为真(第92行),表示“停止”按钮可用;设置blpause为1(第93行),表示“暂停”按钮进入状态1。“暂停”按钮有三个状态,即不可用、点击暂停和点击继续播放,分别对应于blpause的值为0、1和2。第94~97行设置“停止”和“暂停”按钮的图标。
100 publicvoidmyPauseMD(Viewv){
101 switch(blpause){
102 case1:
103 imbpause.setImageDrawable(getResources()
111 myMP3Player.start();
112 blpause=1;
113 break;
114 }
115 }
第100~115行为“暂停”按钮的点击事件方法。当blpause为1时,处于点击暂停状态,此时点击“暂停”按钮,则调用pause方法(第105行)暂停播放,并设置“暂停”按钮的状态为“点击继续播放”状态,即blpause为2(第106行)。当blpause为2时,处于点击继续播放状态,则调用start方法(第111行)继续播放,并设置blpause为1。
149 }
150 });
151 returntrue;
152 }
第128行的方法playMP3为播放音频文件的方法。第129行调用reset方法复位播放器;第131行得到播放文件路径;第132行判断文件是否存在;第133行将该文件设为要播放的音频文件;第134行调用prepare方法准备播放;第136行调用start方法开始播放。第137~150行说明播放过程中监听OnCompletionListener接口,当播放完成后,自动调用onCompletion方法来复位myMP3Player对象(第141行)。
153 }catch(IllegalArgumentExceptione){
154 e.printStackTrace();
155 }catch(IllegalStateExceptione){
156 e.printStackTrace();
157 }catch(IOExceptione){
158 e.printStackTrace();
159 }
160 returnfalse;
161 }
162 classMP3FilterimplementsFilenameFilter{
163 @Override
164 publicbooleanaccept(Filedir,Stringfilename){
165 returnfilename.endsWith(".mp3");
166 }
167 }
第172行的listFiles方法的参数为FilenameFilter接口类型。上述第162~167行定义了实现该接口的类MP3Filter,实现了该接口的抽象方法accept,用于过滤扩展名为.mp3的文件。
168 privatevoidMP3PlayList(){
169 ArrayList<HashMap<String,String>>mp3NameList=
177 }
178 }
179 SimpleAdapterlistAdapter=newSimpleAdapter(this,mp3NameList,
180 R.layout.mp3list,
181 newString[]{"mp3_name"},
182 newint[]{R.id.mp3name});
183 lvMP3List.setAdapter(listAdapter);
184 }
185}
8.2服务(Service)
例8.2
背景音乐播放实例。
例8.2的运行结果如图8-4所示,当点击“播放”按钮时,启动服务,服务将播放一段轻音乐“ghsy.mp3”。如果点击“暂停”按钮,则停止服务,服务将停止播放音乐。当点击“退出”按钮(图8-4(b)中最右侧的按钮)时,将关闭当前应用程序界面,此时音乐继续播放,因为服务还在继续。
新建工程ex08_02,应用名为MyMP3ServiceApp,包名为cn.jxufe.zhangenhe,活动界面名为MyMP3ServiceAct。工程ex08_02的结构如图8-5所示。图8-4工程ex08_2执行结果图8-5工程ex08_02文件目录结构由图8-5可知,工程ex08_02包括源文件MyMP3ServiceAct.java、MyService.java,布局文件main.xml,音频文件ghsy.mp3(用作服务播放的背景音乐),配置文件AndroidManifest.xml以及图像资源文件exit.png、play1.png、play2.png、stop1.png和stop2.png等。其中,图像文件用于播放控制按钮的图标显示,如图8-4所示。
由于工程ex08_02中有服务,因此其配置文件AndroidManifest.xml的内容如下:
1<?xmlversion="1.0"encoding="utf-8"?>
2<manifestxmlns:android="/apk/res/android"
3package="cn.jxufe.zhangenhe"上述代码中,第15~20行为服务配置,第17行声明了服务的Intent动作名为“myMP3ServIt”。
工程ex08_02的布局如图8-4所示,它包括三个图像按钮控件。其布局文件main.xml代码如下:
1<?xmlversion="1.0"encoding="utf-8"?>
2<AbsoluteLayout
3android:id="@+id/widget0"
4android:layout_width="fill_parent"
5android:layout_height="fill_parent"
6xmlns:android="/apk/res/android"
7android:background="@drawable/darkgray"
8>
9<ImageButton
10android:id="@+id/imbplay"
11android:layout_width="80px"
12android:layout_height="80px"
13android:layout_x="40px"
14android:layout_y="70px"
15android:src="@drawable/play1"
16android:scaleType="fitCenter"
17android:onClick="myPlayMD"
18>
19</ImageButton>
20<ImageButton
21android:id="@+id/imbstop"
22android:layout_width="80px"
23android:layout_height="80px"
24android:layout_x="160px"
25android:layout_y="70px"
26android:src="@drawable/stop1"
27android:scaleType="fitCenter"
28android:onClick="myStopMD"
29>
30</ImageButton>
31<ImageButton
32android:id="@+id/imbexit"
33android:layout_width="80px"
34android:layout_height="80px"
35android:layout_x="280px"
36android:layout_y="70px"
37android:src="@drawable/exit"
38android:scaleType="fitCenter"
39android:onClick="myExitMD"
40>
41</ImageButton>
42</AbsoluteLayout>上述代码的第17、28和39行声明了三个图像按钮控件的点击事件方法分别为myPlayMD、myStopMD和myExitMD。
源文件MyMP3ServiceAct.java的内容如下所示:
1packagecn.jxufe.zhangenhe;
2
3importandroid.app.Activity;
4importandroid.content.Intent;
5importandroid.os.Bundle;
6importandroid.view.View;
7importandroid.widget.ImageButton;
8
9publicclassMyMP3ServiceActextendsActivity{
10 privateImageButtonimbplay,imbstop;
11 privatebooleanblplay=true;
12 privatebooleanblstop=false;
13 privateIntentit;
14@Override
15publicvoidonCreate(BundlesavedInstanceState){
16super.onCreate(savedInstanceState);
17setContentView(R.layout.main);
18myInitGUI();
19}
20privatevoidmyInitGUI(){第13行定义Intent对象it,第25行得到it对象。
27 publicvoidmyPlayMD(Viewv){
28 if(blplay){
29 startService(it);
30 blplay=false;
31 blstop=true;
32 imbstop.setImageDrawable(getResources().getDrawable(R.drawable.stop1));
33 imbplay.setImageDrawable(get
Resources().getDrawable(R.drawable.play2));
34 }
35 }当点击“播放”按钮控件时,执行第27~35行的方法myPlayMD,第29行调用方法startService启动服务。
36 publicvoidmyStopMD(Viewv){
37 if(blstop){
38 stopService(it);
39 blstop=false;
40 blplay=true;
41 imbstop.setImageDrawable(getResources().getDrawable(R.drawable.stop2));
42 imbplay.setImageDrawable(getResources().getDrawable(R.drawable.play1));
43 }
44 }当点击“停止”按钮控件时,执行第36~44行的方法myStopMD,第38行调用方法stopService停止服务。
45 publicvoidmyExitMD(Viewv){
46 this.finish();
47 }
48}
当点击“关闭”按钮(图8-4(b)中圈住的按钮)时,执行上述代码,关闭当前应用界面。
源文件MyService.java的内容如下所示:
1packagecn.jxufe.zhangenhe;
2
3importandroid.app.Service;
4importandroid.content.Intent;
5importandroid.media.MediaPlayer;
6importandroid.os.IBinder;
7
8publicclassMyServiceextendsService{
9 privateMediaPlayermp;
10 @Override
11 publicIBinderonBind(Intentarg0){
12 returnnull;
13 }
14 @Override
15 publicvoidonStart(Intentintent,intstartId){
16 super.onStart(intent,startId);
17 mp=MediaPlayer.create(this,R.raw.ghsy);
18 mp.start();
19 }
当服务启动时自动调用onStart方法,第17行从资源中取到音频媒体文件,第18行调用start方法播放音乐。
20 @Override
21 publicvoidonDestroy(){
22 super.onDestroy();
23 mp.stop();
24 }
25}当服务停止时自动调用onDestroy方法,第23行调用stop方法停止播放音乐。
从工程ex08_02可知,服务对外部调用提供的方法为startService和stopService。当外部调用startService方法时,服务将自动执行onStart方法;当外部调用stopService方法时,服务将自动执行onDestroy方法。所谓的“自动”是指Android系统管理了这些调用工作。
8.3视频文件播放
例8.3
视频(包括音频)播放器实例。
新建工程ex08_03,应用名为MyMP4PlayerApp,包名为cn.jxufe.zhangenhe,活动界面名为MyMP4PlayerAct。工程ex08_03实现的功能如图8-6所示,程序启动后的界面如图8-6(a)所示,点击“wolf.MP4”文件后点击“播放”按钮,如图8-6(b)所示;点击“bear.3GP”文件后点击“播放”按钮如图8-6(c)所示;点击“gln_tt.mp3”音频文件后点击“播放”按钮如图8-6(d)所示,即工程ex08_03可以播放音频和视频文件。图8-6工程ex08_03执行结果工程ex08_03的布局如图8-6所示,其布局文件main.xml的内容如下所示:
1<?xmlversion="1.0"encoding="utf-8"?>
2<AbsoluteLayout
3android:id="@+id/widget0"
4android:layout_width="fill_parent"
5android:layout_height="fill_parent"
6xmlns:android="/apk/res/android"
7android:background="@drawable/darkgray"
8>
9<TextView
10android:id="@+id/textview"
11android:layout_width="200px"
12android:layout_height="50px"
13android:text=""
14android:layout_x="20px"
15android:layout_y="10px"
16android:textColor="@drawable/green"
17>
18</TextView>采用绝对布局方式,在左上角(20,10)位置处放置静态文本框控件,其ID号为textview。
19<SurfaceView
20android:id="@+id/screen"
21android:layout_x="0px"
22android:layout_y="60px"
23android:layout_width="480px"
24android:layout_height="320px"
25>
26</SurfaceView>静态文本框下面放置SurfaceView控件,如第19~26行所示,用于显示视频图像。
27<SeekBar
28android:id="@+id/seekbar"
29android:layout_x="10px"
30android:layout_y="390px"
31android:layout_height="wrap_content"
32android:layout_width="460px"
33android:max="100"
34android:progress="0"
35>
36</SeekBar>
Surface控件下面放置进度条控件,如第27~36行所示。
37<ImageButton
38android:id="@+id/imbplay"
39android:layout_width="80px"
40android:layout_height="80px"
41android:layout_x="20px"
42android:layout_y="460px"
43android:src="@drawable/play1"
44android:scaleType="fitCenter"
45android:onClick="myPlayMD"
46>
47</ImageButton>
48<ImageButton
49android:id="@+id/imbpause"
50android:layout_width="80px"
51android:layout_height="80px"
52android:layout_x="110px"
53android:layout_y="460px"
54android:src="@drawable/pause1"
55android:scaleType="fitCenter"
56android:onClick="myPauseMD"
57>
58</ImageButton>
59<ImageButton
60android:id="@+id/imbstop"
61android:layout_width="80px"
62android:layout_height="80px"
63android:layout_x="200px"
64android:layout_y="460px"
65android:src="@drawable/stop1"
66android:scaleType="fitCenter"
67android:onClick="myStopMD"
68>
69</ImageButton>在屏幕垂直位置460px处水平放置三个图像按钮,如第37~69行所示,分别为“播放”、“暂停”和“停止”按钮,其事件方法依次为myPlayMD、myPauseMD和myStopMD。
70<ListView
71android:id="@+id/listview"
72android:layout_width="400px"
73android:layout_height="230px"
74android:layout_x="40px"
75android:layout_y="560px"
76>
77</ListView>
78</AbsoluteLayout>第70~77行的ListView控件用于显示SD卡上的音频和视频文件。
列表框布局文件medialist.xml的内容如下所示:
1<?xmlversion="1.0"encoding="utf-8"?>
2<AbsoluteLayout
3android:id="@+id/widget0"
4android:layout_width="fill_parent"
5android:layout_height="fill_parent"
6xmlns:android="/apk/res/android"
7>
8<TextView
9android:id="@+id/filename"
10android:layout_width="wrap_content"
11android:layout_height="wrap_content"
12android:text="TextView"
13android:layout_x="10px"
14android:layout_y="10px"
15android:textColor="@drawable/yellow"
16>
17</TextView>
18</AbsoluteLayout>
上述列表框布局中包含一个TextView控件,用于显示音频或视频文件的文件名。源文件MyMP4PlayerAct.java的内容如下所示,在此重点介绍与工程ex08_01中文件MyMP3PlayerAct.java不同的地方。
1packagecn.jxufe.zhangenhe;
2
3importjava.io.File;
4importjava.io.FilenameFilter;
5importjava.io.IOException;
6importjava.util.ArrayList;
7importjava.util.HashMap;
8importjava.util.Timer;
9importjava.util.TimerTask;
10importandroid.app.Activity;
11importandroid.media.AudioManager;
12importandroid.media.MediaPlayer;
13importandroid.media.MediaPlayer.OnCompletionListener;
14importandroid.os.Bundle;
15importandroid.view.SurfaceHolder;
16importandroid.view.SurfaceView;
17importandroid.view.View;
18importandroid.view.Window;
19importandroid.view.WindowManager;
20importandroid.widget.AdapterView;
21importandroid.widget.AdapterView.OnItemClickListener;
22importandroid.widget.ImageButton;
23importandroid.widget.ListView;
24importandroid.widget.SeekBar;
25importandroid.widget.SimpleAdapter;
26importandroid.widget.TextView;
27
28publicclassMyMP4PlayerActextendsActivity
29 implementsSeekBar.OnSeekBarChangeListener{
30 privateSeekBarmySeekbar;
31 privateTextViewmytv;
32 privateImageButtonimbplay,imbpause,imbstop;
33 privateListViewlvMP4List;
34 privatebooleanblstop=false;
35 privateintblpause=0;
36 privatestaticfinalStringMP3PATH="/sdcard/";
37 privateMediaPlayermyPlayer;
38 privateTimertimer;
39 privateTimerTasktimerTask;
40 privatebooleanstopTrack=false;
41 privateSurfaceViewscreen;
42 privateSurfaceHolderscrholder;第41行定义SurfaceView类的对象screen,第42行定义SurfaceHolder类的对象scrholder。
43@Override
44publicvoidonCreate(BundlesavedInstanceState){
45super.onCreate(savedInstanceState);
46requestWindowFeature(Window.FEATURE_NO_TITLE);
47getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
48 WindowManager.LayoutParams.
FLAG_FULLSCREEN);
49setContentView(R.layout.main);
50myInitGUI();
51}
第46行设置窗口不显示标题。第47、48行设置不显示状态栏,这里的状态栏是指窗口中最顶部的提示信号强度等手机状态的横栏。
52privatevoidmyInitGUI(){
53 mySeekbar=(SeekBar)findViewById(R.id.seekbar);
54 mySeekbar.setMax(100);
55 mySeekbar.setProgress(0);
56 mySeekbar.setOnSeekBarChangeListener(this);
57 mytv=(TextView)findViewById(R.id.textview);
58 imbplay=(ImageButton)findViewById(R.id.imbplay);
59 imbstop=(ImageButton)findViewById(R.id.imbstop);
60 imbpause=(ImageButton)findViewById(R.id.imbpause);
61 imbplay.setImageDrawable(getResources().getDrawable(R.drawable.play1));
第61行借助setImageDrawable方法设置图像控件中显示的图标,用getResource方法得到资源对象,再调用getDrawable方法得到资源中的ID号为R.drawable.play1的图形对象。第62、63行采用同样的方法给图像按钮添加图标。
62 imbstop.setImageDrawable(getResources().getDrawable(R.drawable.stop2));
63 imbpause.setImageDrawable(getResources().getDrawable(R.drawable.pause3));
64 lvMP4List=(ListView)findViewById(R.id.listview);
65 lvMP4List.setOnItemClickListener(newOnItemClickListener(){
66 @Override
67 publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,
68 longarg3){
69 TextViewtv_name=(TextView)arg1.findViewById(R.id.filename);
70 mytv.setText(tv_name.getText().toString());
71 }
72 });
73 MPPlayList();
74 myPlayer=newMediaPlayer();
第74行创建myPlayer对象。
75 timer=newTimer();
76 timerTask=newTimerTask(){
77 @Override第86行得到screen对象;第87得到scrholder对象,通过该对象访问screen对象;第88~101行添加scrholder的回调函数;第102行设置scrholder的显示类型为SURFACE_TYPE_PUSH_BUFFERS,该Android系统常量值为3,此时Android系统将取消setType方法和显示类型常量,不建议程序员使用方法setType。这里必须有第102行,这样才能保证视频显示正常。第102行等效于“scrholder.setType(3);”。
104@Override
105publicvoidonProgressChanged(SeekBarseekBar,intprogress,booleanfromTouch){
106}
107 @Override
108 publicvoidonStartTrackingTouch(SeekBarseekBar){
109 stopTrack=true;
110 }
111 @Override
112 publicvoidonStopTrackingTouch(SeekBarseekBar){
113 stopTrack=false;
114 myPlayer.seekTo(se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 立春科学解读
- 专用油品运输业务协议(2024年度)版B版
- 2025年高效节水打机井建设与维护合同2篇
- 24节气:大寒 相关英语练习
- 16《金色的草地》说课稿-2024-2025学年三年级上册语文统编版
- 2025年度智慧交通PPP项目合作协议3篇
- 个人过桥融资合同2024年适用样本版
- 氢能燃料电池研发合作合同
- 2025版宠物领养中心公益项目合作协议3篇
- 2024年美发美容师个人服务合同
- 绿色供应链管理制度内容
- 无锡市区2024-2025学年四年级上学期数学期末试题一(有答案)
- 心理学基础知识考试参考题库500题(含答案)
- 血液净化中心院内感染控制课件
- 一年级数学(上)计算题专项练习集锦
- 消防安全应急预案下载
- 年产1.5万吨长链二元酸工程建设项目可研报告
- 《北航空气动力学》课件
- 纺织厂消防管道安装协议
- 【MOOC】思辨式英文写作-南开大学 中国大学慕课MOOC答案
- 期末测试卷(试题)-2024-2025学年五年级上册数学北师大版
评论
0/150
提交评论