Android实现动画循环的方式
每次想到循环播放、重复执行时,脑海中总是冒出在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实现动画循环的方式的更多相关文章
- android 帧动画的实现及图片过多时OOM解决方案(一)
一,animation_list.xml中静态配置帧动画的顺序,如下: <?xml version="1.0" encoding="utf-8"?> ...
- Android之动画的学习(转载)
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- 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 ...
- Android属性动画完全解析(上),初识属性动画的基本用法
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系 ...
- Android属性动画完全解析(上)
Android属性动画完全解析(上) 转载:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷 ...
- 利用Android属性动画实现Banner的原理与实践
事实上在Android刚推出属性动画的时候.就想利用它来设计一个Banner控件,一直没什么时间尝试. 在当时看我们应用中的Banner,使用计时器来控制自己主动播放,设置一个非常大的数,利用余数原理 ...
- android 属性动画
一直再追郭霖的博客和imooc上的一些新的视频,最近有讲到属性动画. 以下内容为博客学习以及imooc上视频资料的学习笔记: 在3.0之前比较常见的动画为tween动画和frame动画: tween动 ...
- OpenGL—Android 开机动画源码分析一
.1 Android开机动画实现方式目前实现Android开机动画的方式主要是逐帧动画和OpenGL动画. ?逐帧动画 逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的 ...
- Android之动画
Android的动画可以分为三种,View动画.帧动画.属性动画.View动画通过对场景里的对象不断做图像变化(平移.缩放.旋转.透明度)从而产生动画效果,它是一种渐进式动画,而且View动画支持自定 ...
随机推荐
- 了解OData(一)
了解OData(一) 最近做了一个小项目,其中用到了 WCF Data Service,之前是叫 ADO.NET Data Service 的.关于WCF Data Service,博客园里的介绍并不 ...
- 打破惯性思维:聊聊一次debug
最近公司的新需求中要增加活动营销,整个组的人都被安排去研究某成熟产品的实现.我也认真地在看webService部分的实现,发现了一个诡异的10614端口的请求. 代码如下图: 这是一段服务端发请求验证 ...
- 高频交易算法研发心得--RSI指标及应用
高频交易算法研发心得--RSI指标及应用 前面文章中我们提到了MA均线(包括EMA,SMA).MACD以及SAR指标,这三类指标存在一个共同特点,即:从固定周期的价格作为判读的指导思想,并将价格进行平 ...
- 基于jQuery的ajax系列之用FormData实现页面无刷新上传
接着上一篇ajax系列之用jQuery的ajax方法向服务器发出get和post请求写,这篇主要写如何利用ajax和FormData实现页面无刷新的文件上传效果,主要用到了jQuery的ajax()方 ...
- Java 编译打包命令
背景 编译 打包 解压 运行 参考 背景 我们有的时候总是要使用将自己写的工程编译成 class 文件,同时打包成 jar,虽然有各种工具可以帮助我们,但是毕竟掌握使用 java 本来的命令去做这些更 ...
- [JAVA] 学java必看书籍
<java编程思想>,<Effective Java>,<JVM虚拟机规范> <Java核心技术> <Java Web开发技术大全& ...
- 【Java每日一题】20170111
20170110问题解析请点击今日问题下方的"[Java每日一题]20170111"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- Jquery中toggle的用法详情
jquery ----toggle([speed],[easing],[fn]) 用于绑定两个或多个事件处理器函数,以响应被选元素的轮流的click事件 如果元素是可见的,切换为隐藏的:如果元素是隐藏 ...
- 程序启动的目录不一样.ajax请求的地址跳转会出现的问题
程序启动的目录不一样.ajax请求的地址跳转会出现的问题启动 frontend/web/启动 frontend/ $.ajax({ url:"<?php echo Yii::$app- ...
- OpenCV入门教程
OpenCV入门教程 作者:于仕琪 OpenCV入门教程.pdf