`

android音乐播放器拖放播放进度设计

 
阅读更多
android音乐播放器拖放播放进度设计

效果图:



播放器设计中需要显示播放进度,并随着播放的进行,进度条要走动。当我们直接拖放播放进度条,也能调整播放进度。这里我们使用了SeekBar来完成这个任务。
下面直接上代码:

界面布局不多说
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >


    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >


        <SeekBar
            android:id="@+id/seekBar1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true" />

        <Button
            android:id="@+id/previous"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:text="前一个" />

        <Button
            android:id="@+id/next"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:text="下一个" />

        <Button
            android:id="@+id/play"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_toLeftOf="@id/next"
            android:layout_toRightOf="@id/previous"
            android:text="播放" />


    </RelativeLayout>

</LinearLayout>


在前台的界面,只设置了播放操作,可以看到点击播放后,我们启动了service播放音乐,这里我们要注意看到SeekBarReceiver这个。我们是通过接收受service发过来的广播,并调整进度条的。还有这个SeekBarListener,我们通过它设置了SeekBar的拖放操作
MusicseekbarActivity.java
package org.hwq.music.seekbar;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class MusicseekbarActivity extends Activity implements OnClickListener{
	Button pre,play,next;
	SeekBar seekbar;
	SeekBarReceiver receiver;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        pre = (Button) findViewById(R.id.previous);
        play = (Button) findViewById(R.id.play);
        next = (Button) findViewById(R.id.next);
        seekbar = (SeekBar) findViewById(R.id.seekBar1);
        pre.setOnClickListener(this);
        play.setOnClickListener(this);
        next.setOnClickListener(this);
        seekbar.setOnSeekBarChangeListener(new SeekBarListener());
    }
    @Override
    protected void onStart() {
    	super.onStart();
    	//注册receiver接受service中发送过来的广播
    	receiver = new SeekBarReceiver();
    	this.registerReceiver(receiver, new IntentFilter("org.hwq.receiver.seekbar"));
    }
    @Override
    protected void onDestroy() {
    	super.onStop();
    	Intent intent = new Intent(this,PlayService.class);
    	stopService(intent);
    	PlayService.isrunning = false;
    	this.unregisterReceiver(receiver);
    	super.onDestroy();
    }
    //是否正在进行拖放(没设置这个的话,在拖放的过程中会出现点小小不爽的效果,自己可以测试下)
    boolean seekbarTrackTouch = false;
    //SeekBar拖放事件处理了
    class SeekBarListener implements OnSeekBarChangeListener{
		public void onProgressChanged(SeekBar seekBar, int progress,
				boolean fromUser) {
			
		}
		public void onStartTrackingTouch(SeekBar seekBar) {
			seekbarTrackTouch = true;
		}
		public void onStopTrackingTouch(SeekBar seekBar) {
			seekbarTrackTouch = false;
			int currentPosition = seekBar.getProgress();
			Intent intent = new Intent("org.hwq.music.seekbar.seekto");
			intent.putExtra("currentPosition", currentPosition);
			sendBroadcast(intent);
		}
    }
	public void onClick(View v) {
		switch(v.getId()){
		case R.id.previous:
			playPrevious();
			break;
		case R.id.play:
			play();
			break;
		case R.id.next:
			playNext();
			break;
		}
	}
	private void playNext() {
		
	}
	private void play() {
		System.out.println("play()被点击");
		Intent intent = new Intent(this,PlayService.class);
		intent.putExtra("op", "play");
		startService(intent);
	}
	private void playPrevious() {
		
	}
	class SeekBarReceiver extends BroadcastReceiver{
		@Override
		public void onReceive(Context context, Intent intent) {
			int currentPosition = intent.getIntExtra("currentPosition", 0);
			int duration = intent.getIntExtra("duration", 0);
			System.out.println("activity收到一个广播:currentPosition="+currentPosition+" duration="+duration);
			if(!seekbarTrackTouch){
				seekbar.setProgress(currentPosition*100/duration);
				seekbar.invalidate();
			}
		}
	}
}


播放service,播放过程中通过发出广播,影响前台的SeekBar的播放进度。并接收前台SeekBar的拖放事件广播,调整音乐播放进度。
PlayService.java
package org.hwq.music.seekbar;

import java.util.List;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;

public class PlayService extends Service implements Runnable {
	private MediaPlayer player;
	private List<Music> musicList;
	private SeekbarReceiver receiver ;
	public static boolean isrunning = true;

	@Override
	public void onCreate() {
		player = new MediaPlayer();
		musicList = MusicList.getMusicData(this);
		new Thread(this).start();
		receiver = new SeekbarReceiver();
		registerReceiver(receiver, new IntentFilter("org.hwq.music.seekbar.seekto"));
	}
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	
	@Override
	public void onDestroy() {
		if(player != null){
			player.release();
			player = null;
		}
		unregisterReceiver(receiver);
		super.onDestroy();
	}

	@Override
	public void onStart(Intent intent, int startId) {
		Bundle extras = intent.getExtras();
		String op = extras.getString("op");
		if("play".equals(op)){
			play();
		}
	}

	private void play() {
		System.out.println("service中的play执行");
		Music m = musicList.get(0);
		Uri uri = Uri.parse(m.getUrl());
		try{
			player.setDataSource(this,uri);
			player.prepare();
			player.start();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void run() {
		while(isrunning){
			try{
				Thread.sleep(100);
			}catch (Exception e) {
				
			}
			if(player!=null){
				int currentPosition = player.getCurrentPosition();
				int duration = player.getDuration();
				Intent intent = new Intent("org.hwq.receiver.seekbar");
				intent.putExtra("currentPosition", currentPosition);
				intent.putExtra("duration", duration);
				System.out.println("发出一个广播:currentPosition="+currentPosition);
				sendBroadcast(intent);
			}
		}
	}
	//接收前台拖放的进度,并调整歌曲的播放进度
	class SeekbarReceiver extends BroadcastReceiver{
		public void onReceive(Context context, Intent intent) {
			int currentPosition = intent.getIntExtra("currentPosition", 0);
			System.out.println("seekbar拖放了currentPosition="+currentPosition);
			player.seekTo(player.getDuration()*currentPosition/100);
			player.start();
		}
	}
}


大致就讲完。这里想起一个网上看到的题目,没有activity,能否启动一个运用。答案是可以的:首先,我们得添加权限<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>  ,然后注册一个receiver侦听<action android:name="android.intent.action.BOOT_COMPLETED" />,并在receiver来启动一个service或一个activity就ok了。

下面是这个demo:
  • 大小: 9.1 KB
分享到:
评论
3 楼 czbnlzd920706 2012-07-27  
Acitivity中   44行          stopService(intent);   要删掉,否则不能实现后台播放。


Service中    48-51行         String op = extras.getString("op"); 
                            if("play".equals(op)){ 
                            play(); 
                            } 
请教有什么作用?我发现貌似还是个空指针,删掉了反而可以使软件运行顺畅。
发现这两个问题。
多谢你的源码了!
2 楼 czbnlzd920706 2012-07-27  
有一个问题,当你按退出键后,Service也被关掉了,实现不了后台播放。
1 楼 czbnlzd920706 2012-07-27  
好东西!!万分感谢!!!

相关推荐

    Android Studio音乐播放器简单例子

    在Android平台上,开发一款音乐播放器是一个常见的任务,Android Studio作为官方推荐的集成开发环境,提供了丰富的工具和库来帮助开发者实现这样的应用。本项目是一个简单的音乐播放器示例,适用于Android 6.0(API...

    Android应用源码安卓乐迹音乐播放器项目

    作为本周的第三个音乐播放器项目,与上一个Android应用源码和讯音乐播放器培训项目在界面上有几番神似,但是细看源码就会发现两个确实没有什么联系,本项目可以完美运行,可以使用进度条拖放控制音乐进度。...

    Android应用源码安卓win8风格音乐播放器

    本源码一款win8风格的入门级安卓音乐播放器项目源码,所有的界面都把通知栏隐藏掉了。点击歌曲列表会扫描sd歌曲,所以需要sd卡支持。实现了一些歌曲播放的基本功能。例如暂停、继续、拖放进度等。歌词功能还没有完善...

    Android studio小游戏

    Android提供了MediaPlayer和SoundPool类来播放背景音乐和音效。 7. **存储与持久化**:游戏进度、用户设置等数据需要保存,Android提供了SharedPreferences、SQLite数据库等机制进行数据存储。 8. **游戏测试**:...

    Axure手机例子和手机插件

    通过这些文件,用户可以研究和学习如何在Axure中构建符合Android风格的音乐播放器,了解如何利用自定义库提高工作效率,同时也可以借鉴设计思路和交互逻辑,以实现更贴近真实应用的原型。 在实际操作中,设计师需要...

    FFmpeg打造Android万能音频播放器

    - UI设计:创建用户友好的界面,显示播放进度、音量控制等信息。 - 功能扩展:支持文件拖放、播放列表、音效调节等高级功能。 以上就是基于FFmpeg和OpenSL ES在Android上打造万能音频播放器的主要知识点和流程。...

    delphi 系统开发综合媒体播放器

    3. 时间显示:实时更新播放进度,如TLabel或TMemo控件显示当前时间和总时间。 4. 音量控制:通过滑块或旋钮控件调整音量。 5. 播放列表:可以管理多个媒体文件,实现连续播放。 四、图形用户界面(GUI)设计 Delphi...

    ANDROID下的拼图源码

    7. **多媒体支持**: 如果游戏包含音效或背景音乐,那么需要利用Android的MediaPlayer或SoundPool类来播放音频资源。 8. **测试与优化**: 开发者需要进行单元测试、集成测试以及性能测试,确保游戏在各种设备和...

    testQtUI.rar

    6. **音乐界面**:音乐播放器的界面设计通常需要考虑音量控制、播放列表、歌曲选择和播放进度等功能。这些界面实例可能展示了如何在Qt中实现这些功能,以及如何打造视觉上吸引人的音乐播放界面。 通过学习和参考...

    Android 英语单词记忆程序源码

    在技术实现上,这个程序源码可能涉及到Android的生命周期管理、意图(Intent)的使用、通知(Notification)服务、多媒体处理(如音频播放)、SQLite数据库操作、XML布局设计等多个关键知识点。对于想要提升Android开发...

    Android 4 高级编程(Pro Android 4)英文文字版

    - 提供了使用Android媒体框架播放和录制音频和视频的方法。 25. 主屏幕小工具(Chapter 25): - 讲解了如何创建和部署主屏幕小工具。 26. 探索列表小工具(Chapter 26): - 阐述了列表小工具的使用和定制,...

    【国开搜题】国家开放大学 一网一平台 Android核心开发技术15 期末考试押题试卷.docx

    - **知识点:** 使用`SeekBar`控件来实现音乐播放器中的播放进度控制。 - **解释:** `SeekBar`是一种滑动条控件,非常适合用来表示进度或者让用户进行范围选择。在音乐播放器中,它可以用来显示当前播放位置,并允许...

    Android 4.0开发教程 Apress

    第九章讲述了在Android应用中如何创建和使用对话框,包括警告对话框、进度对话框和自定义对话框等。 10. 操作栏(ActionBar)的探索 第十章将引导开发者探索ActionBar,这是Android应用中的一个重要UI元素,用于...

    android 拼图游戏

    总的来说,开发Android拼图游戏涉及Android的基础知识,包括UI设计、图像处理、触摸事件处理、动画效果、数据存储以及游戏逻辑等。通过实践,不仅可以提升编程技能,还能锻炼解决问题的能力,为开发更多类型的移动...

    Android 2.0游戏开发实战宝典.实战篇.10-12章源代码

    Android提供MediaPlayer和SoundPool类来播放背景音乐和音效。理解如何同步音频与游戏事件,以及如何优化音频资源以减少内存消耗,是提高游戏体验的重要方面。 5. **游戏性能优化**:在Android 2.0环境下,开发者...

    简谱写普的一个小工具

    《简谱写普的小工具》是一款专为音乐爱好者和作曲者设计的应用,旨在简化简谱的创作和编辑过程。简谱,又称五线谱的简易记谱法,是中国广泛使用的音乐记谱方式,尤其适用于初学者和业余爱好者。这款小工具的出现,...

    可拖拽Item的ListView

    这种功能提升了用户体验,尤其是在管理列表数据时,比如任务列表、音乐播放列表等。实现这样的功能需要对Android的UI组件、触摸事件处理以及自定义Adapter有深入的理解。 首先,`ListView`是Android中一个非常基础...

    E4A实例打地鼠

    1. **界面设计**:E4A提供了一套可视化布局工具,允许开发者拖放控件来创建用户界面。在“打地鼠”游戏中,可能包括游戏主界面、计分板、开始按钮、暂停/继续按钮等元素。 2. **事件处理**:E4A中的事件驱动编程是...

    人物拼图游戏高级版_人物拼图_游戏_源码.zip

    7. **音效管理**:游戏中的背景音乐和音效增强了游戏氛围,需要合理的音效管理系统,控制音量、播放和暂停等操作。 8. **性能优化**:为了确保游戏在不同设备上运行流畅,开发者需要对代码进行性能优化,减少内存...

Global site tag (gtag.js) - Google Analytics