android实现图片闪烁动画效果的两种实现方式(实用性高)
大家在使用APP的时候,有的APP在点击语音搜索界面后,会出现一个小话筒,小话筒会类似雷达似得在闪烁,表示正在倾听你说话的内容(这个大家可以参照微软的必应APP),那么问题来了,这种动画效果是如何实现的呢?其实实现这种动画效果有很多种方法,最常见的是两种:第一种就是插入n张图片进行切换已达到如此目的,第二种就是通过改变一张图片的透明度来达到闪烁的效果。下面就分别讲一下通过这两种方法如何实现。
第一种:通过n张图片之间切换实现动画效果
这种方法的原理很简单,利用handler的延时机制在子线程中完成图片切换,再在主线程展示。
1、首先我们要先写一个线程池,在使用的时候方便调用。
packagecom.jereh.musicapplication.threadpool;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
importjava.util.concurrent.ScheduledExecutorService;
/**
*Createdbyzhangdion2016/9/1.
*这是一个线程池的工具类,在用到线程的时候可以直接类名加方法名使用
*/
publicclassThreadPoolManager{
/**线程执行器**/
privatestaticExecutorServiceexecutorService=null;
/**固定5个线程**/
privatestaticintnThreads=5;
/**单例**/
privatestaticThreadPoolManagertaskExecutorPool=null;
/**初始化线程池**/
static{
taskExecutorPool=newThreadPoolManager(nThreads*getNumCores());
}
/**构造函数**/
privateThreadPoolManager(intthreads){
//executorService=Executors.newFixedThreadPool(threads);
executorService=Executors.newScheduledThreadPool(threads);
}
/**
*取得单例
*
*@return
*/
publicstaticThreadPoolManagergetInstance(){
returntaskExecutorPool;
}
/**
*取得线程执行器
*
*@return
*/
publicExecutorServicegetExecutorService(){
returnexecutorService;
}
/**
*取得周期性线程执行器
*@return
*/
publicScheduledExecutorServicegetScheduledExcutorService(){
return(ScheduledExecutorService)executorService;
}
/**
*获得手机cup个数
*@return
*/
publicstaticintgetNumCores(){
intthreadCount=Runtime.getRuntime().availableProcessors();
returnthreadCount;
}
}
2、下一步就是在xml文件中插入一个布局
<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fl"/>
3、然后就是在java代码中编辑切换图片了:
packagecom.jereh.musicapplication;
importandroid.graphics.drawable.Drawable;
importandroid.os.Message;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.widget.FrameLayout;
importcom.jereh.musicapplication.threadpool.ThreadPoolManager;
importjava.util.Timer;
importjava.util.TimerTask;
importjava.util.concurrent.TimeUnit;
publicclassFrameActivityextendsAppCompatActivity{
privateTimertimer;
FrameLayoutframeLayout;
Drawabledrawable;
android.os.Handlerhandler=newandroid.os.Handler(){
inti=0;
@Override
publicvoidhandleMessage(Messagemsg){
if(msg.what==1){
i++;
move(i%4);
}
super.handleMessage(msg);
}
};
voidmove(inti){
drawable=getResources().getDrawable(R.mipmap.ic_launcher,null);
Drawabledrawable1=getResources().getDrawable(R.mipmap.dd1,null);
Drawabledrawable2=getResources().getDrawable(R.mipmap.dd2,null);
Drawabledrawable3=getResources().getDrawable(R.mipmap.dd3,null);
switch(i){
case0:
frameLayout.setForeground(drawable);
break;
case1:
frameLayout.setForeground(drawable1);
break;
case2:
frameLayout.setForeground(drawable2);
break;
case3:
frameLayout.setForeground(drawable3);
break;
}
}
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frame);
frameLayout=(FrameLayout)findViewById(R.id.fl);
timer=newTimer();
//timer.schedule(newTimerTask(){
//@Override
//publicvoidrun(){
//handler.sendEmptyMessage(1);
//}
//},0,500);//第二个参数是隔多少秒之后开始显示,第三个是隔多久显示下一个
ThreadPoolManager
.getInstance()
.getScheduledExcutorService()
.scheduleAtFixedRate(newRunnable(){
@Override
publicvoidrun(){
handler.sendEmptyMessage(1);
}
},0,500,TimeUnit.MILLISECONDS);//第二个参数是隔多少秒之后开始显示,第三个是隔多久显示下一个
}
@Override
protectedvoidonDestroy(){
timer.cancel();
super.onDestroy();
}
}
这里我写了两种方式,第一种是用Timer类来实现,后来发现使用自定义的线程池更好,大家如果不想在定义一个线程池的话,可以直接使用Timer类来实现同样的效果,至此使用第一种级n张图片切换实现动画效果的代码就完成了。这种方式有一个弊端就是得需要n张图片,那么要是只有单张图片又该怎么办呢,那么就可以使用下面这种方法了。
第二种:通过改变图片透明度实现动画效果
1、首先我们先封装两个动画方法,第一个是从不透明到完全透明,第二个是完全透明到不透明
/**
*透明效果
*@return
*/
publicAnimationgetAlphaAnimationIn(){
//实例化AlphaAnimation主要是改变透明度
//透明度从1-不透明0-完全透明
Animationanimation=newAlphaAnimation(1.0f,0);
//设置动画插值器被用来修饰动画效果,定义动画的变化率
animation.setInterpolator(newDecelerateInterpolator());
//设置动画执行时间
animation.setDuration(2000);
returnanimation;
}
publicAnimationgetAlphaAnimationOut(){
//实例化AlphaAnimation主要是改变透明度
//透明度从1-不透明0-完全透明
Animationanimation=newAlphaAnimation(0,1.0f);
//设置动画插值器被用来修饰动画效果,定义动画的变化率
animation.setInterpolator(newDecelerateInterpolator());
//设置动画执行时间
animation.setDuration(2000);
returnanimation;
}
2、分别给这两个方法设置监听,即第一个动画完成立刻执行第二个动画,第二个动画完成在立刻执行第一个动画以实现动画循环播放的效果
voiceState1.setAnimation(animationIn);
voiceState1.setAnimation(animationOut);
/**
*监听动画实现动画间的切换
*/
animationOut.setAnimationListener(newAnimation.AnimationListener(){
@Override
publicvoidonAnimationStart(Animationanimation){
}
@Override
publicvoidonAnimationEnd(Animationanimation){
voiceState1.startAnimation(animationIn);
}
@Override
publicvoidonAnimationRepeat(Animationanimation){
}
});
animationIn.setAnimationListener(newAnimation.AnimationListener(){
@Override
publicvoidonAnimationStart(Animationanimation){
}
@Override
publicvoidonAnimationEnd(Animationanimation){
voiceState1.startAnimation(animationOut);
}
@Override
publicvoidonAnimationRepeat(Animationanimation){
}
});
至此使用一张图片通过改变其透明度实现闪烁效果就完成了。
以上所述是小编给大家介绍的android实现图片闪烁动画效果的两种实现方式(实用性高),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!