android 动画篇

动画这块可谓是经常用,但是没怎么下功夫研究过,今天就自己总结下,当做备忘录。



是不是看完图,发现我艹,怎么知识点还那么多,我们就挨个慢慢缕一缕。

补间动画

感谢分享
https://www.jianshu.com/p/733532041f46

根据不同的动画效果,补间动画分为4种动画:
平移动画(Translate)
缩放动画(scale)
旋转动画(rotate)
透明度动画(alpha)
可以从xml读取,也可以直接代码上手。

XML写法





// 采用 标签表示平移动画



布局应用

        ImageView img = (ImageView)findViewById(R.id.img);
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.view_translate);
        img.startAnimation(animation);

如果用代码去写

       上面那些公用属性 在TranslateAnimation都能找到set这里就不写全了
         ImageView img = (ImageView)findViewById(R.id.img);
        TranslateAnimation translateAnimation = new TranslateAnimation(100, 600, 100, 600);
        translateAnimation.setDuration(3000);
        translateAnimation.setRepeatCount(2);
        img.startAnimation(translateAnimation);

缩放


// 采用 标签表示是缩放动画


  ImageView img = (ImageView)findViewById(R.id.img);
        ScaleAnimation scaleAnimation = new ScaleAnimation(0, 2, 0, 2, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        scaleAnimation.setDuration(3000);
      img.startAnimation(scaleAnimation);

//构造函数
ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
 参数介绍
// 1. fromX :动画在水平方向X的结束缩放倍数
        // 2. toX :动画在水平方向X的结束缩放倍数
        // 3. fromY :动画开始前在竖直方向Y的起始缩放倍数
        // 4. toY:动画在竖直方向Y的结束缩放倍数
        // 5. pivotXType:缩放轴点的x坐标的模式
        // 6. pivotXValue:缩放轴点x坐标的相对值
        // 7. pivotYType:缩放轴点的y坐标的模式
        // 8. pivotYValue:缩放轴点y坐标的相对值

        // pivotXType = Animation.ABSOLUTE:缩放轴点的x坐标 =  View左上角的原点 在x方向 加上 
     //pivotXValue数值的点(y方向同理)
        // pivotXType = Animation.RELATIVE_TO_SELF:缩放轴点的x坐标 = View左上角的原点 在x方向 加上 
 //    自身宽度乘上pivotXValue数值的值(y方向同理)
        // pivotXType = Animation.RELATIVE_TO_PARENT:缩放轴点的x坐标 = View左上角的原点 在x方向 加 
   //上 父控件宽度乘上pivotXValue数值的值 (y方向同理)



旋转


// 采用 标签表示是旋转动画



Button mButton = (Button) findViewById(R.id.Button);
        // 步骤1:创建 需要设置动画的 视图View

          Animation rotateAnimation = new RotateAnimation(0,270,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
        // 步骤2:创建旋转动画的对象 & 设置动画效果:旋转动画对应的Animation子类为RotateAnimation
        // 参数说明:
        // 1. fromDegrees :动画开始时 视图的旋转角度(正数 = 顺时针,负数 = 逆时针)
        // 2. toDegrees :动画结束时 视图的旋转角度(正数 = 顺时针,负数 = 逆时针)
        // 3. pivotXType:旋转轴点的x坐标的模式
        // 4. pivotXValue:旋转轴点x坐标的相对值
        // 5. pivotYType:旋转轴点的y坐标的模式
        // 6. pivotYValue:旋转轴点y坐标的相对值

        // pivotXType = Animation.ABSOLUTE:旋转轴点的x坐标 =  View左上角的原点 在x方向 加上 pivotXValue数值的点(y方向同理)
        // pivotXType = Animation.RELATIVE_TO_SELF:旋转轴点的x坐标 = View左上角的原点 在x方向 加上 自身宽度乘上pivotXValue数值的值(y方向同理)
        // pivotXType = Animation.RELATIVE_TO_PARENT:旋转轴点的x坐标 = View左上角的原点 在x方向 加上 父控件宽度乘上pivotXValue数值的值 (y方向同理)

        rotateAnimation.setDuration(3000);
        // 固定属性的设置都是在其属性前加“set”,如setDuration()
        mButton.startAnimation(rotateAnimation);
        // 步骤3:播放动画


渐隐动画


// 采用 标签表示是透明度动画


渐隐代码

Button mButton = (Button) findViewById(R.id.Button);
        // 步骤1:创建 需要设置动画的 视图View
      Animation alphaAnimation = new AlphaAnimation(1,0);
        // 步骤2:创建透明度动画的对象 & 设置动画效果:透明度动画对应的Animation子类为AlphaAnimation
        // 参数说明:
        // 1. fromAlpha:动画开始时视图的透明度(取值范围: -1 ~ 1)
        // 2. toAlpha:动画结束时视图的透明度(取值范围: -1 ~ 1)
       alphaAnimation.setDuration(3000);
        // 固定属性的设置都是在其属性前加“set”,如setDuration()

        mButton.startAnimation(alphaAnimation);
        // 步骤3:播放动画

我们发现其实用补间动画还是挺方便的,但是为什么后面又出了属性动画呢?是因为补间动画有一个致命缺点,比如我们利用位移动画来测试一下

  ImageView img = (ImageView) findViewById(R.id.img);
        TranslateAnimation translateAnimation = new TranslateAnimation(100, 600, 100, 600);
        translateAnimation.setDuration(3000);
        translateAnimation.setFillAfter(true);
        img.startAnimation(translateAnimation);
        img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "我被点到了", Toast.LENGTH_SHORT).show();
            }
        });

我们在点击图片的时候打出一句吐司,结果发现在图片位移到下方的时候,我们点图片木有吐司,在点击图片原来位置,也就是红圈位置,居然弹出来了吐司。,补间动画只是表面上实现了平移,旋转,渐变,缩放,实际上属性值不变,看起来位移走了,实际还在原来地方。


动画的监听
 translateAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                //动画开始

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                //动画结束

            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                //重复的时候

            }
        });

差值器Interpolator和估值器TypeEvaluator

感谢分享
https://blog.csdn.net/carson_ho/article/details/72863901


插值器(Interpolator)

  • 定义:一个接口
  • 作用:设置 属性值 从初始值过渡到结束值 的变化规律
    1. 如匀速、加速 & 减速 等等
    2. 即确定了 动画效果变化的模式,如匀速变化、加速变化 等等

主要实现实现非线性运动的动画效果
非线性运动:动画改变的速率不是一成不变的,如加速 & 减速运动都属于非线性运动
差值器如何在动画中设置呢?

  • 代码方式
 Interpolator overshootInterpolator = new OvershootInterpolator();
        alphaAnimation.setInterpolator(overshootInterpolator);

  • XML模式
  android:interpolator="@android:anim/overshoot_interpolator"

android 为我们提供了很多种内置的差值器,系统默认的插值器是AccelerateDecelerateInterpolator,即先加速后减速


内置差值器

自定义差值器
本质:根据动画的进度(0%-100%)计算出当前属性值改变的百分比
具体使用:自定义插值器需要实现 Interpolator / TimeInterpolator接口 & 复写getInterpolation()
补间动画 实现 Interpolator接口;属性动画实现TimeInterpolator接口
TimeInterpolator接口是属性动画中新增的,用于兼容Interpolator接口,这使得所有过去的Interpolator实现类都可以直接在属性动画使用,

public class MyInterpolator implements Interpolator {
    @Override
    public float getInterpolation(float v) {
//业务逻辑,返回值就是要改变的属性的百分比
      return xxx

    }
}

估值器(TypeEvaluator)

定义:一个接口
作用:设置 属性值 从初始值过渡到结束值 的变化具体数值
插值器(Interpolator)决定 值 的变化规律(匀速、加速等),即决定的是变化趋势;而接下来的具体变化数值则交给 而估值器 是属性动画特有的属性。用来协助插值器 实现非线性运动的动画效果。
内置估值器有
IntEvaluator:以整型的形式从初始值 - 结束值 进行过渡
FloatEvaluator:以浮点型的形式从初始值 - 结束值 进行过渡
ArgbEvaluator:以Argb类型的形式从初始值 - 结束值 进行过渡

设置方式为

ObjectAnimator anim = ObjectAnimator.ofObject(myView2, "height", new Evaluator(),1,3);

其实我也寻思很久 这个估值器能干嘛,因为也一直没用过,个人觉得估值器最大作用就是根据一个动画每时每刻获取当前动画的进度值。如果说这玩意能干嘛,我们就写个小例子来实验下。

 @Override
    public Object evaluate(float v, Object o, Object t1) {
        return null;
    }

你可能感兴趣的:(android 动画篇)