android 帧动画,补间动画,属性动画的简单总结

论坛 期权论坛 脚本     
niminba   2021-5-16 20:40   12   0

帧动画——FrameAnimation

将一系列图片有序播放,形成动画的效果。其本质是一个Drawable,是一系列图片的集合,本身可以当做一个图片一样使用

在Drawable文件夹下,创建animation-list为根节点的资源文件

<animation-list android:oneshot="false">
 <item android:drawable="@drawable/img1" android:duration="100"/>
 <item android:drawable="@drawable/img2" android:duration="100"/>
 <item android:drawable="@drawable/img3" android:duration="100"/>
 <item android:drawable="@drawable/img4" android:duration="100"/>
</animation-list>

oneshot:是否只播放一次     

drawable:一帧引用的图片

duration:一帧播放的时间

播放动画

将动画作为控件的背景

((AnimationDrawable)view.getBackground()).start();

Animation常用属性

duration:动画时间                  

repeatCount:重复次数 infinite无限次

fillAfter:是否停止在最后一帧

repeatMode:重复模式     值:restart重新开始,reserve反复

startOffset:开始延迟时间

补间动画 Tween Animation

只能应用于View对象,只支持部分属性,View animation值改变了View绘制的位置,并没有改变对象本身的真实位置

可以使用XML定义也可以使用代码定义     XML定义的动画放在/res/anim/文件夹内

开始动画 通过view的startAnimation(Animation a)  参数定义的动画

四种补间动画通过XML定义

AlphaAnimation:透明度动画

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
 android:fromAlpha="0"
 android:toAlpha="1"
 android:duration="2000">
 <!--
 fromAlpha 起始透明度 0为完全透明 1为不透明 0~1之间的浮点值
 toAlpha 结束透明度
 duration 动画运行时间 单位毫秒
 -->
</alpha>
AlphaAnimation alphaAnimation=null;
 //加载XML中的动画XML文件
 alphaAnimation= (AlphaAnimation) AnimationUtils.loadAnimation(MainActivity.this, R.anim.anim_alpha);
 //常用属性设置 各种动画通用
 alphaAnimation.setRepeatCount(3);//执行动画效果结束后重复执行3次 一共4次
 alphaAnimation.setRepeatMode(Animation.REVERSE);//重复模式
 //动画结束是否停止在最后一帧
 alphaAnimation.setFillAfter(true);
 //动画结束是否停止在第一帧
 alphaAnimation.setFillBefore(false);
 //设置插值器 动画执行速度 变速 加减速。。
 //AccelerateInterpolator减速
 //DecelerateInterpolator加速
 alphaAnimation.setInterpolator(new AccelerateDecelerateInterpolator());

ScaleAnimation:缩放动画

代码加载的方式和方法的使用与AlphaAnimation一样

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
 android:toXScale="1"
 android:toYScale="1"
 android:fromXScale="0.1"
 android:fromYScale="0.1"
 android:pivotY="0%"
 android:pivotX="0%"
 android:duration="2000">
 <!--
  浮点值 表示倍数 自身几倍
  fromXScale 动画在X轴以自身几倍伸缩开始
  toXScale 动画在X轴以自身几倍伸缩结束
  fromYScale 动画在Y轴以自身几倍伸缩开始
  toYScale 动画在Y轴以自身几倍伸缩结束
  pivotX 动画相对于控件自身的X坐标的开始位置
  pivotY 动画相对于控件自身的Y坐标的开始位置
  0% 0% 表示控件左上角 为0,0原点坐标
 -->
</scale>

TranslateAnimation:平移动画

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
 android:fromXDelta="-100%p"
 android:fromYDelta="0"
 android:toXDelta="100%p"
 android:toYDelta="0"
 android:duration="2000">
 <!--
  fromXDelta x轴起始位置
  toXDelta X轴结束位置
  fromYDelta y轴起始位置
  toYDelta y轴结束位置
  100%p 表示相对于父级
  100%相对于自身
-->
</translate>

RotateAnimation:旋转动画

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
 android:fromDegrees="0"
 android:toDegrees="360"
 android:duration="2000"
 android:pivotX="50%"
 android:pivotY="50%"
android:interpolator="@android:anim/accelerate_decele给某个控件的某个属性

使用xml

<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
 android:duration="1000"
 android:valueFrom="0"
 android:valueTo="300"
 android:valueType="intType"
android:interpolator="@android:interpolator/overshoot">
 <!--
 valueFrom 起始值
 valueTo 结束值
 valueType 值的类型
 intType整数值、floatType浮点值、colorType颜色值
 interpolator插值器
 -->
</animator>
ValueAnimator valueAnimator=null;
 //通过AnimatorInflater.loadAnimator()加载xml 创建ValueAnimator
 valueAnimator= (ValueAnimator) AnimatorInflater.loadAnimator(this,R.animator.animator_value);
 //动画执行时间
 valueAnimator.setDuration(3000);
 //值改变监听
 valueAnimator.addUpdateListener(listener);
 //开始动画
 valueAnimator.start();
private ValueAnimator.AnimatorUpdateListener listener=new ValueAnimator.AnimatorUpdateListener() {
 @Override
 public void onAnimationUpdate(ValueAnimator animation) {
       //获取值
  int value= (int) animation.getAnimatedValue();
       //btnValueAnimator为测试控件
        //设置控件X轴平移
        btnValueAnimator.setTranslationX(value);
 }
 };

使用代码

/**
  * valueAnimator 单个值
  */
 //代码创建 ValueAnimator类自身的方法
 //ofFloat值类型float
 ValueAnimator valueAnimator=ValueAnimator.ofFloat(0,1);
 //ofInt值类型int 从0~300
 valueAnimator=ValueAnimator.ofInt(0,300);
 //也可以用来设置颜色 在颜色改变过程中会将颜色变化情况显示出来
 //红色到蓝色的改变过程 显示N种颜色
 valueAnimator=ValueAnimator.ofInt(Color.RED,Color.BLUE);
 //ofArgb设置颜色 如果无法使用 是的sdk版本低了
 //这个方法改变颜色过程中只显示红色和蓝色
 //valueAnimator=ValueAnimator.ofArgb(Color.RED,Color.BLUE);
 //设置插值器
 valueAnimator.setInterpolator(new CycleInterpolator());
 /**
  *
  * ValueAnimator.ofPropertyValuesHolder 设置多个值
  */
 //设置动画属性 参数1:名字 参数2,3值的变化区间
 PropertyValuesHolder alphaHolder=PropertyValuesHolder.ofFloat("alpha",0f,1f);
 PropertyValuesHolder widthHolder=PropertyValuesHolder.ofInt("width",0,300);
 //ValueAnimator.ofPropertyValuesHolder 添加holder 创建动画
valueAnimator=ValueAnimator.ofPropertyValuesHolder(alphaHolder,widthHolder);
 //动画执行时间
 valueAnimator.setDuration(3000);
 //值改变监听
 valueAnimator.addUpdateListener(listener);
private ValueAnimator.AnimatorUpdateListener listener=new ValueAnimator.AnimatorUpdateListener() {
 @Override
 public void onAnimationUpdate(ValueAnimator animation) {
  /**
  * 单个值获取 getAnimatedValue取出变化值 根据设置类型强转
  * btnValueAnimator 测试用的button
  */
//  int value= (int) animation.getAnimatedValue();
//  btnValueAnimator.setTranslationX(value);横坐标平移
//  float value= (float) valueAnimator.getAnimatedValue();
//  btnValueAnimator.setAlpha(value);透明度改变
//  int value= (int) animation.getAnimatedValue();
//  btnValueAnimator.setTextColor(value);文字颜色改变
  /**
  * PropertyValuesHolder存了多个值 通过名字获取 强制转换
  */
  float alpha= (float) valueAnimator.getAnimatedValue("alpha");
  int width= (int) valueAnimator.getAnimatedValue("width");
  btnValueAnimator.setAlpha(alpha);//改变透明度
  //图像绘制 左边不变从右边慢慢增加
  //修改控件的width height不能使用setWidth或setHeight
  btnValueAnimator.setRight(width);
  //btnValueAnimator.setBottom(width);

 }
 };

ObjectAnimator:

继承自ValueAnimator,要指定一个对象及该对象的一个属性,当属性值计算完成时自动设置为该对象的相应属性,不需要设置监听,底层自动完成,一般会用ObjectAnimator来改变某一对象的某一属性

//用来测试的button
 Button btnObjectAnimator= (Button) findViewById(R.id.btn_object_animator);
 //加载动画
 ObjectAnimator objectAnimator= (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.animator_object);
 //绑定控件
 objectAnimator.setTarget(btnObjectAnimator);
 //参数1 绑定控件 参数2 设置 属性 参数3 设置值
 objectAnimator=ObjectAnimator.ofInt(btnObjectAnimator,"textColor",Color.RED);
 //PropertyValuesHolder设置多个属性
 PropertyValuesHolder translationXHolder=PropertyValuesHolder.ofFloat("translationX",0,300);
 PropertyValuesHolder translationYHolder=PropertyValuesHolder.ofFloat("translationY",0,200);
objectAnimator=ObjectAnimator.ofPropertyValuesHolder(btnObjectAnimator,translationXHolder,translationYHolder);
 objectAnimator.setDuration(3000);
     //开始动画
     objectAnimator.start();

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持社区!

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP