Android中的动画学习总结
android中动画可分为三种:帧动画,补间动画,和属性动画。其中属性动画是google推荐的,它可以实现前面两种动画的效果,运用起来更加灵活。
帧动画:顾名思义,就是一帧一帧的图片,快速播放形成的动画。 具体实现步骤如下:
第一:新建一个drawable资源 以animation-list 为根节点创建资源文件。
第二:给ImageView或者其他View设置关联drawable。可以作为background或者src。
第三:在java代码中,通过View.getBackground();或者ImageView.getDrawable()。得到已经关联View的Drawable对象,转成AnimationDrawable对象。
然后调用AnimationDrawable.start()方法开始动画。也可以通过java代码动态加载Drawable资源,关联给View,再开始动画。
(一定要先把Drawable与View关联之后,才能开始AnimationDrawable动画。)
补间动画:类型有(透明度、缩放、旋转、平移、AnimationSet)AnimationSet。是一组Tween动画的集合。
可以通过addAnimation添加四种动画。使其四种动画可以同步开始与结束。其中repeatCount在AnimationSet中不起作用,只能每个动画中单独设置,分别可设置不同的重复次数。在xml中,fillAfter属性只有在set节点中设置才有效果。在xml中,插值器android:interpolator也要定义在set节点才有效。
补间动画的xml写法:
1.在res/anim/目录下创建动画资源文件,在其中定义需要的动画
2.在代码中加载动画资源
Animation animation = AnimationUtils.loadAnimation(this, R.anim.translation_anim);
3.开启动画
imageView.startAnimation(animation);
补间动画的java代码写法:
TranslateAnimation translateAnimation=new TranslateAnimation(Animation.RELATIVE_TO_PARENT,0,
Animation.RELATIVE_TO_PARENT,0,Animation.RELATIVE_TO_PARENT,-1,Animation.RELATIVE_TO_PARENT,0);
translateAnimation.setDuration(1000);
translateAnimation.setInterpolator(new BounceInterpolator());
mivLogoIcon.startAnimation(translateAnimation);
补间动画动画集的java代码写法:
补间动画还可以设置监听事件。animation.setAnimationListener;传入AnimationListener接口的类的对象,该类需要实现接口的三个方法:
Android:interpolotor属性的常用属性值
属性 |
描述 |
@android:anim/linear_interpolator |
动画一直在做匀速改变 |
@android:anim/accelerate_interpolator |
动画一在开始的地方心变较慢,然后开始加速 |
@android:anim/decelerate_interpolator |
在动画开始的地方改变速度较快,然后开始减速 |
@android:anim/accelerate_decelerate_interpolator |
动画在开始和结束的地方改变速度较慢,在中间的时候加速 |
@android:anim/cycle_interpolator |
动画循环播放特定的次数,变化速度按正弦曲线改变 |
@android:anim/bounce_interpolator |
动画结束的地方采用弹球效果 |
@android:anim/anticipate_overshoot_interpolator |
在动画开始的地方先向后退一小步,再开始动画,到结束的地方再超出一小步,最后回到动画结束的地方 |
@android:anim/overshoot_interpolator |
动画快速到达终点,并超出一小步最后回到动画结束的地方 |
@android:anim/anticipate_interpolator |
在动画开始的地方先向后退一小步,再快速到达动画结束的地方 |
补间动画在Activity跳转时的运用:
定义动画资源:
1.enter_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:duration="3000"
android:fromAlpha="0.5"
android:toAlpha="1"/>
<scale
android:fromXScale="0.2"
android:toXScale="1"
android:fromYScale="0.2"
android:toYScale="1"
android:duration="3000"
android:pivotX="50%p"
android:pivotY="50%p"></scale>
</set>
2.exit_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:duration="3000"
android:fromAlpha="1"
android:toAlpha="0.5"/>
<scale
android:fromXScale="1"
android:toXScale="0.2"
android:fromYScale="1"
android:toYScale="0.2"
android:duration="3000"
android:pivotX="50%p"
android:pivotY="50%p"></scale>
</set>
3. 在代码中startActivity(intent)后调用overridePendingTransition方法
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.enter2_anim,R.anim.exit_anim);
属性动画:
资源文件常用属性:
- "rotation" 自身平面旋转
- "rotationX" 3D翻转 X轴不变
- "rotationY" 3D翻转 Y轴不变
- "alpha" 透明度
- "scaleX" 缩放X 轴
- "scaleY" 缩放Y 轴
- "translationY" Y轴上移动
- "translationX" X轴上横向移动
java代码实现:
ObjectAnimator oa = ObjectAnimator.ofFloat(target, propertyName, values);
例如:
ObjectAnimator oa = ObjectAnimator.ofFloat(id_ball, "rotation", 0, 180);
oa.setDuration(5000)//动画执行的时间
oa.setRepeatCount(1);//动画的重复次数
oa.setRepeatMode(ObjectAnimator.REVERSE);//动画的重复方式
oa.start();//开始动画
属性动画集合实现:
方式一,使用PropertyValuesHolder:
PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat("scaleX", 1.0f, 2.0f);
PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleY", 1.0f, 2.0f);
PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.2f);
PropertyValuesHolder pvh4 = PropertyValuesHolder.ofFloat("rotationX", 0, 360);
PropertyValuesHolder pvh5 = PropertyValuesHolder.ofFloat("translationY", 1f, 100f);
ObjectAnimator.ofPropertyValuesHolder(id_ball, pvh1, pvh2, pvh3, pvh4, pvh5).setDuration(4000).start();
方式二,使用监听器:
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
//TODO 动画开始前的操作
/**
* 比如这里可以初始化一些UI
*/
}
@Override
public void onAnimationEnd(Animator animation) {
//TODO 动画结束的操作
/**
* 比如这里可以等动画结束进行一些账号登录或者网络数据请求等。
*/
}
@Override
public void onAnimationCancel(Animator animation) {
//TODO 动画取消的操作
}
@Override
public void onAnimationRepeat(Animator animation) {
//TODO 动画重复的操作
}
});
如果不关心动画的全部状态,可以使用:
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
//TODO 动画结束的操作
/**
* 比如这里可以等动画结束进行一些账号登录或者网络数据请求等。
*/
}
});
监听当前动画的执行情况:
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
//可以根据自己的需要来获取动画更新值。
Log.e("TAG", "the animation value is " + value);
}
});
举例:
ObjectAnimator anim = ObjectAnimator.ofFloat(id_ball, "null", 1.0F, 0.1F, 1).setDuration(4000);
anim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//得到变化后的value大小
float cVal = (Float) animation.getAnimatedValue();
id_ball.setAlpha(cVal);//改变控件的透明度
id_ball.setScaleX(cVal);//改变控件的缩放
id_ball.setScaleY(cVal);//***
id_ball.setTranslationX(id_ball.getWidth() * (1 - cVal));
}});
anim.start();
方式3,使用动画集AnimatorSet:
AnimatorSet这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
after(Animator anim) 将现有动画插入到传入的动画之后执行
after(long delay) 将现有动画延迟指定毫秒后执行
before(Animator anim) 将现有动画插入到传入的动画之前执行
with(Animator anim) 将现有动画和传入的动画同时执行
例:
ObjectAnimator alphaObjectAnimator2 = ObjectAnimator.ofFloat(textView,"alpha",1,0.5f,0.2f,0.1f,0.5f,1);
ObjectAnimator scaleXObjectAnimator = ObjectAnimator.ofFloat(textView,"scaleX",1,2,1,2,1);
ObjectAnimator scaleYObjectAnimator = ObjectAnimator.ofFloat(textView,"scaleY",1,2,1,2,1);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(alphaObjectAnimator2).with(scaleXObjectAnimator).after(scaleYObjectAnimator);
animatorSet.setDuration(3000);
animatorSet.start();
属性动画的xml实现:
第一步:在res/animator目录下创建文件anim_file.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:ordering="sequentially">
<!--动画执行顺序 sequentially:顺序执行;together:同时执行。 -->
<objectAnimator
android:propertyName="translationX"
android:valueFrom="0"
android:valueTo="200"
android:valueType="floatType" />
<set android:ordering="together">
<objectAnimator
android:propertyName="scaleX"
android:valueFrom="1"
android:valueTo="2"
android:valueType="floatType" />
<objectAnimator
android:propertyName="rotationX"
android:valueFrom="0"
android:valueTo="90"
android:valueType="floatType" /><!--动画值的类型-->
</set>
</set>
第二步,在代码中加载动画文件
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();
最后注意补间动画与属性动画的区别:
补间动画就算控件移动到任何位置,控件本身位置还是不变(类似dota中冰女放大,被推推推走的效果)。
属性动画是直接改变了控件的位置。
补间动画是通过控件启动动画,如: imageView.startAnimation(translateAnimation);
属性动画是动画对象启动,如:animator.start();
Android中的动画学习总结的更多相关文章
- Android中矢量动画
Android中矢量动画 Android中用<path> 标签来创建SVG,就好比控制着一支画笔,从一点到一点,动一条线. <path> 标签 支持一下属性 M = (Mx, ...
- Android中的动画
Android中的动画分为: 1.逐帧动画(Frame Animation): 把动画过程的每张静态图片都收集起来,然后由Android来控制依次显示这些静态图片,然后利用人眼”视觉暂留“的原理,给 ...
- Android中的动画具体解释系列【4】——Activity之间切换动画
前面介绍了Android中的逐帧动画和补间动画,并实现了简单的自己定义动画.这一篇我们来看看怎样将Android中的动画运用到实际开发中的一个场景--Activity之间跳转动画. 一.定义动画资源 ...
- Android中的动画详解系列【4】——Activity之间切换动画
前面介绍了Android中的逐帧动画和补间动画,并实现了简单的自定义动画,这一篇我们来看看如何将Android中的动画运用到实际开发中的一个场景--Activity之间跳转动画. 一.定义动画资源 如 ...
- Android(java)学习笔记200:Android中View动画之 XML实现 和 代码实现
1.Animation 动画类型 Android的animation由四种类型组成: XML中: alph 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动 ...
- Android(java)学习笔记143:Android中View动画之 XML实现 和 代码实现
1.Animation 动画类型 Android的animation由四种类型组成: XML中: alph 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动 ...
- 初识android中的动画
动画效果可以大大提高界面的交互效果,因此,动画在移动开发中的应用场景较为普遍.掌握基本的动画效果在成熟的软件开发中不可或缺.除此之外,用户对于动画的接受程度远高于文字和图片,利用动画效果可以加深用户对 ...
- Android中的动画机制
1 逐帧动画 逐帧动画 就是一系列的图片按照一定的顺序展示的过程. 逐帧动画很简单, 只需要在drawable中或者anim中定义一个Animation-list 其中包含多个it ...
- Android中的动画效果
动画的种类 透明动画alphaAnimation 在代码中配置动画: findViewById(R.id.btnAnimMe).setOnClickListener(new View.OnClickL ...
随机推荐
- Javascript学习笔记(一)
1.form表单中button按钮的事件会导致表单的提交,可以改成<input type='button' /> 实现 2. 手动触发select的onchange事件 var sele ...
- 排查Java线上服务故障的方法和实例分析
前言 作为在线系统负责人或者是一个技术专家,你可能刚刚接手一个项目就需要处理紧急故障,或者被要求帮忙处理一些紧急的故障,这个时候的情景是: (1)你可能对这个业务仅仅是听说过,而不怎么真正了解: (2 ...
- Nandflash 驱动移植
前段时间,研究了一下4G的Nandflash驱动.手头上只有飞凌6410BSP自带的Nandflash驱动,该驱动不支持K9GAG08U0D(2G)和K9LBG08U0D(4G)的Nandflash. ...
- sdut Message Flood(c++ map)
用字典树没过,学习了一下map; 参考博客:http://blog.csdn.net/zhengnanlee/article/details/8962432 AC代码 #include<iost ...
- mysql隔离机制
转 MySQL隔离级别 mysql-Innodb事务隔离级别-repeatable read详解(转)
- UVa 11082 (网络流建模) Matrix Decompressing
网络流不难写,难的建一个能解决问题的模型.. 即使我知道这是网络流专题的题目,也绝不会能想出这种解法,=_=|| 题意: 给出一个矩阵的 前i行和 以及 前i列和,然后找到一个满足要求的矩阵,而且每个 ...
- Linux 根文件系统制作
1.创建根文件目录 mkdir rootfs(名字是随便取的) 2.创建子目录 cd rootfs mkdir bin dev etc lib proc sbin sys usr mnt tmp va ...
- 什么是Code Review(转)
Code Review是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节.本文通过对Code Review的一些概念和经验的探讨,就如何进行C ...
- HTML5 离线功能介绍
HTML5 是目前正在讨论的新一代 HTML 标准,它代表了现在 Web 领域的最新发展方向.在 HTML5 标准中,加入了新的多样的内容描述标签,直接支持表单验证.视频音频标签.网页元素的拖拽.离线 ...
- http://www.cnblogs.com/youfan/articles/3216816.html
我对 CodeFirst 的理解,与之对应的有 ModelFirst与 DatabaseFirst ,三者各有千秋,依项目实际情况自行选择. 1.开发过程中先行设计数据库并依此在项目中生成 *.dbm ...