- 浏览: 75196 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wangkuichina:
此event坐标单位是什么呢?
android view的触摸事件坐标 -
coolismonster:
正好用得到 谢谢分享
android文件夹管理器 -
shim:
HashMap不是线程安全的,这么搞有风险
Gallery异步加载图片 -
Lifehopeness:
谢谢分享
android自定义带多选框的listview并避免出现自动选中另外选项 -
czbnlzd920706:
Acitivity中 44行 stopS ...
android音乐播放器拖放播放进度设计
android音乐播放器拖放播放进度设计
效果图:
播放器设计中需要显示播放进度,并随着播放的进行,进度条要走动。当我们直接拖放播放进度条,也能调整播放进度。这里我们使用了SeekBar来完成这个任务。
下面直接上代码:
界面布局不多说
main.xml
在前台的界面,只设置了播放操作,可以看到点击播放后,我们启动了service播放音乐,这里我们要注意看到SeekBarReceiver这个。我们是通过接收受service发过来的广播,并调整进度条的。还有这个SeekBarListener,我们通过它设置了SeekBar的拖放操作
MusicseekbarActivity.java
播放service,播放过程中通过发出广播,影响前台的SeekBar的播放进度。并接收前台SeekBar的拖放事件广播,调整音乐播放进度。
PlayService.java
大致就讲完。这里想起一个网上看到的题目,没有activity,能否启动一个运用。答案是可以的:首先,我们得添加权限<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> ,然后注册一个receiver侦听<action android:name="android.intent.action.BOOT_COMPLETED" />,并在receiver来启动一个service或一个activity就ok了。
下面是这个demo:
效果图:
播放器设计中需要显示播放进度,并随着播放的进行,进度条要走动。当我们直接拖放播放进度条,也能调整播放进度。这里我们使用了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:
评论
3 楼
czbnlzd920706
2012-07-27
Acitivity中 44行 stopService(intent); 要删掉,否则不能实现后台播放。
Service中 48-51行 String op = extras.getString("op");
if("play".equals(op)){
play();
}
请教有什么作用?我发现貌似还是个空指针,删掉了反而可以使软件运行顺畅。
发现这两个问题。
多谢你的源码了!
Service中 48-51行 String op = extras.getString("op");
if("play".equals(op)){
play();
}
请教有什么作用?我发现貌似还是个空指针,删掉了反而可以使软件运行顺畅。
发现这两个问题。
多谢你的源码了!
2 楼
czbnlzd920706
2012-07-27
有一个问题,当你按退出键后,Service也被关掉了,实现不了后台播放。
1 楼
czbnlzd920706
2012-07-27
好东西!!万分感谢!!!
发表评论
-
DrawLayout几个注意点
2014-03-08 22:55 1467package com.example.navigationd ... -
layout_weight解惑
2014-02-20 13:25 0http://www.chess-ix.com/blog/th ... -
LayoutInflater注意事项
2014-02-20 10:52 0http://www.doubleencore.com/201 ... -
混淆掉Log.i输出
2013-12-26 15:42 0混淆配置文件加入 -assumenosideeffects c ... -
android TextView字体大小对应
2013-11-30 16:36 739设备信息:小米1 density=1.5, width=480 ... -
PopupWindow使用注意3点
2013-10-18 19:32 534使用PopupWindow注意点: ...... View v ... -
android 数据库同步
2013-10-14 13:35 1321package org.jerry; import or ... -
android singleTask几个注意点
2013-07-06 11:42 854android官网地址:http://developer.an ... -
转:WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口的方法
2013-05-02 00:59 976文章原址:http://www.jcodecraeer.com ... -
Android onTouchEvent, onClick及onLongClick的调用机制
2013-04-28 02:21 0http://blog.csdn.net/ddna/artic ... -
Touch一些东西
2013-04-28 02:03 0package com.example.touchdemo; ... -
电话状态变化
2013-04-27 23:39 1840电话拨出,随后挂断 04- ... -
Toast重复利用
2013-04-26 00:10 1175package com.example.toastdemo; ... -
dp sp与px的相互转化
2013-04-23 01:19 0TextView.java /** * ... -
Android手机分辨率基础知识(DPI,DIP计算)
2013-04-22 22:57 0原文地址:http://blog.csdn.net/morui ... -
9.png NinePatchDrawable
2013-04-17 00:27 0地址: docs/tools/help/draw9patch. ... -
BaseAdapter
2013-04-16 09:43 0http://blog.csdn.net/pkxiuluo01 ... -
Android Intent的几种用法全面总结
2013-04-11 01:21 0Intent应该算是Android中特有的东西。你可以在Int ... -
Android中的Intent详细讲解
2013-04-11 01:18 0在一个Android应用中,主要是由四种组件组成的,这四种组件 ... -
PopupWindow
2013-04-26 00:11 1275PopupWindow,实质是使用WindowManager添 ...
相关推荐
在Android平台上,开发一款音乐播放器是一个常见的任务,Android Studio作为官方推荐的集成开发环境,提供了丰富的工具和库来帮助开发者实现这样的应用。本项目是一个简单的音乐播放器示例,适用于Android 6.0(API...
作为本周的第三个音乐播放器项目,与上一个Android应用源码和讯音乐播放器培训项目在界面上有几番神似,但是细看源码就会发现两个确实没有什么联系,本项目可以完美运行,可以使用进度条拖放控制音乐进度。...
本源码一款win8风格的入门级安卓音乐播放器项目源码,所有的界面都把通知栏隐藏掉了。点击歌曲列表会扫描sd歌曲,所以需要sd卡支持。实现了一些歌曲播放的基本功能。例如暂停、继续、拖放进度等。歌词功能还没有完善...
Android提供了MediaPlayer和SoundPool类来播放背景音乐和音效。 7. **存储与持久化**:游戏进度、用户设置等数据需要保存,Android提供了SharedPreferences、SQLite数据库等机制进行数据存储。 8. **游戏测试**:...
通过这些文件,用户可以研究和学习如何在Axure中构建符合Android风格的音乐播放器,了解如何利用自定义库提高工作效率,同时也可以借鉴设计思路和交互逻辑,以实现更贴近真实应用的原型。 在实际操作中,设计师需要...
- UI设计:创建用户友好的界面,显示播放进度、音量控制等信息。 - 功能扩展:支持文件拖放、播放列表、音效调节等高级功能。 以上就是基于FFmpeg和OpenSL ES在Android上打造万能音频播放器的主要知识点和流程。...
3. 时间显示:实时更新播放进度,如TLabel或TMemo控件显示当前时间和总时间。 4. 音量控制:通过滑块或旋钮控件调整音量。 5. 播放列表:可以管理多个媒体文件,实现连续播放。 四、图形用户界面(GUI)设计 Delphi...
7. **多媒体支持**: 如果游戏包含音效或背景音乐,那么需要利用Android的MediaPlayer或SoundPool类来播放音频资源。 8. **测试与优化**: 开发者需要进行单元测试、集成测试以及性能测试,确保游戏在各种设备和...
6. **音乐界面**:音乐播放器的界面设计通常需要考虑音量控制、播放列表、歌曲选择和播放进度等功能。这些界面实例可能展示了如何在Qt中实现这些功能,以及如何打造视觉上吸引人的音乐播放界面。 通过学习和参考...
在技术实现上,这个程序源码可能涉及到Android的生命周期管理、意图(Intent)的使用、通知(Notification)服务、多媒体处理(如音频播放)、SQLite数据库操作、XML布局设计等多个关键知识点。对于想要提升Android开发...
- 提供了使用Android媒体框架播放和录制音频和视频的方法。 25. 主屏幕小工具(Chapter 25): - 讲解了如何创建和部署主屏幕小工具。 26. 探索列表小工具(Chapter 26): - 阐述了列表小工具的使用和定制,...
- **知识点:** 使用`SeekBar`控件来实现音乐播放器中的播放进度控制。 - **解释:** `SeekBar`是一种滑动条控件,非常适合用来表示进度或者让用户进行范围选择。在音乐播放器中,它可以用来显示当前播放位置,并允许...
第九章讲述了在Android应用中如何创建和使用对话框,包括警告对话框、进度对话框和自定义对话框等。 10. 操作栏(ActionBar)的探索 第十章将引导开发者探索ActionBar,这是Android应用中的一个重要UI元素,用于...
总的来说,开发Android拼图游戏涉及Android的基础知识,包括UI设计、图像处理、触摸事件处理、动画效果、数据存储以及游戏逻辑等。通过实践,不仅可以提升编程技能,还能锻炼解决问题的能力,为开发更多类型的移动...
Android提供MediaPlayer和SoundPool类来播放背景音乐和音效。理解如何同步音频与游戏事件,以及如何优化音频资源以减少内存消耗,是提高游戏体验的重要方面。 5. **游戏性能优化**:在Android 2.0环境下,开发者...
《简谱写普的小工具》是一款专为音乐爱好者和作曲者设计的应用,旨在简化简谱的创作和编辑过程。简谱,又称五线谱的简易记谱法,是中国广泛使用的音乐记谱方式,尤其适用于初学者和业余爱好者。这款小工具的出现,...
这种功能提升了用户体验,尤其是在管理列表数据时,比如任务列表、音乐播放列表等。实现这样的功能需要对Android的UI组件、触摸事件处理以及自定义Adapter有深入的理解。 首先,`ListView`是Android中一个非常基础...
1. **界面设计**:E4A提供了一套可视化布局工具,允许开发者拖放控件来创建用户界面。在“打地鼠”游戏中,可能包括游戏主界面、计分板、开始按钮、暂停/继续按钮等元素。 2. **事件处理**:E4A中的事件驱动编程是...
7. **音效管理**:游戏中的背景音乐和音效增强了游戏氛围,需要合理的音效管理系统,控制音量、播放和暂停等操作。 8. **性能优化**:为了确保游戏在不同设备上运行流畅,开发者需要对代码进行性能优化,减少内存...