android----极其简易的音乐播放器(service的使用)

来源:互联网 发布:unity3d场景 编辑:程序博客网 时间:2024/04/29 10:49

俱乐部的作业已经拖了一周了,实在不好意思再不弄了。。。前天晚上开了个头,总是因为资源太大运行不了,导致一直没法继续编下去。。今天偶然发现居然删掉了之前工程里的音乐资源就又能加进去一个音乐了~为了避免再次运行不了,我就加了两个音乐,来回切换,也算能够完成基本要求啦~表示资源太大光等待它安装就要好久好久。。。人生真的是一个漫长的等待过程啊。。。下面说一说遇到的问题吧~

1、首先的工作就是PS了。。表示自从学了点PS之后,似乎就有了强迫症。。。不管程序编的怎么样。。。界面可绝对不能丑。。不然看着太没有心情了。。。女生的通病吧。。。刚开始做的是横屏的~因为漂亮的图图都是横的~但是后来就有问题了。。音乐列表显然是竖的好看些,不能让用户横着看个开始画面再把屏幕竖过来吧。。于是只好舍弃刚开始的PS成果。。把它转成竖的。。图如下:

转换前:



转化后:



还算不错吧~当时想把横图变成竖图想了各种办法。。在网上各种搜。。还好背景颜色比较单一。。我截了一点上面的云复制之后,契合性特别的差。。搜了合并图的方法也都不满意。。最终万般悲痛之际。。我们的午昊大神现身了~!听了我的问题。。用了一秒钟的时间。。他。。搞定了。。让我极其之惭愧啊。。找资料就找了那么久。。居然人家这么快就搞定了。。总结一句:找资料不如找午昊。。嘿嘿~他用的方法很简单,选中上面的一块拉伸(ctrl+T)就OK了~ orz....

2、然后我就想给背景加个进入的动画(Question time~!)~但是查了资料也不知道怎么加。。毕竟我背景是在xml中配置的,也没有这个对象,是在无从下手。。最终直接把背景弄成ImageView了~说到这个ImaginView啊。。我还是挺喜欢的~刚开始播放什么的按键用的是ImageButton,但是layout_width之类的属性调整的是Button的大小,那个图就是本来的大小了。。巨大无比啊有木有!都不完整。。后来我就改成ImageView了。。不过按的时候就没有橙色的反馈了。。所以还是想知道怎么调整ImageButton里面的图片的大小啊。。(Quesion time again~!)我上次使用PS直接把图弄小了。。好低端。。。

3、Intent的问题。。由于把初始画面弄了一个Imageview并且是由透明淡出的效果,之后想直接切换到第二个Activity,但是我直接在动画效果之后写了startIntent就会初始画面就是第二个Activity。。(Qustion time...)不知道怎么回事。。我就给ImageView加了onClick事件。。

4、后来在播放音乐的时候,我希望一个图片能够始终是摆动的动态效果。。(Q..)但是在anim里面的xml文件中写动画效果就不知道怎么写了。。rotate只能设置初始和结束的角度,我想设置两个rotate交替进行也不行。。后来就让旋转一圈好了。。效果都差不多。。但是着实不知道如何摆动啊。。。

5、每次运行都要把之前的那个程序删掉啊有木有!自己手机内存本来就小模拟器也这么坑爹啊!我还要每次删除一下才能再次运行啊!表示每次编程光搞这种非重点(等待模拟器之类。。)就要占用大部分时间。。好浪费时间啊。。。

6、后来播放的时候不能暂停,用log日志输出了一堆信息也确实调用pause了。。在那搞了半天。。结果是因为我每次点击按钮都会调用这个service的onStart,也就会在Create一次。。就会出错了。。所以设置了一个标志变量,只有第一次获得资源的时候才Create,暂停再播放之类的就不再调用create了。。。


说完问题。。我再说一下这次的思路吧。。首先是一个很简单的进入页面,加入了动画效果,只有一个ImageView,点击的时候进入音乐的列表ListView可以选择播放哪首歌曲。。根据选择的id不同,向intent中putextra不同的键值对,然后传给播放音乐的那个activity。。在音乐播放的activity里面根据intent传过来的值,采用不同的布局,其实就是歌手的图片不同。。然后在得到这个intent并往里面putextra点了哪个按钮(播放还是暂停之类的。。)的信息,传给service。。service判断之后在调用不同的方法对mediaplayer的对象进行操作。。。同时intent中还有listview中传过来的歌手的信息(从第一个intent里面获取的。。本来想就用之前的那个intent但是不行。。那个就是从listview到播放的界面传递的intent,还不让我继续用唉。。),就能获取是哪个音乐资源了。。。


下面上图和代码~~布局文件的代码就不传了。。那个listview其实还是有点麻烦的。。还要给它写一个布局。。显示出来会比较好看~~









动态效果实在截不出来。。也就是旋转一圈。。没什么好看的。。截了个过程中的。。。




贴一个播放列表那个activity和service的代码吧~~这两个比较关键~~

package com.MusicPlayer;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.ImageView;public class MusicPlay extends Activity {private Animation anim;private ImageView pic;private ImageView last;private ImageView next;private ImageView pause;private ImageView play;private ImageView stop;private Intent intent = new Intent();private OnClickListener playListener = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubintent.putExtra("choice", "play");intent.setClass(MusicPlay.this, MusicService.class);startService(intent);}};private OnClickListener pauseListener = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubintent.putExtra("choice", "pause");intent.setClass(MusicPlay.this, MusicService.class);startService(intent);}};private OnClickListener stopListener = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubintent.putExtra("choice", "stop");intent.setClass(MusicPlay.this, MusicService.class);startService(intent);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);Intent oldIntent = getIntent();String singer = oldIntent.getStringExtra("name");if(singer.equals("taylor")){setContentView(R.layout.taylor);pic = (ImageView) findViewById(R.id.taylor);intent.putExtra("singer", "taylor");}else if(singer.equals("dingdang")){setContentView(R.layout.dingdang);pic = (ImageView) findViewById(R.id.dingdang);intent.putExtra("singer", "dingdang");} anim = AnimationUtils.loadAnimation(this, R.anim.picture); pic.startAnimation(anim); last = (ImageView) findViewById(R.id.last); next = (ImageView)findViewById(R.id.next); pause = (ImageView)findViewById(R.id.pause); stop = (ImageView)findViewById(R.id.stop); play = (ImageView)findViewById(R.id.play); play.setOnClickListener(playListener); pause.setOnClickListener(pauseListener); stop.setOnClickListener(stopListener);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// TODO Auto-generated method stubmenu.add("退出");return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stubif(item.getItemId()==0){stopService(intent);finish();}return super.onOptionsItemSelected(item);}}

package com.MusicPlayer;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.os.IBinder;import android.util.Log;public class MusicService extends Service {boolean flag = true;private MediaPlayer player;@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubLog.v("tag", "on bind");return null;}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();Log.v("tag", "on create");}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();Log.v("tag", "on destroy");}@Overridepublic void onStart(Intent intent, int startId) {// TODO Auto-generated method stubsuper.onStart(intent, startId);Log.v("tag", "on start");String choice = intent.getStringExtra("choice");String singer = intent.getStringExtra("singer");Log.v("choice", choice);if(singer.equals("taylor")&&flag){Log.v("tag", "taylor");player = MediaPlayer.create(this, R.raw.jumpthenfall);flag = false;}else if(singer.equals("dingdang")&&flag){Log.v("tag", "dingdang");player = MediaPlayer.create(this, R.raw.caibutou);flag = false;}if(choice.equals("play")){player.start();}else if(choice.equals("pause")){Log.v("tag", "pause");player.pause();}else if(choice.equals("stop")){Log.v("tag", "choice");player.stop();player.release();flag = true;}}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// TODO Auto-generated method stubLog.v("tag", "on start command");return super.onStartCommand(intent, flags, startId);}}

最后。。表示。。我没有弄歌曲间的切换。。就放上去了两首。。不想弄了。。其实就是给按钮增加监听事件的时候在intent里面传一个标记就行,或者刚开始从listview那个activity传的时候就传id的值,next,last就获取id的值之后++或者--,再传给service就行了~就是传来传去的。。现在好困想睡觉了。。感觉这些做的小东西会了就好~就是学点不同的东西嘛~没必要再做体力活了~以后开发项目有的是体力活啊~~洗漱去啦~\(≧▽≦)/~~~

原创粉丝点击