欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android实现图片闪烁动画效果的两种实现方式(实用性高)

程序员文章站 2024-03-06 12:23:49
大家在使用app的时候,有的app在点击语音搜索界面后,会出现一个小话筒,小话筒会类似雷达似得在闪烁,表示正在倾听你说话的内容(这个大家可以参照微软的必应app),那么问题...

大家在使用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实现图片闪烁动画效果的两种实现方式(实用性高),希望对大家有所帮助