Android属性动画的学习_ObjectAnimator

最近刚学习了下属性动画,做个记录。
【Android属性动画的学习_ObjectAnimator】1. ObjectAnimator的概述和使用限制

ObjectAnimator继承自ValueAnimator,在使用中会有一些限制

  • 使用的对象必须要有setXXX(xxx)方法,比如View的setTranslationX(float translationX)。
  • 在某些情况下还需要getXXX()方法,比如需要修改一个TextView的宽度,没有提供初始width的话,就需要width属性有int getWidth()方法。(注:有些时候直接修改width会发现不管用,这个后边详解)
  • 属性动画的Android3.0之后才有的,3.0之前使用的话需要添加一个nineoldandroids库。
2. ObjectAnimator使用方式
先提出一个需求:点击按钮安卓小机器人横向移动200,重复2次。
Android属性动画的学习_ObjectAnimator
文章图片

布局很简单,只有两个空间

(1)、在xml文件中使用

大概说一下各个属性的意思:
  • duration 动画的执行时间
  • propertyName 动画作用对象的属性名字
  • repeatCount 重复次数,第一次执行不算做重复次数(已2为例,总共执行3次动画)。
  • repeatMode 重复模式,1、reverse 表示执行一次动画之后反方向来一次;2、restart 执行一次动画之后从头再来。
  • valueFrom 属性起始值
  • valueTo 属性结束值
  • valueType 表示要操作的属性类型,有intType、floatType、colorType、pathType。
  • 还有一个startOffset属性,表示延迟时间。
下边就要使用动画了,使用起来也很方便。
findViewById(R.id.main_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {//加载xml文件中的动画 Animator animator =AnimatorInflater.loadAnimator(MainActivity.this, R.animator.test); //设置动画要操作的属性 animator.setTarget(imageView); //执行动画 animator.start(); } });

就是这么简单。
(2)、在代码中使用
在代码中使用也很简单
/** * 创建动画 */ public voidinitAnimator(){ //创建ObjectAnimator对象并且设置要操作的属性和属性值的变化, //注:最后一个参数属性值为可变数组参数 ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView,"translationX",0.0f,200.0f); //设置重复次数为2 objectAnimator.setRepeatCount(2); //设置重复模式为逆向重复 objectAnimator.setRepeatMode(ValueAnimator.REVERSE); //动画开始 objectAnimator.start(); }

效果一样就不再贴图了。
3. propertyName常用的几种
  • translationX、translationY 这组主要控制View相对于父布局平移距离
  • rotation、rotationX、rotationY 这组控制旋转
  • scaleX、scaleY 这组控制X 、Y轴方向的缩放
  • pivotX、pivotY 缩放和旋转的支点,默认为View的中心
  • alpha 透明度(0~1)
  • x、y 在父控件中的位置(注意和translationX、translationY的区分)
    其实这就是View里面的那几个属性
    Android属性动画的学习_ObjectAnimator
    文章图片

    3. 刚开始的时候遗留了一个修改TextView宽度的问题
    现在解决问题,TextView是有setWidth方法的,但是为什么不能修改宽度呢?看一下setWidth()做了什么
public void setWidth(int pixels) { mMaxWidth = mMinWidth = pixels; mMaxWidthMode = mMinWidthMode = PIXELS; requestLayout(); invalidate(); }

这个方法可以看到并不是修改了TextView的宽度,只是重新给 mMaxWidth 、mMinWidth 赋值。
对于这种情况3种解决方案
  • 给对象加上get和set方法
  • 自己写一个包装类增加set和get方法
  • 使用ValueAnimator监听过程自己修改
第一种肯定不现实啊,我们没法修改源码。
简单说下第二种,先写一个包装类
package com.mine.blog; import android.widget.TextView; /** * Created by mine on 2015/12/14. */ public class TextViewPack {TextView textView; //构造方法传入要修改的textView public TextViewPack(TextView textView){ this.textView = textView; } public void setWidth(int width){ //修改宽度 textView.getLayoutParams().width = width; //重绘 textView.requestLayout(); } public int getWidth(){ //获取宽度,此处如果用extView.getLayoutParams().width获取的话, // 当layout_width属性的值为wrap_content、match_parent时获取到的是定义的常量值不是精确的宽度 return textView.getWidth(); } }

然后重新修改我们的项目在布局中增加一个textView,代码文章后会有下载地址。Button的点击事件里面的方法修改为modifyWidth
/** * 修改宽度 */ publicvoid modifyWidth(){ TextViewPack textViewPack = new TextViewPack(textView); //创建ObjectAnimator对象并且设置要操作的属性和属性值的变化, //注:最后一个参数属性值为可变数组参数,Log.d("mine","获取的宽度"+textViewPack.getWidth()); ObjectAnimator objectAnimator = ObjectAnimator.ofInt(textViewPack,"width",textViewPack.getWidth(),500). setDuration(2000); //动画开始 objectAnimator.start(); }

就是这么简单完美解决。
Android属性动画的学习_ObjectAnimator
文章图片

代码下载地址:http://download.csdn.net/detail/u010547228/9354467

    推荐阅读