您的位置:首页 > 移动开发 > Objective-C

Android-Animator属性动画( ObjectAnimator , AnimatorSet , ValueAnimator )

2015-09-15 11:43 856 查看

1.回顾

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

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

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

2.重点

  (1)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 ; 

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息