最近刚学习了下属性动画,做个记录。
1. ObjectAnimator的概述和使用限制
ObjectAnimator继承自ValueAnimator,在使用中会有一些限制
2. ObjectAnimator使用方式
先提出一个需求:点击按钮安卓小机器人横向移动200,重复2次。
布局很简单,只有两个空间
<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文件中使用
<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>
大概说一下各个属性的意思:
下边就要使用动画了,使用起来也很方便。
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常用的几种
public void setWidth(int pixels) {
mMaxWidth = mMinWidth = pixels;
mMaxWidthMode = mMinWidthMode = PIXELS;
requestLayout();
invalidate();
}
这个方法可以看到并不是修改了TextView的宽度,只是重新给 mMaxWidth 、mMinWidth 赋值。
对于这种情况3种解决方案
第一种肯定不现实啊,我们没法修改源码。
简单说下第二种,先写一个包装类
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