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次。
这里写图片描述
布局很简单,只有两个空间

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/main_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <Button
        android:id="@+id/main_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="执行动画" />
</LinearLayout>

(1)、在xml文件中使用

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together">
    <objectAnimator
        android:duration="2000"
        android:propertyName="translationX"
        android:repeatCount="2"
        android:repeatMode="restart"
        android:valueFrom="0"
        android:valueTo="200" 
        android:valueType="floatType"/>
</set>

大概说一下各个属性的意思:

  • 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 void  initAnimator(){
       //创建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里面的那几个属性
    这里写图片描述
    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

 /**
     * 修改宽度
     */
    public  void 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();
    }

就是这么简单完美解决。
这里写图片描述
代码下载地址:http://download.csdn.net/detail/u010547228/9354467

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值