Android之动画详解
2015-11-04 17:40
691 查看
是时候对安卓动画这块做一个详细的总结了,学会了动画就可以做一些很炫的效果出来,这样的应用很得用户的喜欢。安卓中的动画目前总共可以分为3类:补间动画、帧动画、属性动画。其中第三种是3.0后才出现的,与其他两种不同的是,这种动画改变的属性是View本身的属性。动画可以用代码来写,也可以用XML文件的形式来写,下面就按照3大类2中方式的形式分别做一个演示。
提供一个获取view中心点的方法:
下面进入今天的主题~~~~~~~~~~
一、补间动画
补间动画的效果有:旋转、缩放、改变透明度、平移
1.1旋转 代码演示:
Interpolator有以下值:
AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
如果android定义的interpolators不符合你的效果也可以自定义interpolators
1.2旋转 XML演示:
创建文件:res/anim/rotate.xml,文件内容如下:
java代码如下:
2.1Alpha 代码演示:
3.1translation 代码演示:
注意:以view的左上角为原点
3.2translation XML演示:
4.1缩放 代码演示:
4.2缩放 XML演示:
结合显示:
二、帧动画
在res/animator或者res/drawable下面建一个XML文件,内容是类似下面的形式:
然后在调用处:
就可以了。
三、属性动画
先来看看和这个动画相关的类:
ObjectAnimator 动画的执行类,后面详细介绍
ValueAnimator 动画的执行类,后面详细介绍
AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
AnimatorInflater 用户加载属性动画的xml文件
TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
TimeInterpolator 时间插值,就是在动画开始或者结束的时候增加一些额外的效果
该动画可以用XML文件写,也可以用代码写
属性动画和补间动画最大的区别就是属性动画改变的是View本身的属性,比如是让一个View移动,那么它是不断的改变View的坐标,然后重新绘制View,我们看到的动画其实都是view 绘制后的截图。其原理就是通过动画执行类,更加对其设置的数据对View进行操作,具体的动画执行类有ObjectAnimator、ValueAnimator,还有一个动画集合类AnimatorSet,其实ObjectAnimator就是继承于ValueAnimator,他们的使用方法其实就是ValueAnimator多了一步就是必须要添加一个监听接口:ValueAnimator.addUpdateListener(),下面对其使用做一个简要的说明,补间动画能设置的效果属性动画就能设置,他们其实功能是一样的。
改变X值:
用XML文件实现同样的效果:
ok,动画的知识大概就是这么多,具体的细节就没写那么明白了。有了整体的认识,就知道怎么去学习了,学完了之后也懂得自己都学了点啥,这就是我写这边文章的目的,限于目前的水平,可能写的不是很好,我会努力的~~~~~
附上我练习的源码:Demo下载
提供一个获取view中心点的方法:
// 获取view的中心点 private static int[] getPivot(View view) { int[] viewleft = new int[2]; view.getLocationInWindow(viewleft); int width = view.getWidth(); int height = view.getHeight(); int[] viewpivot = new int[2]; viewpivot[0] = viewleft[0] + width / 2; viewpivot[1] = viewleft[1] + height / 2; Log.e("", "view在屏幕中的XY坐标:" + viewleft[0] + "," + viewleft[1] + "中心点的位置:" + viewpivot[0] + "," + viewpivot[1]); return viewpivot; }
下面进入今天的主题~~~~~~~~~~
一、补间动画
补间动画的效果有:旋转、缩放、改变透明度、平移
1.1旋转 代码演示:
// 旋转 <span style="white-space:pre"> </span>public static RotateAnimation rotate(View view) { <span style="white-space:pre"> </span>// 建一个对象,围绕自身中心旋转 <span style="white-space:pre"> </span>RotateAnimation ra = new RotateAnimation(0, 359, RotateAnimation.RELATIVE_TO_SELF, (float) 0.5, <span style="white-space:pre"> </span>RotateAnimation.RELATIVE_TO_SELF, (float) 0.5); <span style="white-space:pre"> </span>ra.reset(); <span style="white-space:pre"> </span>ra.setDuration(1000 * 5); <span style="white-space:pre"> </span>// 重复模式 <span style="white-space:pre"> </span>ra.setRepeatMode(RotateAnimation.RESTART); <span style="white-space:pre"> </span>ra.setInterpolator(new AnticipateInterpolator()); <span style="white-space:pre"> </span>ra.setRepeatCount(3); <span style="white-space:pre"> </span>return ra; <span style="white-space:pre"> </span>}
Interpolator有以下值:
AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
如果android定义的interpolators不符合你的效果也可以自定义interpolators
1.2旋转 XML演示:
创建文件:res/anim/rotate.xml,文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000" android:fromDegrees="0" android:interpolator="@android:anim/accelerate_interpolator" android:pivotX="50" android:pivotY="50" android:toDegrees="360" > </rotate>
java代码如下:
am = AnimationUtils.loadAnimation(this, R.anim.rotate); ib.setAnimation(am);
2.1Alpha 代码演示:
// 渐变 public static AlphaAnimation setAlpha() { AlphaAnimation aa = new AlphaAnimation(1, 0); aa.setDuration(5 * 1000); aa.setZAdjustment(10); return aa; }2.2Alpha XML演示:
<?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="5000" android:fromAlpha="1" android:interpolator="@android:anim/bounce_interpolator" android:toAlpha="0" > </alpha>
3.1translation 代码演示:
注意:以view的左上角为原点
// translation public static TranslateAnimation setTransfor() { TranslateAnimation ta = new TranslateAnimation(-100, 100, -100, 100); ta.setDuration(5 * 1000); ta.setRepeatCount(2); return ta; }
3.2translation XML演示:
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="5000" android:fromXDelta="-100" android:fromYDelta="-100" android:toXDelta="200" android:toYDelta="200" > </translate>
4.1缩放 代码演示:
<span style="font-size:10px;"> // 缩放 public static ScaleAnimation setScale() { ScaleAnimation sa = new ScaleAnimation(0, 5, 0, 5, ScaleAnimation.RELATIVE_TO_SELF, 0.5f, ScaleAnimation.RELATIVE_TO_SELF, 0.5f); sa.setDuration(5000); sa.setRepeatCount(5); return sa; }</span>
4.2缩放 XML演示:
<span style="font-size:10px;"><?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:duration="5000" android:fromXScale="0" android:fromYScale="0" android:toXScale="5" android:toYScale="5" > </scale></span>
结合显示:
// 集合 public static AnimationSet setList() { AnimationSet as = new AnimationSet(false); as.setDuration(5000); as.addAnimation(setAlpha()); as.addAnimation(setRotate()); as.addAnimation(setScale()); as.addAnimation(setTransfor()); return as; }
二、帧动画
在res/animator或者res/drawable下面建一个XML文件,内容是类似下面的形式:
<span style="font-size:12px;"><animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false" > <item android:drawable="@drawable/sheep" android:duration="1000"/> <item android:drawable="@drawable/ic_launcher" android:duration="1000"/> <item android:drawable="@drawable/sheep" android:duration="1000"/> </animation-list></span>
然后在调用处:
ib.setBackgroundResource(R.animator.list); ad = (AnimationDrawable) ib.getBackground(); ad.start();
就可以了。
三、属性动画
先来看看和这个动画相关的类:
ObjectAnimator 动画的执行类,后面详细介绍
ValueAnimator 动画的执行类,后面详细介绍
AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
AnimatorInflater 用户加载属性动画的xml文件
TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
TimeInterpolator 时间插值,就是在动画开始或者结束的时候增加一些额外的效果
该动画可以用XML文件写,也可以用代码写
属性动画和补间动画最大的区别就是属性动画改变的是View本身的属性,比如是让一个View移动,那么它是不断的改变View的坐标,然后重新绘制View,我们看到的动画其实都是view 绘制后的截图。其原理就是通过动画执行类,更加对其设置的数据对View进行操作,具体的动画执行类有ObjectAnimator、ValueAnimator,还有一个动画集合类AnimatorSet,其实ObjectAnimator就是继承于ValueAnimator,他们的使用方法其实就是ValueAnimator多了一步就是必须要添加一个监听接口:ValueAnimator.addUpdateListener(),下面对其使用做一个简要的说明,补间动画能设置的效果属性动画就能设置,他们其实功能是一样的。
改变X值:
<span style="font-size:14px;"> // 设置动画的属性 ValueAnimator va = ValueAnimator.ofFloat(360).setDuration(1000); va.setRepeatCount(5); // 动画改变监听 va.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { // 取到根据上面设置的属性算出对应的值,然后更新的接口里面得到对应的值用来对 // View不同的属性设置该值,得到想要的效果 iv.setRotationX((Float) animation.getAnimatedValue()); } }); // 监听动画的开始介绍等,我只重写了一个方法,如要监听别的,请自己重写对应的方法 va.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); Log.e("", "动画结束啦!"); } }); // 该方法必须调用,否则没有效果 va.start();</span>
用XML文件实现同样的效果:
<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:propertyName="rotationX" android:repeatCount="5" android:valueTo="360" > </objectAnimator></span>
ok,动画的知识大概就是这么多,具体的细节就没写那么明白了。有了整体的认识,就知道怎么去学习了,学完了之后也懂得自己都学了点啥,这就是我写这边文章的目的,限于目前的水平,可能写的不是很好,我会努力的~~~~~
附上我练习的源码:Demo下载
相关文章推荐
- 【Android学习笔记】Activity--侃天诌地
- Android Xutils框架
- Android 5.0源码解析 ---Activity源码分析
- android客户端native性能关注&&问题排查
- Android回调的实现
- Android进程间通讯AIDL详解
- Android判断权限被限制
- android studio运行时报错the selected device is incompatible
- AndroidManifest.xml详解(上)
- Android ScroolView不能撑满全屏的问题
- Android学习--DatePicker和TimePicker使用
- Android适配之适配不同语言,即国际化
- System.err﹕ android.os.NetworkOnMainThreadException
- android编程之入门篇 第一个hellloword,用java代码写控件
- Android自动化测试中AccessibilityService
- Android自定义view(5)
- 使用ViewTreeObserver动态调整控件位置(Android)
- onCreate方法中调用PopupWindow的错误:android.view.WindowManager$BadTo
- Android自定义View(4)
- 《ArcGIS Runtime SDK for Android开发笔记》——(8)、关于ArcGIS Android开发的未来(“Quartz”版Beta)