文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-06-06 07:40

关注

大家在使用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;

public class ThreadPoolManager {

private static ExecutorService executorService = null;

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);
}

public static ThreadPoolManager getInstance() {
return taskExecutorPool;
}

public ExecutorService getExecutorService() {
return executorService;
}

public ScheduledExecutorService getScheduledExcutorService(){
return (ScheduledExecutorService)executorService;
}

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、首先我们先封装两个动画方法,第一个是从不透明到完全透明,第二个是完全透明到不透明



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

您可能感兴趣的文章:Android实现平铺图片效果android中图片翻页效果简单的实现方法Android实现图片轮播效果的两种方法Android图片特效:黑白特效、圆角效果、高斯模糊Android仿微信发朋友圈浏览图片效果Android仿微信图片点击全屏效果Android实现图片叠加效果的两种方法Android实现图片阴影效果的方法Android模糊处理实现图片毛玻璃效果Android编程单击图片实现切换效果的方法Android 轻松实现图片倒影效果实例代码Android编程实现图片平铺的方法分析


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯