Android动画机制与使用技巧

2016-08-09  本文已影响268人  14cat

`# 前言

目录

Android动画机制与使用技巧.png

Android View动画框架


Android属性动画

ObjectAnimator

// 简单的位移动画
ObjectAnimator animator = ObjectAnimator.ofFloat(
  view,
  "translationX",
  300
);
animator.setDuration(300);
animator.start();
属性 作用
translationX、translationY 作为增量控制View对象从它布局容器的左上角坐标偏移的位置
rotation、rotationX、rotationY 控制View对象围绕支点进行2D和3D旋转
scaleX、scaleY 控制View对象围绕支点进行2D缩放
pivotX、pivotY 控制View对象的支点位置,围绕这个支点进行旋转和缩放变换处理,默认情况下,该支点的位置就是View对象的中心点
x、y 描述View对象在他容器的最终位置,是最初左上角坐标和translationX、translationY值得累计和
alpha View对象的透明度,默认为1,0为完全透明
private static class WrapperView {
  private View mTraget;

  public WrapperView(View target) {
    mTarget = target;
  }

  public int getWidth() {
    return mTarget.getLayoutParams().width;
  }

  public void setWidth(int width) {
    mTarget.getLayoutParams().width = width;
    mTarget.requestLayout();
  }
}
ViewWrapper wrapper = new ViewWrapper(mButton);
ObjectAnimator.ofInt(wrapper,"width",500).setDuration(5000).start();

PropertyValuesHolder

PropertyValuesHolder pv1 = PropertyValuesHolder.ofFloat("translationX", 300);
PropertyValuesHolder pv2 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
PropertyValuesHolder pv3 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);
ObjectAnimator.ofPropertyValuesHolder(view, pv1,pv2,pv3).setDuration(2000).start();

ValueAnimator

ValueAnimator animator = ValueAnimator.ofFloat(0,100);
animator.setTarget(view);
animator.setDuration(1000);
animator.start();
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator animation) { 
    Float value = (Float) animation.getAnimatedValue(); 
    //do the animation! 
  }
});

动画事件监听

 ObjectAnimator animator = ObjectAnimator.ofFloat(view, "alpha", 0.5f);
        animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationCancel(Animator animation) {
                super.onAnimationCancel(animation);
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
                super.onAnimationRepeat(animation);
            }

            @Override
            public void onAnimationStart(Animator animation) {
                super.onAnimationStart(animation);
            }

        });

AnimatorSet

ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, "translationX", 300f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(view, "scaleX", 1f, 0f, 1f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(view, "scaleY", 1f, 0f, 1f);
AnimatorSet set = new AnimatorSet();
set.setDuration(2000);
set.playTogether(animator1,animator2,animator3);
set.start();
API 作用
playTogether() 一起播放
playSequentially() 顺序播放
animSet.play(anim1).with(anim2) anim1和anim2一起播放
animSet.play(anim1).before(anim2) anim1在anim2之前播放
animSet.play(anim1).after(anim2) anim1在anim2之后播放

XML中使用属性动画

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:propertyName="scaleX"
    android:valueFrom="1.0"
    android:valueTo="2.0"
    android:valueType="floatType"/>
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.scalex);
anim.setTarget(view);
anim.start();

View的animate方法

view.animate()
                .alpha(0)
                .y(300)
                .setDuration(3000)
                .withStartAction(new Runnable() {
                    @Override
                    public void run() {

                    }
                })
                .withEndAction(new Runnable() {
                    @Override
                    public void run() {

                    }
                }).start();

Android布局动画

android:animateLayoutChanges="true"
LinearLayout ll = (LinearLayout)findViewById(R.id.ll);
// 设置过渡动画
ScaleAnimation sa = new ScaleAnimation(0,1,0,1);
sa.setDuration(2000);
// 设置布局动画的显示属性
LayoutAnimationController lac = new LayoutAnimationController(sa, 0.5F);
lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
// 为ViewGroup设置布局动画
ll.setLayoutAnimation(lac);


自定义动画

/**
  * 电视机关闭效果
  */
public class CustomTV extends Animation {

    // 中心点坐标
    private int mCenterWidth;
    private int mCenterHeight;

    /**
      * 实现初始化操作
      */
    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        setDuration(1000);
        // 动画结束后保留状态
        setFillAfter(true);
        // 设置默认插值器
        setInterpolator(new AccelerateInterpolator());
        mCenterWidth = width / 2;
        mCenterHeight = height / 2;
    }

    /**
      * 参数1:interpolatedTime:插值器的时间因子,由动画当前完成的百分比和当前时间所对应的插值计算得来,取值范围0到1.0
      * 参数2:Transformation:矩阵的封装类,一般使用这个类获得当前的矩阵对象
      */
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        // 获得当前矩阵对象
        final Matrix matrix = t.getMatrix();
        // 通过改变matrix对象,实现动画效果
        matrix.preScale(1, 1 - interpolatedTime, mCenterWidth, mCenterHeight);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读