android属性动画基础

来源:互联网 发布:java获取request对象 编辑:程序博客网 时间:2024/06/05 10:55

Android动画

android实现动画的方式

1. View Animation:补间动画    1. 位移,缩放,旋转,渐变,集合2. Drawable Animation:帧动画3. 自定义动画    1. 自己通过继承Animation自己实现动画类,但是有了属性动画,可以用属性动画替代这种做法.4. Property Animation:属性动画      1. 补间动画可以做的属性动画都可以做,反之则不是    2. android 3.0才有    3. 属性动画和补间动画的最大区别是        1. 补间动画,控件看似改变了位置,但是控件的焦点原来的位置

如果让android 3.0也可以执行属性动画?

使用nineoldandroids-2.2.0.jar

补间动画的实现原理/核心?

Animation.class中定义的protected void applyTransformation(float interpolatedTime, Transformation t),回调一些列的渐变值

//子类需要实现该方法,通过给定的interpolatedTime(0-1)的渐变值,实现自己的变化效果protected void applyTransformation(float interpolatedTime, Transformation t) {}

属性动画2个关键类

* public class ValueAnimator extends Animator        public static ValueAnimator ofFloat(float... values)         public static ValueAnimator ofInt(int... values)* public final class ObjectAnimator extends ValueAnimator        public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)         public static <T> ObjectAnimator ofInt(T target, Property<T, Integer> property, int... values)

通过xml配置属性动画

xml中的配置

<?xml version="1.0" encoding="utf-8"?>    <set xmlns:android="http://schemas.android.com/apk/res/android" >        <objectAnimator            android:duration="5000"            android:propertyName="scaleX"            android:valueFrom="0.0"            android:valueTo="1.0"            android:valueType="floatType" />        <objectAnimator            android:duration="5000"            android:propertyName="scaleY"            android:valueFrom="0.0"            android:valueTo="1.0"            android:valueType="floatType" />    </set>

java代码中的实现

        @Override        protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setContentView(R.layout.activity_main);            iv_zhangxin = (ImageView) findViewById(R.id.iv_zhangxin);            MyClick mc = new MyClick();            iv_zhangxin.setOnClickListener(mc);        }        private class MyClick implements OnClickListener {            @Override            public void onClick(View v) {                //AnimatorInflater:动画加载器,功能类似布局加载器         Animator animator= AnimatorInflater.loadAnimator(MainActivity.this,                  R.animator.animator_set_x_y);          animator.setDuration(5000);          animator.setTarget(iv_zhangxin);          animator.start();            }        }

属性动画2个关键监听

* 监听动画过程:开始,结束,重复,取消        public void addListener(AnimatorListener listener) * 得到动画执行过程中的渐变值        public void addUpdateListener(AnimatorUpdateListener listener)

属性动画原理

和普通动画类似,就是生成一些列渐变值,然后计算不同时间点的渐变值,然后改变UI

练习

  1. 位移动画(translationX,translationY,translation)

    ObjectAnimator animator = ObjectAnimator.ofFloat(mIv, "translationX", 0, 100, 200, 100);            animator.setInterpolator(new AccelerateDecelerateInterpolator());            animator.setDuration(300);            animator.start();
  2. 缩放(scrollX,scrollY,scroll)

    ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(mIv, "scaleX", 0, 1, 2, 1, 0);                scaleXAnimator.setDuration(1000);                scaleXAnimator.start();
  3. 透明度(alpha)

        ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mIv, "alpha", 0, 1, 0);                    alphaAnimator.setDuration(2000);                    alphaAnimator.start();
  4. 旋转(rotateX,rotateY,rotation)

    ObjectAnimator rotationAnimator = ObjectAnimator.ofFloat(mIv, "rotation", 0, 360, 0);                rotationAnimator.setDuration(1000);                rotationAnimator.start();
  5. 设置背景颜色渐变

       ObjectAnimator backgroundColorAnimator =                            ObjectAnimator.ofObject(mIv, "backgroundColor", new ArgbEvaluator(), Color.RED,                                    Color.BLUE);                    backgroundColorAnimator.setRepeatMode(ObjectAnimator.REVERSE);                    backgroundColorAnimator.setRepeatCount(ObjectAnimator.INFINITE);                    backgroundColorAnimator.start();
  6. 组合动画

    ObjectAnimator rotationAnimator = ObjectAnimator.ofFloat(mIv, "rotation", 0, 360, 0);ObjectAnimator translationAnimator =        ObjectAnimator.ofFloat(mIv, "translationX", 0, 100, 200, 100, 0);AnimatorSet set = new AnimatorSet();// set.playSequentially(rotationAnimator, translationAnimator);// 顺序播放set.playTogether(rotationAnimator, translationAnimator);// 一起播放set.setDuration(2000);set.start();
  7. xml定义组合动画

    Animator animator =
    AnimatorInflater.loadAnimator(MainActivity.this, R.animator.set_rotation_translate);
    animator.setTarget(mIv);
    animator.start();

  8. 监听动画执行过程

    ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 100);        valueAnimator.addListener(new AnimatorListener() {            @Override            public void onAnimationStart(Animator animation) {            }            @Override            public void onAnimationRepeat(Animator animation) {            }            @Override            public void onAnimationEnd(Animator animation) {            }            @Override            public void onAnimationCancel(Animator animation) {            }        });        valueAnimator.start();}
  9. 得到动画渐变值

    valueAnimator.addUpdateListener(new AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                int progress = (Integer) animation.getAnimatedValue();                ((Button) findViewById(R.id.btn10)).setText(progress + "%");            }});

动画要注意事项

1,区分ValueAnimator和ObjectAnimator2,一定要记得调用animator.start方法,不然动画不会执行
0 0
原创粉丝点击