1.回顾

  上篇学习了 Animation 的实现方式 , 后转型了 Ubuntu 下的 Andorid Studio ;

  初次使用Android Studio 开始进行一些 快捷键的设置:


/**
     * 这里的快捷键有:
     * alt+/  :智能提示
     * alt+enter : 错误补全
     * <p/>
     * 自定义的快捷键设置:
     * Keymap->Main Menu->Code->Completion 里面设置
     * ctrl + shift + L : 提示实现接口
     * ctrl + shift + n :提示重写的方法
     */



2.重点

Animation和 Animator

  (2)Animator 属性动画的实现方式

  (3)ValueAnimator

3.Animation 和 Animator

  上篇已经学习过有关 Animation 的先关知识,我们知道 通过 Animation 实现的动画,仅仅是 改变了控件或图片的显示效果相当于 重绘了界面 ,而其属性 没有改变;

  Animation 的局限性就在于:只是重绘了画面,而没有改变控件属性;

  示例: 通过按钮 移动图片 Animation 实现


ImageView imageView = (ImageView) findViewById(R.id.imageView);

            /**
             *   参数: rotation
             translationX
             translationY
             */

            //Animation 方式执行动画
            TranslateAnimation animation=new TranslateAnimation(0.0f,100.0f,0.0f,100.0f);
            animation.setDuration(2000);
            animation.setFillAfter(true);
            imageView.startAnimation(animation);

   测试的话 ,可以给 图片添加一个点击事件!



4.Animator属性动画实现

  4.1 ObjectAnimator

     (1)使用方法

ObjectAnimator.ofFloat(操作的对象,操作的动画,变化范围)
      .setDuration()
    .start();
  参数: rotation
        translationX
        translationY

     (2)示例

 

ObjectAnimator animation=ObjectAnimator.ofFloat(imageView,"translationX",0.0f,200.0f);
            animation.setDuration(1000);
            animation.start();


     (3)多个动画 :同时执行了


/**
             * ObjectAnimator 方式执行方式
             * 设置三个动画 同时执行了;
             */
            ObjectAnimator animation=ObjectAnimator.ofFloat(imageView,"translationX",0.0f,200.0f);
            animation.setDuration(1000);
            animation.start();

            ObjectAnimator animation1=ObjectAnimator.ofFloat(imageView,"translationY",0.0f,200.0f);
            animation1.setDuration(1000);
            animation1.start();

            ObjectAnimator animation2=ObjectAnimator.ofFloat(imageView,"rotation",0.0f,200.0f);
            animation2.setDuration(1000);
            animation2.start();


   4.2 AnimatorSet + Animator 实现

    (1)使用方式

多个动画集合

AnimatorSet  set=new AnimatorSet();
    //同时执行
    .playTogether(属性集合/ObjectAnimator);
    //依次执行
    .playSequentially(ObjectAnimator items);
   .setDuration(时间);
   .start();




  顺序控制:
  .play().with().after().before();

    (2)实现

 

/**
             * AnimatorSet
             * 控制 多个动画的运行
             */
            ObjectAnimator animation=ObjectAnimator.ofFloat(imageView,"translationX",0.0f,200.0f);

            ObjectAnimator animation1=ObjectAnimator.ofFloat(imageView,"translationY",0.0f,200.0f);

            ObjectAnimator animation2=ObjectAnimator.ofFloat(imageView,"rotation",0.0f,200.0f);

            AnimatorSet set=new AnimatorSet();
            //多个动画同时执行
            // set.playTogether(animation,animation1,animation2);
            //多个动画按放入位置执行
            // set.playSequentially(animation,animation1,animation2);
            //顺序控制执行
            set.play(animation1).with(animation);
            set.play(animation2).after(animation);

            set.setDuration(1000);
            set.start();


  4.3 PropertyValuesHolder + Animator 

    (1)PropertyValuesHolder

多个属性集合holder
  PropertyValuesHolder.pfFloat();

    (2)示例


/**
             * PropertyValuesHolder
             * 属性集合
             * 可以方便调用使用;
             */
            PropertyValuesHolder holder = PropertyValuesHolder.ofFloat("translationX", 0.0f, 200.0f);
            PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("translationY", 0.0f, 200.0f);
            //通过ofPropertyValuesHolder 实现
            ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(imageView, holder, holder1);
            objectAnimator.setDuration(1000);
            objectAnimator.start();


 4.4 监听事件

//过程监听
   new AnimatorListener()
//某个过程监听
  new AnimatorListenerAdapter()


 4.5 动画菜单实现


private int[] imgIds = {R.id.icon_down, R.id.icon_error, R.id.icon_left, R.id.icon_light,
            R.id.icon_location, R.id.icon_none, R.id.icon_true};

    private ImageView iv_up;
    private List<ImageView> imageViews = new ArrayList<ImageView>();

    //控制按钮
    private boolean flag = true;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_id = (Button) findViewById(R.id.btn_id);
        tv = (TextView) findViewById(R.id.tv_show);
        btn_id.setOnClickListener(new btnidListener());

        iv_up = (ImageView) findViewById(R.id.icon_up);
        iv_up.setOnClickListener(this);


        //初始化ImageView
        for (int id : imgIds) {
            ImageView imageView = (ImageView) findViewById(id);
            //给每个菜单设置监听事件
            imageView.setOnClickListener(this);
            imageViews.add(imageView);

        }

    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.icon_up:
                if (flag) {
                    startAnim();
                    flag = false;
                } else {
                    closeAnim();
                    flag = true;
                }

                break;
            default:
                Toast.makeText(this, "点击的图片ID为" + v.getId(), Toast.LENGTH_SHORT).show();
                break;

        }

    }

    /**
     * 创建展开动画
     */
    private void startAnim() {

        for (int i = 0; i < imageViews.size(); i++) {
            ObjectAnimator animator = ObjectAnimator.ofFloat(imageViews.get(i), "translationY", 0, i * 100f);
            animator.setDuration(500);
            //设置延时 一个一个出来
            //不设置 同时出来
            //设置插入器 Android 自带有插入器
            animator.setInterpolator(new BounceInterpolator());
            animator.setStartDelay(i * 300);
            animator.start();
        }

    }

    /**
     * 创建收回动画
     */
    private void closeAnim() {
        for (int i = 0; i < imageViews.size(); i++) {
            ObjectAnimator animator = ObjectAnimator.ofFloat(imageViews.get(i),
                    "translationY", i * 100f, 0);
            animator.setDuration(500);
            //设置延时 一个一个出来
            //不设置 同时出来
            //设置插入器 Android 自带有插入器
            animator.setInterpolator(new BounceInterpolator());
            animator.setStartDelay(i * 300);
            animator.start();
        }
    }


    4.6 插值器

(1)AccelerateDecelerateInterpolator
  :开始与结束的地方速率改变比较慢,在中间的时候加速


  (2)AccelerateInterpolator
:开始的地方速率改变比较慢,然后开始加速


(3) AnticipateInterpolator
:开始的时候向后然后向前甩


(4)AnticipateOvershootInterpolator
:开始的时候向后然后向前甩一定值后返回最后的值


(5)LinearInterpolator
:以常量速率改变


  (6)DecelerateInterpolator
:在开始的地方快然后慢


  (7)BounceInterpolator
:动画结束的时候弹起


(8) OvershootInInterpolator
:向前甩一定值后再回到原来位置


(9) CycleInterpolator
:循环播放特定的次数,速率改变沿着正弦曲线



5.ValueAnimator 

  (1)ObjectAnimator继承自ValueAnimator

  是什么?
  数值产生器;
  怎么用?
  ValueAnimator.ofInt();
  AnimatorUpdateListener


  ValueAnimator.ofObject();
  TypeEvaluator<pointF>


  (2)示例 : 计时器


//ValueAnimator
            ValueAnimator valueAnimator=ValueAnimator.ofInt(0,100);
            valueAnimator.setDuration(5000);
            //添加监听事件
            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    btn_id.setText(animation.getAnimatedValue().toString());
                }
            });
            valueAnimator.start();


6.总结

  从Eclipse 转过来的 ,现在很喜欢 AS ;