热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

本文通过两种方法给大家讲解了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文件中插入一个布局


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实现图片闪烁动画效果的两种实现方式(实用性高),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


推荐阅读
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
author-avatar
越野之族_205
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有