1. 概念:
    属性动画(property animation),这个是在Android 3.0中才引进的,一定要注意兼容的最低版本(NineOldAndroids这是一个github上兼容API11以下的开源框架)。Property Animation改变view的真实属性,比喻坐标、透明度、放大比例等等,在View Animation和Tween Animation中,其改变的是View的绘制效果,真正的View的属性保持不变。
    Property Animation不止可以应用于View,还可以应用于任何对象。Property Animation只是表示一个值在一段时间内的改变,当值改变时,可以随意对控制对象的操作。
    在这里重点声明一下动画无论什么动画只能在父控件里面动,超过了父控件都会被遮盖,这点我吃过大亏,所以,要想超出父控件范围必须,扩大父控件的布局,下面我会专门写一篇文章分析。
  2. 常用属性:
    Duration动画的持续时间,默认300ms。
    Time interpolation:时间插值。LinearInterpolator、AccelerateDecelerateInterpolator,定义动画的变化率。
    Repeat count and behavior:重复次数、以及重复模式;可以定义重复多少次;重复时从头开始,还是反向。
    Animator sets: 动画集合,你可以定义一组动画,一起执行或者顺序执行。
    Frame refresh delay:帧刷新延迟,对于你的动画,多久刷新一次帧;默认为10ms,但最终依赖系统的当前状态;基本不用管。
  3. 相关的类:
    ObjectAnimator 动画的执行类
    ValueAnimator 动画的执行类
    AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
    AnimatorInflater 用户加载属性动画的xml文件
    TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
    TimeInterpolator 时间插值
    总的来说,属性动画就是,动画的执行类来设置动画操作的对象的属性、持续时间,开始和结束的属性值,时间差值等,然后系统会根据设置的参数动态的变化对象的属性。

先来一最简单的示例

private void test1(View view) {        //最简单的动画        ObjectAnimator//                .ofFloat(view, "rotationX", 0.0F, 360.0F)//                .setDuration(500)//                .start();    }
  • ObjectAnimator用法

ObjectAnimator类的静态方法ofFloat,发现源码里面实际上是new出一个ObjectAnimator对象,然后返回这个对象的赋值,由此可见其他的方法(ofInt,ofArgb)都是通过类似的方式构建的

public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) {        ObjectAnimator anim = new ObjectAnimator(target, propertyName);        anim.setFloatValues(values);        return anim;    }

target:动画的目标对象
value:就是初始值和结束值
propertyName:属性名,详解如下
(借用大神http://blog.csdn.net/eclipsexys/article/details/38401641)
PS:可操纵的属性参数:x/y;scaleX/scaleY;rotationX/ rotationY;transitionX/ transitionY等等。
PS:X是View最终的位置、translationX为最终位置与布局时初始位置的差。所以若就用translationX即为在原来基础上移动多少,X为最终多少。getX()的值为getLeft()与getTranslationX()的和。

  1. translationX和translationY:这两个属性作为一种增量来控制着View对象从它布局容器的左上角坐标开始的位置。

  2. rotation、rotationX和rotationY:这三个属性控制View对象围绕支点进行2D和3D旋转。

  3. scaleX和scaleY:这两个属性控制着View对象围绕它的支点进行2D缩放。

  4. pivotX和pivotY:这两个属性控制着View对象的支点位置,围绕这个支点进行旋转和缩放变换处理。默认情况下,该支点的位置就是View对象的中心点。

  5. x和y:这是两个简单实用的属性,它描述了View对象在它的容器中的最终位置,它是最初的左上角坐标和translationX和translationY值的累计和。

  6. alpha:它表示View对象的alpha透明度。默认值是1(不透明),0代表完全透明(不可见)。

  7. backgroundColor,color等其他属性名

然后设置延迟时间,看源码知道返回值是对象本身

@Override    @NonNull    public ObjectAnimator setDuration(long duration) {        super.setDuration(duration);        return this;    }

最后直接start动画
如果你要做的操作一般的平移,缩放什么的的无法满足,那就可以自定义自己的动作了,如下。propertyName可以写任意值,只需要监听(addUpdateListener)在1.0f和0.0f之间变化的数值,然后做自己任意的操作

public void rotateyAnimRun(final View view) {        ObjectAnimator anim = ObjectAnimator//                .ofFloat(view, "any", 1.0F, 0.0F)//                .setDuration(500);//        anim.start();        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                float cVal = (Float) animation.getAnimatedValue();                view.setAlpha(cVal);                view.setScaleX(cVal);                view.setScaleY(cVal);            }        });    }

ofint用法类似,其实还有另外一个用法ofPropertyValuesHolder,代码贴上,一看就明白,不用多说的吧

public void propertyValuesHolder(View view) {        PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f, 0f, 1f);        PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);        PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);        ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY, pvhZ).setDuration(1000).start();    }
  • ValueAnimator用法

上面这部分基本把ObjectAnimator的用法分析清楚了,其实ValueAnimator用法和ObjectAnimator比较类似,ObjectAnimator是继承ValueAnimator,拥有了一个propertyName属性,对特有的平移,缩放,透明度,旋转进行处理,下面简单贴一个例子,大家应该就明白了

public void verticalRun( final View view) {        ValueAnimator animator = ValueAnimator.ofFloat(0, 1000 - view.getHeight());        animator.setTarget(view);        animator.setDuration(1000).start();        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                view.setTranslationY((Float) animation.getAnimatedValue());            }        });    }

这和ObjectAnimator添加addUpdateListener监听,设置任意属性用法非常类似

  • TypeEvaluator用法

还有一个TypeEvaluator可能用到,类型估值,控制属性具体的变化,例子贴出来,直接设置对象的变化

public void verticalRun( final View view) {        ValueAnimator animator = new ValueAnimator();        animator.setObjectValues(new PointF(0, 0));        animator.setTarget(view);        animator.setDuration(1000).start();        animator.setEvaluator(new TypeEvaluator<PointF>() {            @Override            public PointF evaluate(float fraction, PointF startValue, PointF endValue) {                PointF point = new PointF();                point.x = 200 * fraction * 3;                point.y = 0.5f * 200 * (fraction * 3) * (fraction * 3);                return point;            }        });        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                PointF point = (PointF) animation.getAnimatedValue();                view.setX(point.x);                view.setY(point.y);// view.setTranslationY((Float) animation.getAnimatedValue());            }        });    }
  • 监听

最后只剩下动画的监听了

animator.addListener(new AnimatorListenerAdapter() {            @Override            public void onAnimationEnd(Animator animation) {                super.onAnimationEnd(animation);            }        });

这是系统给我们实现AnimatorListener的适配器类,也可以自己实现AnimatorListener接口,如果你不嫌重写的方法多的话

animator还有cancel()和end()方法:cancel动画立即停止,停在当前的位置;end动画直接到最终状态。

以上简单的常用的到ObjectAnimator 和ValueAnimator用法将了一遍,基本完全可以满足我们的开发需求了。

  • AnimatorSet用法
    Animatorset用法很简单,将其他的动画类添加进来就可以,一种是playTogether一起执行,一种是playSequentially依次执行,还有一种就是有先后顺序,主要有after,before,with。

下面是playTogether用法

public void togetherRun(View view) {        ObjectAnimator anim1 = ObjectAnimator.ofFloat(view, "scaleX", 1.0f, 2f);        ObjectAnimator anim2 = ObjectAnimator.ofFloat(view, "scaleY", 1.0f, 2f);        AnimatorSet animSet = new AnimatorSet();        animSet.setDuration(2000);        animSet.setInterpolator(new LinearInterpolator());        //两个动画同时执行        animSet.playTogether(anim1, anim2);        animSet.start();    }

我们可以看到playTogether的源码,参数对象只要是Animator的子类就可以,而本质上还是用的builder.with()方法,下面重点分析after,before,with这三个方法

public void playTogether(Animator... items) {        if (items != null) {            mNeedsSort = true;            Builder builder = play(items[0]);            for (int i = 1; i < items.length; ++i) {                builder.with(items[i]);            }        }    }

看看playSequentially依次执行的源码,本质上是before方法,主要是看
这句话

play(items[i]).before(items[i+1])

第i个是在第i+1个之前,参数里面的动画按照顺序依次执行

public void playSequentially(Animator... items) {        if (items != null) {            mNeedsSort = true;            if (items.length == 1) {                play(items[0]);            } else {                mReversible = false;                for (int i = 0; i < items.length - 1; ++i) {                    play(items[i]).before(items[i+1]);                }            }        }    }

after,before,with的分析,直接代码贴上

public void playWithAfter(View view) {        float cx = view.getX();        ObjectAnimator anim1 = ObjectAnimator.ofFloat(view, "scaleX", 1.0f, 2f);        ObjectAnimator anim2 = ObjectAnimator.ofFloat(view, "scaleY", 1.0f, 2f);        ObjectAnimator anim3 = ObjectAnimator.ofFloat(view, "x", cx, 0f);        ObjectAnimator anim4 = ObjectAnimator.ofFloat(view, "x", cx);        /** * anim1,anim2,anim3同时执行 * anim4接着执行 */        AnimatorSet animSet = new AnimatorSet();        animSet.play(anim1).with(anim2);        animSet.play(anim2).with(anim3);        animSet.play(anim4).after(anim3);        animSet.setDuration(1000);        animSet.start();    }

代码里面就很明了了,不用多说

  • xml的使用
    直接代码贴上
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially">    <objectAnimator  android:duration="4000" android:propertyName="x" android:valueTo="300" android:valueType="intType" />    <objectAnimator  android:duration="4000" android:propertyName="y" android:valueTo="400" android:valueType="intType" />    <objectAnimator  android:duration="4000" android:propertyName="x" android:valueTo="0" android:valueType="intType" />    <objectAnimator  android:duration="4000" android:propertyName="y" android:valueTo="0" android:valueType="intType" /></set>

【备注:】
android:ordering说明一系列动画动作的执行顺序,有两个选择: sequentially 和together,顺序执行还是一起执行;
objectAnimator 是设定动画实施的对象;
duration是该动画动作执行从开始到结束所用的时间;
android:repeatCount=”infinite” 可以是整数或者infinite
android:repeatMode=”restart” 可以是restart 或者 reverse
android:valueFrom=” ” 整数|浮点数|颜色

然后自家在代码里面加载出来

AnimatorSet set =(AnimatorSet)AnimatorInflater.loadAnimator(this,R.animator.property_anim);// 设置要控制的对象set.setTarget(move);// 开始动画set.start();

以上部分基础的用法都讲解完了,还有一个经常用到的是时间差值Time interpolation属性,我会另外写一篇文章分析。
布局动画(Layout Animations)也会另外文章分析

算了不想写其他的分析了,csdn上有很多分析,我在这里总结归纳下,以后不清楚的直接上去看
NineOldAndroids动画兼容库的使用http://blog.csdn.net/chdjj/article/details/42293599

Android 属性动画(Property Animation) 完全解析 (上)http://blog.csdn.net/lmj623565791/article/details/38067475
Android 属性动画(Property Animation) 完全解析 (下)http://blog.csdn.net/lmj623565791/article/details/38092093
Android动画机制全解析http://blog.csdn.net/eclipsexys/article/details/38401641
Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法http://blog.csdn.net/guolin_blog/article/details/43816093
Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法http://blog.csdn.net/guolin_blog/article/details/44171115
Android属性动画完全解析(上),初识属性动画的基本用法http://blog.csdn.net/guolin_blog/article/details/43536355
Android属性动画Property Animation系列三之LayoutTransition(布局容器动画)http://blog.csdn.net/feiduclear_up/article/details/45919613
Android属性动画Property Animation系列二之ObjectAnimatorhttp://blog.csdn.net/feiduclear_up/article/details/45915377
基本涉及到的内容都在这里面了,拱大家研究

/**
* --------------
* 欢迎转载 | 转载请注明
* --------------
* 如果对你有帮助,请点击|顶|
* --------------
* 请保持谦逊 | 你会走的更远
* --------------
* @author css
* @github https://github.com/songsongbrother
* @blog http://blog.csdn.net/xiangxi101
*/

更多相关文章

  1. 【转】Android(安卓)Repo的manifest XML文件格式
  2. AndroidManifest.xml文件详解(instrumentation)
  3. Android中动画实现单击按钮控制开屏关屏效果(系统animation实现
  4. AndroidActivity切换动画overridePendingTransition笔记.解决切
  5. Android(安卓)Fragment基本介绍和用法
  6. android之AndroidManifest.xml简述
  7. android动画 开发者选项中动画时长原理分析(Android(安卓)M)
  8. Android中的属性动画(Property Animation)——Android开发艺术探
  9. Android(安卓)UI设计:Notification

随机推荐

  1. 通过终端命令生成并在手机上运行dex文件
  2. Robotium---环境搭建及入门示例
  3. Android学习笔记:Android基础知识总结
  4. android的技术层次
  5. Spark实例-每天每个搜索词用户访问
  6. Android(安卓)JNI(实现自己的JNI_OnLoad函
  7. Edittext 各种属性
  8. Android之back键拦截处理
  9. 【Android】android的基本UI操作(1)
  10. Android(安卓)User Interface之Text Fiel