返回顶部
首页 > 资讯 > 移动开发 >Android 动画(View动画,帧动画,属性动画)详细介绍
  • 972
分享到

Android 动画(View动画,帧动画,属性动画)详细介绍

view属性动画Android 2022-06-06 07:06:19 972人浏览 泡泡鱼
摘要

0. 前言  Android动画是面试的时候经常被问到的话题。我们都知道Android动画分为三类:View动画、帧动画和属性动画。 先对这三种动画做一个概述:

0. 前言 

Android动画是面试的时候经常被问到的话题。我们都知道Android动画分为三类:View动画、帧动画和属性动画。

先对这三种动画做一个概述:

View动画是一种渐进式动画,通过图像的平移、缩放、旋转和透明度等各种渐进式变换完成动画效果。

帧动画是通过不停的切换图片实现动画效果。

属性动画是不停的改变对象的属性来实现动画效果。本文原创,转载请注明出处:

Http://blog.csdn.net/seu_calvin/article/details/52724655

1.  View动画 

1.1  系统提供的四种View动画(补间动画)

View动画可以在res/anim/name.xml文件里进行配置,四种View动画的渐变式变换分别对应<translate>、<scale>、<rotate>、<alpha>四个标签,动画集合可以使用<set>标签。xml的各个动画属性比较简单,这里就不再贴实例代码了。只需要注意如何应用配置好的xml文件来启动动画即可:

view.startAnimation(AnimationUtils.loadAnimation(this,R.anim.myanimation)); 

这些当然也可以在Java代码里进行配置,也比较简单,这里写了一个示例代码:


splash = (RelativeLayout)findViewById(R.id.splash); 
//旋转动画 
RotateAnimation rotateAnimation = new RotateAnimation(0,360, 
        Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); 
rotateAnimation.setDuration(2000); 
rotateAnimation.setFillAfter(true); 
//缩放动画 
ScaleAnimation scaleAnimation = new ScaleAnimation(0,1,0,1, 
        Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); 
scaleAnimation.setDuration(2000); 
scaleAnimation.setFillAfter(true); 
//渐变动画 
AlphaAnimation alphaAnimation = new AlphaAnimation(0.2f,1.0f); 
alphaAnimation.setDuration(2000); 
alphaAnimation.setFillAfter(true); 
//平移动画 
TranslateAnimation translateAnimation = newTranslateAnimation (0,0,100,100); 
translateAnimation.setDuration(2000); 
translateAnimation.setFillAfter(true); 
//动画集合 
AnimationSet animationSet = new AnimationSet(true); 
animationSet.addAnimation(rotateAnimation); 
animationSet.addAnimation(scaleAnimation); 
animationSet.addAnimation(alphaAnimation); 
animationSet.addAnimation(translateAnimation); 
//启动动画 
plash.startAnimation(animationSet); 

1.2   自定义View动画

自定义动画实际应用中比较少见,因此这里只做简单介绍。

完成自定义动画需要继承Animation类,并重写其initialize()以及applyTransfORMation()。

前者用于一些初始化的操作,后者用于进行矩阵变换。

1.3     为ViewGroup的所有子元素设置动画

上面1.1,1.2都是给View设置动画效果,Android同样提供了为ViewGroup设置

android:layoutAnimation=”@anim/layout_anim”来达到给ViewGroup中所有子元素设置动画的目的。下面给出相关代码:


//res/anim/anim/layout_anim.xml 
<layoutAnimation xmlns:android=” http://schemas.android.com/apk/res/android” 
android:delay=”0.1” //动画延迟时间为0.1*T,本例为100ms 
android:animationOrder=”normal” //子元素的播放动画顺序为顺序,也有reverse以及random 
android: animation=” @anim/layout_anim_item”/> 
//res/anim/anim/layout_anim_item.xml 
<?xml version=”1.0” encoding=”utf-8”?> 
<set xmlns:android=”http://schemas.android.com/apk/res/android” 
 animation:duration=”200” //每个子元素的动画周期T 
 animation:interpolator=”@android:anim/accelerate_ interpolator” //指定插值器 
animation:shareInterpolator=”true”> //表示所有子元素共享该插值器 
<alpha android:fromAlpha=”0.2” android: toAlpha =”1.0”/> 
<translate android:fromXDelta=”100” android: toXDelta =”0”/> 
</set> 

1.4     为Activity切换设置动画

估计大家也都用过,在startActivity()之后使用,使Activity切换时达到一个平移的动画效果:

overridePendingTransition(R.anim.tran_in,R.anim.tran_out); 


//res/anim/tran_in 
<?xml version="1.0" encoding="utf-8"?> 
<translate xmlns:android="http://schemas.android.com/apk/res/android" 
android:duration="500" 
//表示从屏幕100%的位置开始,因此tran_out当然是toXDelta="-100%p",其他不变 
android:fromXDelta="100%p" 
android:fromYDelta="0" 
  android:toXDelta="0" 
  android:toYDelta="0" > 
</translate> 

2.   帧动画

上面也提到了,帧动画就是不停的切换图片实现动画效果。很明显容易OOM,所以使用帧动画要注意图片大小。
帧动画的使用也很简单,使用示例如下:


//res/drawable/myanimation.xml 
<?xml version=”1.0” encoding=”utf-8”?> 
<animation-list xmlns:android=”http://schemas.android.com/apk/res/android” 
 animation:oneshot=”false” > //false为循环播放,true为类似于View动画的setFillAfter效果 
<item android: drawable =”@ drawable/ drawable 1” android:duration=” 200”> 
<item android: drawable =”@ drawable/ drawable 2” android:duration=” 200”> 
</animation-list> 
//在代码里加载动画设置并启动动画 
view.setBackgroundResource(R.drawable.myanimation.xml); 
(AnimationDrawable)view.getBackground.start(); 

3.   属性动画

View动画的那四种效果有很明显的缺点,绘制出来的效果其实并没有真正改变View的属性,即left、top、right和bottom的值,只是系统临时绘制的结果。这样View的点击位置并没有发生变化。针对这个问题,从Android3.0开始属性动画应运而生。

属性动画本质是通过改变新增的属性(如平移translationX/Y、缩放scaleX/Y、旋转rotationX/Y等)并刷新屏幕来实现动画效果,并且实现点击位置的实时改变。但是属性动画仍然不会修改原始的上下左右四个值。最后需要注意的是,属性动画不止用于View,还可以用于任何对象。

下面介绍与属性动画相关的类和方法:

3.1  setTranslationX方法

该方法直接更改view属性的方法,因为有时候不需要使用动画效果。


view.setTranslationX(x);//3.0以后 
ViewHelper.setTranslationX(view,x);//3.0以前通过NineOldAndroid库实现 

3.2   ValueAnimator类


ValueAnimator只定义和执行动画流程,并没有直接操作属性值的逻辑,需要添加动画更新的监听,并在onAnimationUpdate()中执行自定义的动画逻辑。
[java] view plain copy 在CODE上查看代码片派生到我的代码片
ValueAnimator animator = ValueAnimator.ofInt(1, 100); //定义动画,相当于1秒内数100个数 
animator.addUpdateListener(new AnimatorUpdateListener() { 
  @Override 
  public void onAnimationUpdate(ValueAnimator animation){ 
    float fraction = animation.getAnimatedFraction();//动画进度值0-1 
    //整型估值器帮我们计算了start+(end-strat)*fraction,并设置给控件的宽度 
    view.getLayoutParams().width = new IntEvaluator().evaluate(fraction,start,end) //不需要set方法 
    view.requestLayout(); 
  } 
}); 
animator.setDuration(1000).start(); 

3.3    ObjectAnimator类

ObjectAnimator继承自ValueAnimator,它允许直接改变view的属性,下面通过一个例子介绍。


//x轴方向缩放的例子 
ObjectAnimator animator = ObjectAnimator.ofFloat(view,”scaleX”,2.0f); 
animator.setDuration(1000); 
animator.setStartDelay(1000); 
animator.start(); 

大多数的情况使用ObjectAnimator就足够了,因为它不用像ValueAnimator那样自己写动画更新的逻辑,但是ObjectAnimator有一定的限制——它需要目标属性提供指定的处理方法(譬如提供get/set方法),这是因为ObjectAnimator的原理是不停的调用set方法更新属性值,并且如果我们没有传递初始值,系统会直接调用get方法获取值。而上面3.2中介绍过的ValueAnimator则不直接操作属性值,所以要操作对象的属性可以不需要se/get方法,你完全可以通过当前动画的计算去修改任何属性。

针对这个问题,官方推荐我们用一个类包装原始对象,间接为其提供get/set方法,实现起来很简单,实例如下:


ViewWrapper wrapper = new ViewWrapper(view); 
ObjectAnimator.ofInt(view,”width”,200).setDuration(1000).start(); 
 private static class ViewWrapper{ 
  private View myView; 
 public ViewWrapper(View view){ 
  myView = view; 
 } 
 public int getWidth(){ 
  return myView.getLayoutParams().width; 
 } 
 public int setWidth(int width){ 
 myView.getLayoutParams().width = width; 
 myView.requestLayout(); 
 } 
} 

3.4  ViewPropertyAnimation类

ViewPropertyAnimation是NineOldAndroid库中的类,简化了ObjectAnimator类的操作,并且NineOldAndroid库兼容了3.0以前的Android版本。下面经过一个例子介绍。


//x轴方向缩放的例子,效果同3.3 
ViewPropertyAnimation.animate(view).scaleX(2.0f).setDuration(1000) 
.setInterpolator(new OvershootInterpolator()) 
.setStartDelay(1000).start(); 

3.5  AnimationSet类

动画集合,提供把多个动画组合成一个组合的机制,并可设置动画的时序关系,如同时播放、顺序播放或延迟播放。具体使用方法比较简单,如下所示:


ObjectAnimator objectAnimator1= ObjectAnimator.ofFloat(view, "alpha", 1.0f, 0f);  
ObjectAnimator objectAnimator2= ObjectAnimator.ofFloat(view, "translationY", 0f, 30f);  
ObjectAnimator objectAnimator3= ObjectAnimator.ofFloat(view, "translationX", 0f, 30f);  
AnimatorSet animatorSet = new AnimatorSet();  
animatorSet.setDuration(5000);  
animatorSet.setInterpolator(new LinearInterpolator());   
// animatorSet.playTogether(objectAnimator1, objectAnimator2. objectAnimator3); //三个动画同时执行  
// 12同时执行,3接着执行  
animatorSet.play(objectAnimator1).with(objectAnimator2);  
animatorSet.play(objectAnimator3).after(objectAnimator2);  
animatorSet.start(); 

4.  插值器总结

4.1  系统已经提供给我们的插值器
各种插值器都是实现了Interpolator接口,下面来看一下系统已经提供给我们直接使用的插值器。

 4.2  自定义插值器

Interpolator都实现了Interpolator接口,而Interpolator接口又继承自TimeInterpolator,TimeInterpolator接口定义了一个由系统调用的getInterpolation(float input)方法,其中参数input代表动画完成进度,在0和1之间。我们自定义插值器只需要实现Interpolator接口并覆写getInterpolation()方法即可实现自定义的动画效果。 

如下就是一个动画始末速率较慢、中间加速的AccelerateDecelerateInterpolator插值器:


public class AccelerateDecelerateInterpolator extends BaseInterpolator 
    implements NativeInterpolatorFactory { 
  ...... 
  public float getInterpolation(float input) { 
    return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f; 
  } 
  ...... 
} 

5.  动画监听器

我们在平时开发过程中,经常要监听动画完成的时机以继续业务逻辑,那么我们可以通过给动画集合设置AnimationListener监听器来实现。分别可以监听动画开始、结束、取消以及重复播放。


//监听动画完成 
animationSet.setAnimationListener(new Animation.AnimationListener() { 
  @Override 
  public void onAnimationStart(Animation animation) {} 
  @Override 
  public void onAnimationEnd(Animation animation) {} 
  @Override 
public void onAnimationRepeat(Animation animation) {} 
@Override 
  public void onAnimationCancel(Animation animation) {} 
}); 

最后若想监听动画中每一帧的回调,我们可以设置AnimatorUpdateListener监听器并重写其onAnimationUpdate()方法即可。

至此关于Android动画的知识总结完毕。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

您可能感兴趣的文章:Android属性动画实现炫酷的登录界面Android属性动画实现布局的下拉展开效果Android动画 实现开关按钮动画(属性动画之平移动画)实例代码图文详解Android属性动画Android 自定义view和属性动画实现充电进度条效果Android 属性动画ValueAnimator与插值器详解Android模拟开关按钮点击打开动画(属性动画之平移动画)Android中编写属性动画PropertyAnimation的进阶实例Android帧动画、补间动画、属性动画用法详解Android动画教程之属性动画详解


--结束END--

本文标题: Android 动画(View动画,帧动画,属性动画)详细介绍

本文链接: https://lsjlt.com/news/23697.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android 动画(View动画,帧动画,属性动画)详细介绍
    0. 前言  Android动画是面试的时候经常被问到的话题。我们都知道Android动画分为三类:View动画、帧动画和属性动画。 先对这三种动画做一个概述:...
    99+
    2022-06-06
    view 属性 动画 Android
  • Android帧动画、补间动画、属性动画用法详解
    在安卓开发中,经常会使用到一些动画,那么在开发中,如何使用这些动画呢? 帧动画:不是针对View做出一些形状上的变化,而是用于播放一张张的图片,例如一些开机动画,类似于电影播放...
    99+
    2022-06-06
    属性 补间动画 动画 Android
  • Android动画-属性动画
    属性动画 所谓属性动画,就是改变对象Object的属性来实现动画过程。属性动画是对View的动画的扩展,通过它可以实现更多漂亮的动画效果。同时属...
    99+
    2022-06-06
    属性 Android
  • android 帧动画,补间动画,属性动画的简单总结
    帧动画——FrameAnimation 将一系列图片有序播放,形成动画的效果。其本质是一个Drawable,是一系列图片的集合,本身可以当做一个图片一样使用 在Drawable...
    99+
    2022-06-06
    属性 补间动画 动画 Android
  • Android 动画之帧动画用法详解
    本文目录帧动画概念帧动画实现方法1:xml实现帧动画第一步:导入帧动画素材第二步:创建帧动画文件第三步:布局文件和Activity方法2:用Ja...
    99+
    2022-06-06
    动画 Android
  • Android动画探索之属性动画
    这篇文章来总结下属性动画,通过下面几点来了解下属性动画的内容: 属性动画概述 属性动画工作原理 ValueAnimator ObjectAnim...
    99+
    2022-06-06
    属性 Android
  • Android属性动画
    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、常用API3.1 Valu...
    99+
    2023-12-22
    android nginx 运维
  • CSS3动画的详细介绍
    这篇文章主要介绍“CSS3动画的详细介绍”,在日常操作中,相信很多人在CSS3动画的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS3动画的详细介绍”的疑惑有所帮...
    99+
    2024-04-02
  • Android动画之逐帧动画(Frame Animation)实例详解
    本文实例分析了Android动画之逐帧动画。分享给大家供大家参考,具体如下: 在开始实例讲解之前,先引用官方文档中的一段话: Frame动画是一系列图片按照一定的顺序展示的过程...
    99+
    2022-06-06
    frame animation Android
  • Android动画 实现开关按钮动画(属性动画之平移动画)实例代码
    Android动画 实现开关按钮动画(属性动画之平移动画),最近做项目,根据项目需求,有一个这样的功能,实现类似开关的动画效果,经过自己琢磨及上网查找资料,终于解决了,这里就记...
    99+
    2022-06-06
    开关 属性 按钮 Android
  • Android 帧动画使用详情
    目录Android 帧动画1、帧动画2、使用背景图片3、使用srcAndroid 帧动画 1、帧动画 使用一系列不同的图片,然后像一卷胶卷一样按顺序播放,这是一种传统的动画,也可称为...
    99+
    2024-04-02
  • Android动画之逐帧动画(Frame Animation)基础学习
    前言 在Android中,动画Animation的实现有两种方式:Tween Animation(补间动画)和Frame Animation(帧动画)。渐变动画是通过对场景里的...
    99+
    2022-06-06
    frame 学习 animation Android
  • CSS3 动画属性
    CSS3 动画虽然transition在一定的时间内可以实现元素的初始状态在指定的时间范围过渡最终状态, 模拟一种过渡动画效果,但它的功能是非常有限的。 因此,CSS3 新增了一个动画属性animation。与过渡属性transition属...
    99+
    2023-01-31
    属性 动画
  • Compose 动画艺术之属性动画探索
    目录Compose的属性动画参数方法体天亮了结尾前言 本篇文章是此专栏的第三篇文章,如果想阅读前两篇文章的话请点击下方链接: Compose 动画艺术探索之可见性动画示例详...
    99+
    2024-04-02
  • Android Studio实现帧动画
    本文实例为大家分享了Android Studio实现帧动画的具体代码,供大家参考,具体内容如下 按一定的顺序播放静态的图片 1、几张联系的图片 2、一个图片资源管理布局文件:car...
    99+
    2024-04-02
  • 图文详解Android属性动画
     Android中的动画分为视图动画(View Animation)、属性动画(Property Animation)以及Drawable动画。从Android 3....
    99+
    2022-06-06
    动画 Android
  • Android模拟开关按钮点击打开动画(属性动画之平移动画)
    在Android里面,一些炫酷的动画确实是很吸引人的地方,让然看了就赏心悦目,一个好看的动画可能会提高用户对软件的使用率。另外说到动画,在Android里面支持两种动画:补间动...
    99+
    2022-06-06
    开关 属性 按钮 动画 Android
  • WPF关键帧动画介绍与实现
    目录动画与关键帧的区别普通动画关键帧介绍关键帧动画关键帧动画类型关键帧的动画类型列表帧对象的类型插值方法线性内插离散内插曲线内插组合内插Duration与KeyTimeTimeSpa...
    99+
    2024-04-02
  • Android动画
    源码地址: https://download.csdn.net/download/dreams_deng/12236355 1. 理论知识 1.1 动画类型: View动画 :...
    99+
    2022-06-06
    Android
  • WPF实现动画效果(五)之关键帧动画
    WPF动画效果系列 WPF实现动画效果(一)之基本概念 WPF实现动画效果(二)之From/To/By 动画 WPF实现动画效果(三)之时间线(TimeLine) WPF实现动画效果...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作