Android开发中基础动画技巧的应用(三)

简介: Android开发中基础动画技巧的应用

三、Property Animation动画的应用


       在前面介绍的View Animation动画体系中,虽然使用起来十分方便,但也有十分多的局限性,例如只能支持透明度,位置,缩放和旋转动画,并且在动画执行时,视图实际上并没有移动,如果需要做动画的是可以用户交互的按钮控件则会带来很多的不便。在Android3.0之后,系统推出了Property Animation动画,这种机制可以将对象任意属性的修改实现过渡动画效果。


1.ObjectAnimator动画的应用


       ObjectAnimator是Property Animation动画体系中最简单易用的一种方式,开发者只需要设置要改变的属性值和一些动画参数即可使用,例如若要实现视图以y方向为轴进行旋转操作,使用 如下代码实现:


//创建属性动画对象

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(animationImageView,"rotationY",0,360,0);

//设置动画时间

objectAnimator.setDuration(3000);

//开始动画

objectAnimator.start();

ObjectAnimator类的静态方法ofFloat()用于创建属性动画实例本身,与其类似的方法还有ofInt()与ofObject()。需要注意,这些方法第1个参数为要执行动画的视图,第2个参数为要发生动画改变的属性名,从第3个参数开始后面可以添加任意多个值,这些值代表了属性值改变的路径,例如上面示例代码表示将视图以y方向为轴从0°开始旋转到360°后再旋转回0°。


image.png


   ObjectAnimator类继承自ValueAnimator,ValueAnimator类则更加灵活自由,其可以为自定义类的自定义属性做动画处理,后面会介绍,ValueAnimator类中提供了许多动画配置的方法,常用如下:


//设置动画执行时间

public ValueAnimator setDuration(long duration);

//设置延时执行

public void setStartDelay(long startDelay);

//设置动画循环次数

public void setRepeatCount(int value);

//设置动画循环模式

public void setRepeatMode(int value);

//设置动画执行时序模式

public void setInterpolator(TimeInterpolator value);

//开始执行动画

public void start();

//结束动画

public void end();

//取消动画

public void cancel();

//恢复动画

public void resume();

//暂停动画

public void pause();

需要注意,使用ObjectAnimator创建动画的属性必须实现set和get方法。


2.ValueAnimator实现更加灵活的自定义动画


       ObjectAnimator是ValueAnimator的子类,可以理解,ValueAnimator要比ObjectAnimator更加灵活自由,其可以实现任意自定义属性的动画行为。示例代码如下:


//创建ValueAnimator实例

ValueAnimator valueAnimator = new ValueAnimator();

//设置动画的路径值

valueAnimator.setFloatValues(0,200,100,300,0);

//设置动画的执行时间

valueAnimator.setDuration(6000);

//添加动画执行监听

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

  //这个方法会在每次动画值改变时调用

  @Override

  public void onAnimationUpdate(ValueAnimator valueAnimator) {

      //设置视图的横坐标

      animationImageView.setX((Float) valueAnimator.getAnimatedValue());

  }

});

//执行动画

valueAnimator.start();

如果运行上面代码,可以看到视图在6s内从x坐标点为0的地方平移到200后再次回到100后再次移动到300最终回到原点0。


      上面的示例代码只是演示了ValueAnimator的工作原理,开发者可以在onAnimationUpdate()方法中进行任意属性的修改。仅从上面演示代码并不能体现出ValueAnimator的强大之处,可以通过实现类似抛物线的动画来理解ValueAnimator的灵活之处,示例代码如下:


//创建ValueAnimator实例

final ValueAnimator animator = new ValueAnimator();

//示例进行抛物线动画 让控件从(0,0)点位置移动到x轴为400的位置,y轴方向做自由落体

animator.setObjectValues(new Point(0,0),new Point(400,0));

//设置动画时间

animator.setDuration(4000);

//设置时序为线性函数

animator.setInterpolator(new LinearInterpolator());

//由于抛物线运动在x轴和y轴上的速度变化并不相同 需要自定义枚举器

animator.setEvaluator(new TypeEvaluator<Point>() {

  //这个枚举方法中传入的v值为动画执行的比例 0为初始状态 1为动画执行完成 开发者根据这个值模拟抛物线坐标

  @Override

  public Point evaluate(float v, Point o,Point t1) {

      //创建Point对象 模拟抛物运动

      Point point = new Point();

      point.x = (int)((v*8)*100);

      point.y = (int)((v*60)*(v*60)/4);

      return point;

  }

});

//监听动画执行

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

   @Override

   public void onAnimationUpdate(ValueAnimator valueAnimator) {

       //设置视图位置

       animationImageView.setX(((Point)valueAnimator.getAnimatedValue()).x);

       animationImageView.setY(((Point)valueAnimator.getAnimatedValue()).y);

  }

});

//执行动画

animator.start();

image.png


需要注意,Property Animation与View Animation最大的不同在于View Animation只是展示视图的界面动画,它并没有真正改变视图的属性,而Property Animation是实实在在的改变了发生动画控件的属性。


3.Property Animation动画的监听


       ValueAnimator对象可以使用addListener()方法来添加监听者,接口方法如下:


//动画监听接口

public interface AnimatorListener {

   //动画开始

   void onAnimationStart(Animator var1);

   //动画结束

   void onAnimationEnd(Animator var1);

   //动画取消

   void onAnimationCancel(Animator var1);

   //动画重复

   void onAnimationRepeat(Animator var1);

}

4.使用PropertyValuesHolder进行动画复合


       对于Property Animation,开发者可以通过ValueAnimator实现自定义的复合动画,也可以使用PropertyValuesHolder进行属性动画的复合操作,示例如下:


//创建子属性动画  翻转

PropertyValuesHolder holder = PropertyValuesHolder.ofFloat("rotationY",0,360,90);

//创建子属性动画  透明

PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("alpha",1,0,1);

//进行动画复合

ObjectAnimator objectAnimation = ObjectAnimator.ofPropertyValuesHolder(animationImageView,holder,holder2);

//执行动画

objectAnimation.setDuration(3000);

objectAnimation.start();


image.png

三、Drawable Animation动画的应用


       相比前两种动画模式,Drawable Animation动画要容易的多,其使用一组图像快速切换的原理来实现动画效果。


在Android Studio的drawable文件夹中添加一个animation文件,xml代码如下:


<?xml version="1.0" encoding="utf-8"?>

<animation-list xmlns:android="http://schemas.android.com/apk/res/android">

   <item android:drawable="@drawable/bird1" android:duration="200" />

   <item android:drawable="@drawable/bird2" android:duration="200" />

   <item android:drawable="@drawable/bird3" android:duration="200" />

   <item android:drawable="@drawable/bird4" android:duration="200" />

   <item android:drawable="@drawable/bird5" android:duration="200" />

   <item android:drawable="@drawable/bird6" android:duration="200" />

   <item android:drawable="@drawable/bird7" android:duration="200" />

   <item android:drawable="@drawable/bird8" android:duration="200" />

</animation-list>

将需要展示动画的视图背景设置为这个drawable文件,示例如下:


<ImageView

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:background="@drawable/anmi_draw_list"

       android:id="@+id/animatedImageView"/>

在需要开始动画时,调用如下代码即可:


//获取到drawable背景 调用start()方法开始动画

((AnimationDrawable)animationImageView.getBackground()).start();

image.png

目录
相关文章
|
12月前
|
Android开发 开发者
Android利用SVG实现动画效果
本文介绍了如何在Android中利用SVG实现动画效果。首先通过定义`pathData`参数(如M、L、Z等)绘制一个简单的三角形SVG图形,然后借助`objectAnimator`实现动态的线条绘制动画。文章详细讲解了从配置`build.gradle`支持VectorDrawable,到创建动画文件、关联SVG与动画,最后在Activity中启动动画的完整流程。此外,还提供了SVG绘制原理及工具推荐,帮助开发者更好地理解和应用SVG动画技术。
585 30
|
12月前
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
699 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
12月前
|
API Android开发 开发者
Android颜色渐变动画效果的实现
本文介绍了在Android中实现颜色渐变动画效果的方法,重点讲解了插值器(TypeEvaluator)的使用与自定义。通过Android自带的颜色插值器ArgbEvaluator,可以轻松实现背景色的渐变动画。文章详细分析了ArgbEvaluator的核心代码,并演示了如何利用Color.colorToHSV和Color.HSVToColor方法自定义颜色插值器MyColorEvaluator。最后提供了完整的源码示例,包括ColorGradient视图类和MyColorEvaluator类,帮助开发者更好地理解和应用颜色渐变动画技术。
381 3
|
7月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1375 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
7月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1003 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
7月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1097 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
8月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
861 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
7月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
376 0
|
8月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
1110 6
|
12月前
|
Android开发 开发者
Android SVG动画详细例子
本文详细讲解了在Android中利用SVG实现动画效果的方法,通过具体例子帮助开发者更好地理解和应用SVG动画。文章首先展示了动画的实现效果,接着回顾了之前的文章链接及常见问题(如属性名大小写错误)。核心内容包括:1) 使用阿里图库获取SVG图形;2) 借助工具将SVG转换为VectorDrawable;3) 为每个路径添加动画绑定属性;4) 创建动画文件并关联SVG;5) 在ImageView中引用动画文件;6) 在Activity中启动动画。文末还提供了完整的代码示例和源码下载链接,方便读者实践操作。
566 65