每次想到循环播放、重复执行时,脑海中总是冒出在while(true)的实现方式。

Thread thread = new Thread(new Runnable(){
public void run(){
while(true){
// do animation operation
}
}
}).start();

但这种方式总给人一种不可靠的感觉。

为此,在这多记录几种实现方式,方便以后参考。

第一种:使用属性动画实现(ObjectAnimator)

Path path = new Path();
path.addOval(100, -500, 500, -100, Path.Direction.CW);
ObjectAnimator ivGreenObjectAnimator = ObjectAnimator.ofFloat(ivRed, View.TRANSLATION_X, View.TRANSLATION_Y, path); ivGreenObjectAnimator.setDuration(5000).setRepeatCount(ValueAnimator.INFINITE);
ivGreenObjectAnimator.setRepeatMode(ValueAnimator.RESTART);
ivGreenObjectAnimator.start();

效果:绿色小球沿着椭圆循环运动。

第二种:使用属性动画实现(ViewPropertyAnimator)

private void startAnimateByViewAnimationProperty() {
ViewPropertyAnimator ivGreenAnimate = ivGreen.animate();int[] positions = new int[]{600, 100, 100, 400};
ivGreenAnimate.translationX(400).setDuration(500).setListener(new ComplexAnimatorListener(ivGreen, positions));
} static class ComplexAnimatorListener implements Animator.AnimatorListener {
View view;
int[] positions;
int times = 0;
public ComplexAnimatorListener(View view, int[] positions) {
this.view = view;
this.positions = positions;
} @Override
public void onAnimationStart(Animator animation) { } @Override
public void onAnimationEnd(Animator animation) {
Log.v("qian", "repeat running!");
times++;
if (times % 4 == 1) {
view.animate().translationY(positions[0]).setDuration(500).setListener(this);
} else if (times % 4 == 2) {
view.animate().translationX(positions[1]).setDuration(500).setListener(this);
} else if (times % 4 == 3) {
view.animate().translationY(positions[2]).setDuration(500).setListener(this);
} else
view.animate().translationX(positions[3]).setDuration(500).setListener(this);
} @Override
public void onAnimationCancel(Animator animation) { } @Override
public void onAnimationRepeat(Animator animation) { }
}

效果:绿色小球沿着矩形循环运动。

第三种:使用一般动画实现(TranslateAnimation)

TranslateAnimation translateAnimation = new TranslateAnimation(-400, -100, -400, -100);
translateAnimation.setRepeatCount(Animation.INFINITE);
translateAnimation.setRepeatMode(Animation.REVERSE);
ivGreen.startAnimation(translateAnimation);

效果:小球沿着矩形循环运动。

第四种:使用handler及其callback递归调用实现

    Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.what==1){
startAnimation();
}
return false;
}
}); private void startAnimation(){
//do animation operation
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}

一次执行完又执行

第五种:使用handler及其runnable递归调用实现

Handler handler = new Handler();

Runnable runnable = new Runnable() {
@Override
public void run() {
ViewPropertyAnimator animate = binding.ivBlue.animate();
animate.translationXBy(-200).translationYBy(-200).scaleX(2.0f).scaleY(2.0f).
setInterpolator(new AccelerateDecelerateInterpolator()).setDuration(500).start();
printProperty(binding.ivBlue);
handler.postDelayed(this, 500);
}
}; private void startAnimation(){  
handler.postDelayed(this, 500);
}

递归调用postDelayed方法。

Android实现动画循环的方式的更多相关文章

  1. android 帧动画的实现及图片过多时OOM解决方案(一)

    一,animation_list.xml中静态配置帧动画的顺序,如下: <?xml version="1.0" encoding="utf-8"?> ...

  2. Android之动画的学习(转载)

    Android动画学习笔记-Android Animation   3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...

  3. 79.Android之动画基础

    转载:http://a.codekk.com/detail/Android/lightSky/%E5%85%AC%E5%85%B1%E6%8A%80%E6%9C%AF%E7%82%B9%E4%B9%8 ...

  4. Android属性动画完全解析(上),初识属性动画的基本用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系 ...

  5. Android属性动画完全解析(上)

    Android属性动画完全解析(上) 转载:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷 ...

  6. 利用Android属性动画实现Banner的原理与实践

    事实上在Android刚推出属性动画的时候.就想利用它来设计一个Banner控件,一直没什么时间尝试. 在当时看我们应用中的Banner,使用计时器来控制自己主动播放,设置一个非常大的数,利用余数原理 ...

  7. android 属性动画

    一直再追郭霖的博客和imooc上的一些新的视频,最近有讲到属性动画. 以下内容为博客学习以及imooc上视频资料的学习笔记: 在3.0之前比较常见的动画为tween动画和frame动画: tween动 ...

  8. OpenGL—Android 开机动画源码分析一

    .1 Android开机动画实现方式目前实现Android开机动画的方式主要是逐帧动画和OpenGL动画. ?逐帧动画 逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的 ...

  9. Android之动画

    Android的动画可以分为三种,View动画.帧动画.属性动画.View动画通过对场景里的对象不断做图像变化(平移.缩放.旋转.透明度)从而产生动画效果,它是一种渐进式动画,而且View动画支持自定 ...

随机推荐

  1. 了解JVM加载实例化类的原理

    class Singleton { private static Singleton instance = new Singleton(); public static int a; public s ...

  2. Trade-----HDU3401----单调队列优化的DP

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3401 题目意思: 有T天,你每天可以以API买进,BPI卖出,最多买ASI个,最多卖BSI个 最多只能 ...

  3. java.io.IOException: Unable to open sync connection!的解决方案

    在学习Android的时候,经常是使用手机调试程序,很方便,后来 在使用手机调试程序的时候出现了 [2012-03-08 11:27:43 - Tea_marsListActivity] ------ ...

  4. Liferay的架构:缓存(第一部分)

    这次,我将要涉及到一个非常重要的概念:缓存.在当今的web应用中,如果没有设计一个比较好的缓存系统,在web中就不可能有一个良好的性能.所以我将要 提到的缓存不仅仅能够更好地理解Liferay架构,而 ...

  5. Xcode4.6 开发 metaio 增强现实 项目(二)--增强现实的实现

    经过昨天的一些步骤,我们已经将我们的IOS应用的基本界面搭建好,下面我们将开始新的征程:增强现实技术的实现: 进入webView后,我们要选用我们这次需要用的nib文件,它是一个家居摆放应用的界面文件 ...

  6. ubuntu 安装jdk7总结

    ubuntu 安装jdk7,现在来总结一下: 第一步:下载jdk-7u25-linux-x64.tar.gz 直接在ORACLE的官网中下载就可以: http://download.oracle.co ...

  7. 深入学习Java中的字符串,代码点和代码单元

    在Java字符串处理时,在使用length和charAt方法时,应该格外小心,因为length返回的是UTF-16编码表示下的代码单元数量,而非我们所认为的字符的个数,charAt方法返回的是指定位置 ...

  8. .Net程序员学用Oracle系列(9):系统函数(上)

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.字符函数 1.1.字符函数简介 1.2.语法说明及案例 2.数字函数 2.1.数字函数简介 2.2.语法说明及案例 3.日期 ...

  9. FineReport中以jws方式调用WebService数据源方案

    在使用WebService作为项目的数据源时,希望报表中也是直接调用这个WebService数据源,而不是定义数据连接调用对应的数据库表,这样要怎么实现呢? 在程序中访问WebService应用服务, ...

  10. 【CSS学习笔记】关于有语义标签

    1.哪些是单闭合标签,哪些是双闭合标签? HTML的单闭合标签有: 1.<br /> 2.<hr /> 3.<area /> 4.<base /> 5. ...