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
原创粉丝点击