<animator>
- 计算动画值
- 将动画值应用到对象和属性上
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:startOffset 设置动画执行之前的等待时长,单位为毫秒
- android:repeatCount 设置动画重复执行的次数,默认为0,即不重复;可设为-1或infinite,表示无限重复
-
android:repeatMode 设置动画重复执行的模式,可设为以下两个值其中之一:
- restart 动画重复执行时从起点开始,默认为该值
- reverse 动画会反方向执行
-
android:valueFrom 动画开始的值,可以为int值、float值或color值
-
android:valueTo 动画结束的值,可以为int值、float值或color值
-
android:valueType 动画值类型,若为color值,则无需设置该属性
- intType 指定动画值,即以上两个value属性的值为整型
- floatType 指定动画值,即以上两个value属性的值为浮点型,默认值
-
android:interpolator 设置动画速率的变化,比如加速、减速、匀速等,需要指定Interpolator资源。具体用法在View Animation篇已经讲过,这里不再重复
<!-- res/animator/value_animator.xml --> <?xml version="1.0" encoding="utf-8"?> <animator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="3000" android:valueFrom="100" android:valueTo="20" android:valueType="intType" />
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_btn_normal" android:onClick="onScaleWidth" android:text="点我" android:textColor="@android:color/white" />
public void onScaleWidth(final View view) { // 获取屏幕宽度 final int maxWidth = getWindowManager().getDefaultDisplay().getWidth(); ValueAnimator valueAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.value_animator); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animator) { // 当前动画值,即为当前宽度比例值 int currentValue = (Integer) animator.getAnimatedValue(); // 根据比例更改目标view的宽度 view.getLayoutParams().width = maxWidth * currentValue / 100; view.requestLayout(); } }); valueAnimator.start(); }
<objectAnimator>
- android:propertyName 目标对象的属性名,要求目标对象必须提供该属性的setter方法,如果动画的时候没有初始值,还需要提供getter方法
<!-- res/animator/object_animator.xml --> <?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="3000" android:propertyName="width" android:valueFrom="100" android:valueTo="20" android:valueType="intType" />
private static class ViewWrapper { private View target; //目标对象 private int maxWidth; //最长宽度值 public ViewWrapper(View target, int maxWidth) { this.target = target; this.maxWidth = maxWidth; } public int getWidth() { return target.getLayoutParams().width; } public void setWidth(int widthValue) { //widthValue的值从100到20变化 target.getLayoutParams().width = maxWidth * widthValue / 100; target.requestLayout(); } }
public void onScaleWidth(View view) { // 获取屏幕宽度 int maxWidth = getWindowManager().getDefaultDisplay().getWidth(); // 将目标view进行包装 ViewWrapper wrapper = new ViewWrapper(view, maxWidth); // 将xml转化为ObjectAnimator对象 ObjectAnimator objectAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.object_animator); // 设置动画的目标对象为包装后的view objectAnimator.setTarget(wrapper); // 启动动画 objectAnimator.start(); }
- alpha:透明度,默认为1,表示不透明,0表示完全透明
- pivotX 和 pivotY:旋转的轴点和缩放的基准点,默认是View的中心点
- scaleX 和 scaleY:基于pivotX和pivotY的缩放,1表示无缩放,小于1表示收缩,大于1则放大
- rotation、rotationX 和 rotationY:基于轴点(pivotX和pivotY)的旋转,rotation为平面的旋转,rotationX和rotationY为立体的旋转
- translationX 和 translationY:View的屏幕位置坐标变化量,以layout容器的左上角为坐标原点
- x 和 y:View在父容器内的最终位置,是左上角坐标和偏移量(translationX,translationY)的和
<set>
- android:ordering 设置动画的时序关系,取值可为以下两个值之一:
- together 动画同时执行,默认值
- sequentially 动画按顺序执行
<!-- res/animator/animator_set.xml --> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="together"> <objectAnimator android:duration="3000" android:propertyName="width" android:valueFrom="100" android:valueTo="20" android:valueType="intType" /> <objectAnimator android:duration="3000" android:propertyName="marginTop" android:valueFrom="0" android:valueTo="100" android:valueType="intType" /> </set>
private static class ViewWrapper { private View target; private int maxWidth; public ViewWrapper(View target, int maxWidth) { this.target = target; this.maxWidth = maxWidth; } public int getWidth() { return target.getLayoutParams().width; } public void setWidth(int widthValue) { target.getLayoutParams().width = maxWidth * widthValue / 100; target.requestLayout(); } public void setMarginTop(int margin) { LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) target.getLayoutParams(); layoutParams.setMargins(0, margin, 0, 0); target.setLayoutParams(layoutParams); } }
public void onScaleWidth(View view) { // 获取屏幕宽度 int maxWidth = getWindowManager().getDefaultDisplay().getWidth(); // 将目标view进行包装 ViewWrapper wrapper = new ViewWrapper(view, maxWidth); // 将xml转化为ObjectAnimator对象 AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.animator_set); // 设置动画的目标对象为包装后的view animatorSet.setTarget(wrapper); // 启动动画 animatorSet.start(); }