首页 > 系统 > Android > 正文

Android动画学习总结

2019-11-06 09:39:37
字体:
来源:转载
供稿:网友

Android动画学习总结

一、Android动画分类:

View动画:场景里的View不断的做变换(平移、旋转、拉伸、透明度)产生的动画效果;帧动画:按顺序播放一系列图像产生的效果;属性动画:Android3.0开始增加的一种动画效果,通过动态改变View对象的属性值实现。

二、View动画:

View动画分为TranslateAnimation、RotateAnimation、ScaleAnimation、AlphaAnimation四类,每一类都有其各自的属性,具体可以查看官方文档,强烈建议使用xml来定义View动画,简单方便,可读性高,下面说明四类动画在XML中的表现形式:

TranslateAnimation—<translate>RotateAnimation—<rotate>ScaleAnimation—<scale>AlphaAnimation—<alpha>

下面是View动画的定义://res.anim.customize_anim.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:duration="3000" android:repeatMode="reverse" android:fillAfter="true" android:startOffset="300" android:shareInterpolator="true"> <translate android:fromYDelta="100" android:fromXDelta="100" android:toYDelta="500" android:toXDelta="500" /> <rotate android:fromDegrees="0" android:toDegrees="90" android:pivotX="0" android:pivotY="0" /> <scale android:duration="300" android:fromXScale="2.0" android:fromYScale="2.0" android:pivotX="50%p" android:pivotY="50%p" android:toXScale="1.0" android:toYScale="1.0" /> <alpha android:fromAlpha="0" android:toAlpha="1" /> <set><!--在此定义子动画集--></set></set>

除了四类View动画特有属性外,还有几个公用属性:

android:duration(动画持续时间)android:fillAfter(动画结束后是否停留在结束位置,true:结束位置,false:初始位置)android:interpolator(动画插值器)android:repeatMode(动画重复模式)android:startOffset(动画延迟时间,单位:ms,默认300ms)android:shareInterpolator(动画集是否共享插值器)

定义好View动画后,下面就是应用动画了:

Animation animation = AnimationUtils.loadAnimation(getapplicationContext(),R.anim.customize_anim);animation.setAnimationListener(new Animation.AnimationListener() { //监听动画过程 @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } });imageView.startAnimation(animation); 如上,可以对动画添加监听过程。

自定义View动画过程: a、继承抽象类Animation,重写initialize()、applyTransformation()方法 b、initialize()进行初始化操作 c、applyTransformation()进行相应的矩阵变换实现动画效果,使用Camera可以简化矩阵变换过程

帧动画: 系统提供AnimationDrawable来使用动画,因其是顺序播放一组图片来实现动画,特别消耗内存,并且容易引起OOM,所以不建议使用。

View动画特殊使用场景 View动画可以应用于ViewGroup场景,用于控制子控件的出场效果,常见的有ListView和Activity的切换效果等,具体实现在此不做详细说明。

三、属性动画

属性动画是Api 11加入的新特性,要想兼容Api 11以下版本,可以使用开源库nineoldandroids实现,该开源库的使用和原生的属性动画的使用完全一致。属性动画不再局限于View的变换,它可以实现任意属性值的变化,进而形成动画效果,常用的类有ObjectAnimation、ValueAnimation、AnimationSet等,其中AnimationSet是动画集合,ObjectAnimation是ValueAnimation的子类,属性动画的简单使用示例: ObjectAnimator animator = ObjectAnimator.ofFloat(imageView,"translationY",200); animator.setRepeatMode(ValueAnimator.RESTART); animator.setRepeatCount(3); animator.setEvaluator(new IntEvaluator()); animator.setInterpolator(new AccelerateDecelerateInterpolator()); animator.start();插值器 插值器是根据时间流逝的百分比计算出当前属性值改变的百分比,系统提供LinearInterpolator(线性插值器,匀速动画)、AccelerateDecelerateInterpolator(加减速插值器,根据cos()函数实现)、DecelerateAccerateInterpolator(减加速插值器,根据sin()函数实现)、DecelerateInterpolator(减速插值器)等,可以实现自定义插值器,只需实现TimeInterpolator接口或者Interpolator接口即可。估值器 类似于插值器,估值器是根据当前属性值改变的百分比计算出改变后的属性值,系统提供IntEvaluator(Int型属性估值器)、FloatEvaluator(Float型属性估值器)、ArgbEvaluator(颜色属性股指器),估值器同样可以自定义,只需实现TypeEvaluator接口。注:插值器和估值器是实现非匀速动画的重要手段。属性动画监听 属性动画提供两种类型的监听,分别是AnimatorListener和AnimatorUpdateListener,AnimatorListener被AnimatorListenerAdapter类适配,可以有选择的实现该接口中的方法。AnimatorUpdateListener用于监听动画中的每一帧动画。

属性动画生效的前提条件:在此我们假设对对象A的width属性实施动画效果

A对象必须提供setWidth()方法,如果应用时未提供初始值,A还需提供getWidth()方法来获取width的初始值

A的setWidth()方法设置的值必须能够通过某种方式反应出来,比如UI的改变等 以上两个条件必须同时满足,典型案例如Button的width,只满足第一个条件,想要详细了解请见Button的源码getWidth()、setWidth(); 当条件不满足的解决办法,官方提供如下三种:

权限允许的情况下,为A加上get和set方法,基本上不被使用,A大多数来自SDK包装A类,为其提供get和set方法,用的比较多,示例如下使用ValueAnimator,监听动画过程 PRivate static class ViewWrapper{ private View mTarget; public ViewWrapper(View mTarget) { this.mTarget = mTarget; } public int getWidth(){ return mTarget.getLayoutParams().width; } public void setWidth(int width){ mTarget.getLayoutParams().width = width; mTarget.requestLayout(); } } //使用包装类 ViewWrapper viewWrapper = new ViewWrapper(textView3); ObjectAnimator animator = ObjectAnimator.ofInt(viewWrapper,"width",50,500); animator.setDuration(5000); animator.start();

四、文章说明 本篇文章是自己对Android动画的学习总结,为了记忆,也为了后面使用方便,如有不对之处,欢迎阅览者提出,在此感谢任志刚老师的《Android开发艺术探索》


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表