最近刚学习了下属性动画,做个记录。
【Android属性动画的学习_ObjectAnimator】1. ObjectAnimator的概述和使用限制
ObjectAnimator继承自ValueAnimator,在使用中会有一些限制
- 使用的对象必须要有setXXX(xxx)方法,比如View的setTranslationX(float translationX)。
- 在某些情况下还需要getXXX()方法,比如需要修改一个TextView的宽度,没有提供初始width的话,就需要width属性有int getWidth()方法。(注:有些时候直接修改width会发现不管用,这个后边详解)
- 属性动画的Android3.0之后才有的,3.0之前使用的话需要添加一个nineoldandroids库。
先提出一个需求:点击按钮安卓小机器人横向移动200,重复2次。
文章图片
布局很简单,只有两个空间
(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里面的那几个属性
文章图片
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();
}
就是这么简单完美解决。
文章图片
代码下载地址:http://download.csdn.net/detail/u010547228/9354467
推荐阅读
- 多渠道|Android 组件化在公用Module里实现多渠道打包配置
- Android基础|EventBus源码分析之订阅-发布模型
- Android基础|Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)
- HandlerThread(子线程也可以有消息传递机制)
- android ViewId自动注解使用详解(ViewInject)
- Android|Android属性动画 Property animation
- JNI与底层调用-1
- #|FutureTask 使用场景介绍
- #|静态内部类创建单例的实现和优点
- #|View的三大流程是什么,加以简单说明