android实现图片闪烁动画效果的两种实现方式(实用性高)
大家在使用app的时候,有的app在点击语音搜索界面后,会出现一个小话筒,小话筒会类似雷达似得在闪烁,表示正在倾听你说话的内容(这个大家可以参照微软的必应app),那么问题来了,这种动画效果是如何实现的呢?其实实现这种动画效果有很多种方法,最常见的是两种:第一种就是插入n张图片进行切换已达到如此目的,第二种就是通过改变一张图片的透明度来达到闪烁的效果。下面就分别讲一下通过这两种方法如何实现。
第一种:通过n张图片之间切换实现动画效果
这种方法的原理很简单,利用handler的延时机制在子线程中完成图片切换,再在主线程展示。
1、首先我们要先写一个线程池,在使用的时候方便调用。
package com.jereh.musicapplication.threadpool; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.scheduledexecutorservice; /** * created by zhangdi on 2016/9/1. * 这是一个线程池的工具类,在用到线程的时候可以直接类名加方法名使用 */ public class threadpoolmanager { /** 线程执行器 **/ private static executorservice executorservice = null; /** 固定5个线程 **/ private static int nthreads = 5; /** 单例 **/ private static threadpoolmanager taskexecutorpool = null; /** 初始化线程池 **/ static { taskexecutorpool = new threadpoolmanager(nthreads * getnumcores()); } /** 构造函数 **/ private threadpoolmanager(int threads) { //executorservice = executors.newfixedthreadpool(threads); executorservice = executors.newscheduledthreadpool(threads); } /** * 取得单例 * * @return */ public static threadpoolmanager getinstance() { return taskexecutorpool; } /** * 取得线程执行器 * * @return */ public executorservice getexecutorservice() { return executorservice; } /** * 取得周期性线程执行器 * @return */ public scheduledexecutorservice getscheduledexcutorservice(){ return (scheduledexecutorservice)executorservice; } /** * 获得手机cup个数 * @return */ public static int getnumcores() { int threadcount = runtime.getruntime().availableprocessors(); return threadcount; } }
2、下一步就是在xml文件中插入一个布局
<framelayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fl"/>
3、然后就是在java代码中编辑切换图片了:
package com.jereh.musicapplication; import android.graphics.drawable.drawable; import android.os.message; import android.support.v7.app.appcompatactivity; import android.os.bundle; import android.widget.framelayout; import com.jereh.musicapplication.threadpool.threadpoolmanager; import java.util.timer; import java.util.timertask; import java.util.concurrent.timeunit; public class frameactivity extends appcompatactivity { private timer timer; framelayout framelayout; drawable drawable; android.os.handler handler = new android.os.handler(){ int i = 0; @override public void handlemessage(message msg) { if (msg.what==1){ i++; move(i%4); } super.handlemessage(msg); } }; void move(int i){ drawable = getresources().getdrawable(r.mipmap.ic_launcher,null); drawable drawable1 = getresources().getdrawable(r.mipmap.dd1,null); drawable drawable2 = getresources().getdrawable(r.mipmap.dd2,null); drawable drawable3 = getresources().getdrawable(r.mipmap.dd3,null); switch (i){ case 0: framelayout.setforeground(drawable); break; case 1: framelayout.setforeground(drawable1); break; case 2: framelayout.setforeground(drawable2); break; case 3: framelayout.setforeground(drawable3); break; } } @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_frame); framelayout = (framelayout)findviewbyid(r.id.fl); timer = new timer(); // timer.schedule(new timertask() { // @override // public void run() { // handler.sendemptymessage(1); // } // },0,500);//第二个参数是隔多少秒之后开始显示,第三个是隔多久显示下一个 threadpoolmanager .getinstance() .getscheduledexcutorservice() .scheduleatfixedrate(new runnable() { @override public void run() { handler.sendemptymessage(1); } },0,500, timeunit.milliseconds);//第二个参数是隔多少秒之后开始显示,第三个是隔多久显示下一个 } @override protected void ondestroy() { timer.cancel(); super.ondestroy(); } }
这里我写了两种方式,第一种是用timer类来实现,后来发现使用自定义的线程池更好,大家如果不想在定义一个线程池的话,可以直接使用timer类来实现同样的效果,至此使用第一种级n张图片切换实现动画效果的代码就完成了。这种方式有一个弊端就是得需要n张图片,那么要是只有单张图片又该怎么办呢,那么就可以使用下面这种方法了。
第二种:通过改变图片透明度实现动画效果
1、首先我们先封装两个动画方法,第一个是从不透明到完全透明,第二个是完全透明到不透明
/** * 透明效果 * @return */ public animation getalphaanimationin() { //实例化 alphaanimation 主要是改变透明度 //透明度 从 1-不透明 0-完全透明 animation animation = new alphaanimation(1.0f, 0); //设置动画插值器 被用来修饰动画效果,定义动画的变化率 animation.setinterpolator(new decelerateinterpolator()); //设置动画执行时间 animation.setduration(2000); return animation; } public animation getalphaanimationout() { //实例化 alphaanimation 主要是改变透明度 //透明度 从 1-不透明 0-完全透明 animation animation = new alphaanimation(0, 1.0f); //设置动画插值器 被用来修饰动画效果,定义动画的变化率 animation.setinterpolator(new decelerateinterpolator()); //设置动画执行时间 animation.setduration(2000); return animation; }
2、分别给这两个方法设置监听,即第一个动画完成立刻执行第二个动画,第二个动画完成在立刻执行第一个动画以实现动画循环播放的效果
voicestate1.setanimation(animationin); voicestate1.setanimation(animationout); /** * 监听动画实现动画间的切换 */ animationout.setanimationlistener(new animation.animationlistener() { @override public void onanimationstart(animation animation) { } @override public void onanimationend(animation animation) { voicestate1.startanimation(animationin); } @override public void onanimationrepeat(animation animation) { } }); animationin.setanimationlistener(new animation.animationlistener() { @override public void onanimationstart(animation animation) { } @override public void onanimationend(animation animation) { voicestate1.startanimation(animationout); } @override public void onanimationrepeat(animation animation) { } });
至此使用一张图片通过改变其透明度实现闪烁效果就完成了。
以上所述是小编给大家介绍的android实现图片闪烁动画效果的两种实现方式(实用性高),希望对大家有所帮助
上一篇: java中的final关键字详解及实例
下一篇: Android自定义控件之基本原理(一)