Android----给Ta惊喜,带音乐的动态相册
来源:互联网 发布:人工蜂群算法流程图 编辑:程序博客网 时间:2024/05/10 07:22
哈喽~博主我好不容易摊上了两天假期,来跟大家分享一些比较有意思的小应用。
今天给大家带来的是带音乐的、自动滚动的相册。
这里先给大家贴上个Demo吧。工程有点大,只能用度盘了~~~~(>_<)~~~~
链接:http://pan.baidu.com/s/1qXNwhhq 密码:jvt3
好,接下来我们开始一同制作。这里用到的知识点有:
1.Service(服务,Android四大组件之一,用于跑一些不随Activity生、灭的程序,比如后台的一些功能:音乐播放、文件下载等)
2.回调(因为我们或多或少地需要在Service里操作Activity里的内容,所以要用到回调)
3.多线程(因为Android系统默认只有一个线程,那就是UI(主)线程,但我们让图片滚动显示的话,会需要一些延时效果,所以,我们要创建一个子线程,用于延时切换图片)。
话不多说了,开始吧!
我从GitHub上面找了一些动画效果,放在了我上面贴的Demo里的Effects文件夹中,将其复制到你们的工程里面就能直接用了。
还有,需要把这几句粘到你的Grandle:app文件的最后。添加一些工具。
dependencies { compile 'com.nineoldandroids:library:2.4.0' compile 'com.github.sd6352051.niftydialogeffects:niftydialogeffects:1.0.0@aar'}首先,我们要创建一个Activity(layout布局文件里只有一个ImageView控件即可),用来做切换图片。
public class PhotoMoveActivity extends AppCompatActivity implements PhotoMoveService.StopImg{ //创建一个ImageView用于关联布局文件中的控件 private ImageView show; //该布尔值变量用于判断点击事件,因为这里是点击屏幕就开始相片轮播,防止用户点击多次发生紊乱,这里限制一下 private Boolean click = false; //用于判断图片是否轮播 private Boolean run = true; //数组,存放的是图片 private int[] imgs = {R.mipmap.picture01,R.mipmap.picture02,R.mipmap.picture03,R.mipmap.picture04, R.mipmap.picture05,R.mipmap.picture06,R.mipmap.picture07,R.mipmap.picture08, R.mipmap.picture09,R.mipmap.picture12,R.mipmap.picture13,R.mipmap.picture14,R.mipmap.picture15}; //数组,存放的是各种动画效果 private Effectstype[] types={Effectstype.Fadein,Effectstype.Fall,Effectstype.Fliph,Effectstype.Flipv, Effectstype.Newspager,Effectstype.RotateBottom,Effectstype.RotateLeft,Effectstype.Shake, Effectstype.Sidefill,Effectstype.SlideBottom,Effectstype.Slideright,Effectstype.Slidetop,Effectstype.Slideleft, Effectstype.Slit}; //用于获取子线程传过来的值,并在UI线程做出响应 private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); start(msg.arg1,4000,msg.what); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_photo_move); show = (ImageView) findViewById(R.id.show); //监听屏幕中的ImageView控件被点击,开启服务,奏起音乐,并且调用子线程,开始轮播相册。 show.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (click){ return; } click = true; Intent intent = new Intent(PhotoMoveActivity.this,PhotoMoveService.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startService(intent); start(6,4000,6); PhotoMoveService.setMusicStop(PhotoMoveActivity.this); new Thread(new ImgNext()).start(); } }); } //实现Service中接口的方法,用来停止轮播。 @Override public void stop() { run = false; } //子线程,用于循环轮播相册,每次循环,将参数传给显示图片的方法。 public class ImgNext implements Runnable{ @Override public void run() { int i = -1; int which = -1; Message message; while (i<imgs.length&&run){ if (which == types.length-1){ which = -1; } if (i == imgs.length-1){ i = -1; } try { Thread.sleep(5000); message = new Message(); i++; which++; message.what = i; message.arg1 = which; handler.sendMessage(message); } catch (InterruptedException e) { e.printStackTrace(); } } if (!run){ message = new Message(); message.what = 10; message.arg1 = 0; handler.sendMessage(message); } } } //将图片放到ImageView,再给ImageView附加动画的方法 private void start(int which,int mDuration,int img) { show.setImageResource(imgs[img]); BaseEffects animator = types[which].getAnimator(); if (mDuration != -1) { animator.setDuration(Math.abs(mDuration)); } animator.start(show); }}
写一个Service文件,用来控制音乐的播放。并且在这里要创建一个接口,用于在Activity中的回调(停止切换图片)。
public class PhotoMoveService extends Service { public PhotoMoveService() { } private static StopImg stopImg; private MediaPlayer mediaPlayer; private Boolean aBoolean = false; @Override public void onCreate() { //创建音乐媒体播放器,音乐文件放到res/raw文件夹中。 mediaPlayer = MediaPlayer.create(this,R.raw.s); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { //开始播放音乐 mediaPlayer.start(); //监听音乐是否播放完毕,播放完了就运用回调停止Activity中的图片轮播。 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { stopImg.stop(); } }); return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onDestroy() { super.onDestroy(); } //获取Activity,将Service和Activity关联起来,为回调做准备。 public static void setMusicStop(Context context){ stopImg = (StopImg) context; } //实现一个接口,用于回调 public interface StopImg{ public void stop(); }}
效果如下(截图水平有待提高- -、还请见谅):
0 0
- Android----给Ta惊喜,带音乐的动态相册
- Android 简易音乐动态相册(多种动画)
- Google给我的“惊喜”
- 爱Ta就带ta加入温馨浪漫的情感故事!!
- android系统如何调用自带的相机相册
- Android带播放进度条的音乐播放器
- 使用android模拟器自带的音乐播放器播放音乐
- android自带音乐播放器删除音乐失败的问题
- 给学习C,JAVA,数据结构,数据库的一个惊喜
- 论Golang 给我惊喜的Go语言
- “灰头土脸”的机会往往更能带给人更多惊喜!
- 检测带人声的音乐
- 带进度条的播放音乐
- Android 调用系统相册(带裁剪)
- 一个带时间的相册页面(仿小米相册)
- 2014,给自己一个惊喜!
- android 实现音乐播放器 带 seekbar
- android 音乐播放器,带seekBar滑动
- 【IOS学习】NSString copy or not (strong)?
- 九度 OJ 1162 I Wanna Go Home
- 浅析MySQL中exists与in的使用
- POJ 2449 A*k短路
- JAVA基础6.45——继承概述(1)
- Android----给Ta惊喜,带音乐的动态相册
- 关于memset的注意事项
- Java类与对象(一)
- Java 求全排列的两种方式
- OTG线与普通USB线的区别
- PowerManager的用法分析
- Java类与对象(二)
- My Git Flow
- Mysql学习语句总结