android rmvb播放器播放器渐弱暂停如何实现的

代码片段(4)
1.&[代码]变量申明&&&&
/*变量声明*/
private ImageButton playBtn =//播放、暂停
private ImageButton latestBtn =//上一首
private ImageButton nextButton =//下一首
private ImageButton forwardBtn =//快进
private ImageButton rewindBtn =//快退
private TextView playtime =//已播放时间
private TextView durationTime =//歌曲时间
private SeekBar seekbar =//歌曲进度
private Handler handler =//用于进度条
private Handler fHandler =//用于快进
private int currentP//当前播放位置
2.&[代码]获得上一个activity传来的数据&&&&
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.play);
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
_ids = bundle.getIntArray("_ids");
//获得保存音乐文件_ID的数组
position = bundle.getInt("position"); //获得应该播放的音乐的号数,既播放第几首
//代码未完,见下面的代码
3.&[代码]初始化控件&&&&
playtime = (TextView)findViewById(R.id.playtime);
//显示已经播放的时间
durationTime = (TextView)findViewById(R.id.duration);
//显示歌曲总时间
playBtn = (ImageButton)findViewById(R.id.playBtn);
//开始播放、暂停播放按钮
latestBtn = (ImageButton)findViewById(R.id.latestBtn);
//播放上一首按钮
nextButton = (ImageButton)findViewById(R.id.nextBtn);
//播放下一首按钮
forwardBtn = (ImageButton)findViewById(R.id.forwardBtn); //快进按钮
rewindBtn = (ImageButton)findViewById(R.id.rewindBtn);
//快退按钮
seekbar = (SeekBar)findViewById(R.id.seekbar);
//播放进度条
4.&[代码]定义各控件的回调函数&&&&
playBtn.setOnClickListener(new View.OnClickListener() { //点击“播放、暂停”按钮时回调
public void onClick(View v) {
if (mp.isPlaying()){
//如果正在播放则暂停
playBtn.setBackgroundResource(
R.drawable.play_selecor);
//更改按键状态图标
//如果没有播放则恢复播放
playBtn.setBackgroundResource(
R.drawable.pause_selecor);
//更改按键状态图标
latestBtn.setOnClickListener(new View.OnClickListener() {//点击“播放上一首”按钮时回调
public void onClick(View v) {
int num = _ids.
//获得音乐的数目
if(position==0){
//如果已经时第一首则播放最后一首
position=num-1;
//否则播放上一首
position-=1;
int pos = _ids[position];
//得到将要播放的音乐的_ID
//做播放前的准备工作
//开始播放
nextButton.setOnClickListener(new View.OnClickListener(){//点击“播放下一首”按钮时回调
public void onClick(View v) {
int num = _ids.
//获得音乐的数目
if (position==num-1){
//如果已经是最后一首,则播放第一首
position=0;
position+=1;
//否则播放下一首
int pos = _ids[position];
//得到将要播放的音乐的_ID
//做播放前的准备工作
//开始播放
forwardBtn.setOnTouchListener(new OnTouchListener() {
//点击“快进”按钮时回调
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
fHandler.post(forward); //此处使用handler对象更新进度条
mp.pause();
//点击快进按钮时,音乐暂停播放
case MotionEvent.ACTION_UP:
fHandler.removeCallbacks(forward);
mp.start();
//松开快进按钮时,音乐暂恢复播放
playBtn.setBackgroundResource(
R.drawable.pause_selecor);
rewindBtn.setOnTouchListener(new OnTouchListener() {
//点击“快退”按钮时回调
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
fHandler.post(rewind);
mp.pause(); //点击快退按钮时,音乐暂暂停播放
case MotionEvent.ACTION_UP:
fHandler.removeCallbacks(rewind);
mp.start(); //松开快退按钮时,音乐暂恢复播放
playBtn.setBackgroundResource(
R.drawable.pause_selecor);
seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
public void onStopTrackingTouch(SeekBar seekBar) {
mp.start();
//停止拖动进度条时,音乐开始播放
public void onStartTrackingTouch(SeekBar seekBar) {
mp.pause();
//开始拖动进度条时,音乐暂停播放
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if(fromUser){
mp.seekTo(progress); //当进度条的值改变时,音乐播放器从新的位置开始播放
开源中国-程序员在线工具:
相关的代码(260)
55回/65060阅
5回/43080阅
41回/35652阅
56回/22912阅
15回/22848阅
67回/22361阅
77回/21493阅
18回/21759阅
23回/18796阅
5回/16346阅
哈,非常的有用的O(∩_∩)O哈!可以少敲很多的代码哈!
2楼:李圣尧 发表于
很好,正需要
3楼:刘旺根 发表于
非常好,学习了,谢谢楼主
4楼:xiaopan 发表于
学习了,谢谢楼主。
5楼:shuiyue 发表于
正需要,楼主好人
6楼:liangfeng366 发表于
7楼:Reiz 发表于
谢谢了,总结得很详细
8楼:流星雨的季节 发表于
楼主我爱你,能给我源代码不?就是整个安卓的项目!
9楼:a8237934 发表于
楼主。能问下怎么在放完一首后接着放第二首么?
10楼:周安伟 发表于
bucuo,挺全的
11楼:子旺 发表于
forward &这个handler里面 做了什么呢
12楼:迈向蛋定的路。。。。 发表于
楼主,我查看播放列,另点一首歌的时候,跳转前activity已经finish了为什么上一首仍然播放
13楼:YIskxg 发表于
正需要,谢谢楼主
14楼:左半脑 发表于
15楼:我是至尊宝 发表于
同求整个项目
16楼:jayvato 发表于
楼主,能把整个项目的代码发一下吗?谢啦~& 邮箱:&
17楼:loki_lan 发表于
18楼:WhitneyC 发表于
19楼:leo-H 发表于
多谢,正需要!
20楼:唐小鹏 发表于
楼住.细节代码为什么不一起贴出来
开源从代码分享开始
zchajax的其他代码页面导航:
→ 正文内容 Android提高之MediaPlayer播放网络视频
Android提高之MediaPlayer播放网络视频的实现方法
这篇文章主要介绍了Android的MediaPlayer播放网络视频的实现方法,是一个非常实用的功能,需要的朋友可以参考下
前面讲解了MediaPlayer播放网络音频,主要介绍了MediaPlayer关于网络音频的缓冲和进度条控制的方法,本文再来讲解一下MediaPlayer播放网络视频的方法。播放网络视频比播放网络音频需要多一个SurfaceView而已,在已经熟悉了MediaPlayer播放网络音频之后,相信大家对本文所述的播放网络视频也能很快地掌握。
先来看看本文程序运行截图,如下所示:
本文程序的视频来自,大家可以替换程序中的视频链接,试试其他影片。
main.xml的源码如下:
&?xml version="1.0" encoding="utf-8"?&
&FrameLayout xmlns:android="/apk/res/android"
android:layout_height="fill_parent" android:layout_width="fill_parent"&
&SurfaceView android:id="@+id/surfaceView1"
android:layout_height="fill_parent" android:layout_width="fill_parent"&&/SurfaceView&
&LinearLayout android:layout_height="wrap_content"
android:layout_width="fill_parent" android:layout_gravity="bottom"
android:orientation="vertical"&
&LinearLayout android:orientation="horizontal"
android:layout_gravity="center_horizontal" android:layout_marginTop="4.0dip"
android:layout_height="wrap_content" android:layout_width="wrap_content"&
&Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/btnPlayUrl"
android:text="播放网络视频"&&/Button&
&Button android:layout_height="wrap_content" android:id="@+id/btnPause"
android:text="暂停" android:layout_width="80dip"&&/Button&
&Button android:layout_height="wrap_content"
android:layout_width="80dip" android:text="停止" android:id="@+id/btnStop"&&/Button&
&/LinearLayout&
&LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_marginBottom="20dip"&
&SeekBar android:paddingRight="10dip" android:layout_gravity="center_vertical"
android:paddingLeft="10dip" android:layout_weight="1.0"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:id="@+id/skbProgress" android:max="100"&&/SeekBar&
&/LinearLayout&
&/LinearLayout&
&/FrameLayout&
Player.java是本文的核心,Player.java实现了“进度条更新”、“数据缓冲”、“SurfaceHolder生命周期”等功能,其中“SurfaceHolder生命周期”是视频与音频播放的最大区别,通过surfaceCreated()、surfaceDestroyed()、surfaceChanged()可以创建/释放某些资源。下面这个地方需要注意一下:
videoWidth = mediaPlayer.getVideoWidth();
videoHeight = mediaPlayer.getVideoHeight();
if (videoHeight != 0 && videoWidth != 0) {
arg0.start();
有些视频是android播放器不能播放的,不能播放时videoHeight=0,videoWidth=0,以此来判断是否播放视频。
Player.java源码如下:
package com.
import java.io.IOE
import java.util.T
import java.util.TimerT
import android.media.AudioM
import android.media.MediaP
import android.media.MediaPlayer.OnBufferingUpdateL
import android.media.MediaPlayer.OnCompletionL
import android.os.H
import android.os.M
import android.util.L
import android.view.SurfaceH
import android.view.SurfaceV
import android.widget.SeekB
public class Player implements OnBufferingUpdateListener,
OnCompletionListener, MediaPlayer.OnPreparedListener,
SurfaceHolder.Callback {
private int videoW
private int videoH
public MediaPlayer mediaP
private SurfaceHolder surfaceH
private SeekBar skbP
private Timer mTimer=new Timer();
public Player(SurfaceView surfaceView,SeekBar skbProgress)
this.skbProgress=skbP
surfaceHolder=surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mTimer.schedule(mTimerTask, 0, 1000);
/*******************************************************
* 通过定时器和Handler来更新进度条
******************************************************/
TimerTask mTimerTask = new TimerTask() {
public void run() {
if(mediaPlayer==null)
if (mediaPlayer.isPlaying() && skbProgress.isPressed() == false) {
handleProgress.sendEmptyMessage(0);
Handler handleProgress = new Handler() {
public void handleMessage(Message msg) {
int position = mediaPlayer.getCurrentPosition();
int duration = mediaPlayer.getDuration();
if (duration & 0) {
long pos = skbProgress.getMax() * position /
skbProgress.setProgress((int) pos);
//*****************************************************
public void play()
mediaPlayer.start();
public void playUrl(String videoUrl)
mediaPlayer.reset();
mediaPlayer.setDataSource(videoUrl);
mediaPlayer.prepare();//prepare之后自动播放
//mediaPlayer.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
public void pause()
mediaPlayer.pause();
public void stop()
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer =
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
Log.e("mediaPlayer", "surface changed");
public void surfaceCreated(SurfaceHolder arg0) {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDisplay(surfaceHolder);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnPreparedListener(this);
} catch (Exception e) {
Log.e("mediaPlayer", "error", e);
Log.e("mediaPlayer", "surface created");
public void surfaceDestroyed(SurfaceHolder arg0) {
Log.e("mediaPlayer", "surface destroyed");
* 通过onPrepared播放
public void onPrepared(MediaPlayer arg0) {
videoWidth = mediaPlayer.getVideoWidth();
videoHeight = mediaPlayer.getVideoHeight();
if (videoHeight != 0 && videoWidth != 0) {
arg0.start();
Log.e("mediaPlayer", "onPrepared");
public void onCompletion(MediaPlayer arg0) {
// TODO Auto-generated method stub
public void onBufferingUpdate(MediaPlayer arg0, int bufferingProgress) {
skbProgress.setSecondaryProgress(bufferingProgress);
int currentProgress=skbProgress.getMax()*mediaPlayer.getCurrentPosition()/mediaPlayer.getDuration();
Log.e(currentProgress+"% play", bufferingProgress + "% buffer");
test_videoplayer.java是主程序,负责调用Player类,其中关键部分是SeekBarChangeEvent这个SeekBar拖动的事件:SeekBar的Progress是0~SeekBar.getMax()之内的数,而MediaPlayer.seekTo()的参数是0~MediaPlayer.getDuration()之内数,所以MediaPlayer.seekTo()的参数是(progress/seekBar.getMax())*MediaPlayer.getDuration()。
test_videoplayer.java源码如下:
package com.
import android.app.A
import android.content.pm.ActivityI
import android.net.U
import android.os.B
import android.util.L
import android.view.SurfaceV
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.SeekB
public class test_videoplayer extends Activity {
private SurfaceView surfaceV
private Button btnPause, btnPlayUrl, btnS
private SeekBar skbP
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView1);
btnPlayUrl = (Button) this.findViewById(R.id.btnPlayUrl);
btnPlayUrl.setOnClickListener(new ClickEvent());
btnPause = (Button) this.findViewById(R.id.btnPause);
btnPause.setOnClickListener(new ClickEvent());
btnStop = (Button) this.findViewById(R.id.btnStop);
btnStop.setOnClickListener(new ClickEvent());
skbProgress = (SeekBar) this.findViewById(R.id.skbProgress);
skbProgress.setOnSeekBarChangeListener(new SeekBarChangeEvent());
player = new Player(surfaceView, skbProgress);
class ClickEvent implements OnClickListener {
public void onClick(View arg0) {
if (arg0 == btnPause) {
player.pause();
} else if (arg0 == btnPlayUrl) {
String url="/vids/family_guy_penis_car.3gp";
player.playUrl(url);
} else if (arg0 == btnStop) {
player.stop();
class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// 原本是(progress/seekBar.getMax())*player.mediaPlayer.getDuration()
this.progress = progress * player.mediaPlayer.getDuration()
/ seekBar.getMax();
public void onStartTrackingTouch(SeekBar seekBar) {
public void onStopTrackingTouch(SeekBar seekBar) {
// seekTo()的参数是相对与影片时间的数字,而不是与seekBar.getMax()相对的数字
player.mediaPlayer.seekTo(progress);
感兴趣的读者可以自己动手测试一下本文实例代码,相信对大家进行Android程序开发有一定的借鉴作用。
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行慢杂志 | 鱼玩
根据类型筛选:
提示:加载更多文章将会重新排序

我要回帖

更多关于 android wmv播放器 的文章

 

随机推荐