Android - 动画

这篇具有很好参考价值的文章主要介绍了Android - 动画。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

官方页面:动画简介

官方页面:属性动画概览

官方页面:使用动画显示或隐藏视图

一、概念

属性动画

PeopertyAnimation

view的属性根据执行的动画发生真实的改变,通过不断设置View的属性实现。

视图动画(补间动画)

ViewAnimation(Tween)

视图动画的作用对象是View。不改变view的位置和属性。基于 Framework的绘制转变。

帧动画

DrawableAnimation(Frame)

依次播放动画过程中每帧对应的静态图片。

二、插值器 Interpolator

即数度模型,算法对应不同时间点动画完成度的百分比,使一些基础的动画如(平移,缩放,旋转,透明)可以被加速,减速,重复等。

LinearInterpolator 匀速。
AccelerateInterpolator 持续加速(构造中可调节变速系数)。主要用在出场效果中。
AccelerateDecelerateInterpolator 先加速再减速。默认效果,最符合现实物理模型。
DecelerateInterpolator 持续减速到0。主要用于入场效果。
AnticipateInterpolator 先反效果一点点(平移就是先回拉,放大就是先缩小),再进行正常动画轨迹。
OvershottInterpolator 超过目标值一些再弹回来。
AnticipateOvershootInterpolator 两种效果的结合体,先反效果一点点,最后超过目标值一些再回弹。
BounceInterpolator 在目标值处弹跳几下。
CycleInterpolator 自定义动画循环播放特定次数。
PathInterpolator 自定义任何想要的速度模型(动画完成度 ÷ 时间完成度)。使用一个 Path 对象来绘制出想要的曲线(y 为动画完成度,x 为时间完成度)。

FastOutLinearInInterpolator

持续加速(贝塞尔曲线,初始加速更快,肉眼并不明显)。
FastOutSlowInInterpolator 先加速再减速(贝塞尔曲线,加速减速更快)。
LinearOutSlowInInterpolator 持续减速(初始速度更快)。

三、属性动画 PeopertyAnimation

3.1 ViewPropertyAnimator

通过 view.animate() 返回一个 ViewPropertyAnimator 对象并自动执行,局限性在于只能调用以下方法设置属性动画。

public ViewPropertyAnimator animate()

3.1.1 动画模式 

  • 这些方法调用就会执行动画,在播放中途再次调用会先停留在原处,等进度赶上了再继续播放。当动画播放完毕后,不带by的方法再次调用不会执行,任何时候调用 start( ) 都无效果,调用 cancel() 会打断动画并会停留在原处,再次这些方法等进度赶上了再继续播放。
  • 默认动画时长0.3s,通过 setDuration() 自定义。
  • 默认速度模型开始加速结束减速(AccelerateDecelerateInterpolator),通过 setInterpolator() 自定义。

Android - 动画

3.1.2 动画监听

设置监听

public @NonNull ViewPropertyAnimator setListener(@Nullable Animator.AnimatorListener listener)

重写onAnimationStart动画开始、onAnimationEnd动画结束、onAnimationCancel动画取消(对应调用了cancel时)、onAnimationRepeat动画重复(对应通过repeat播放时)。

更新监听

public @NonNull ViewPropertyAnimator setUpdateListener(@Nullable ValueAnimator.AnimatorUpdateListener listener)

重写onAnimationUpdate每当属性值更新时,参数ValueAnimator可以获取当前动画完成度、属性值等。

一次性监听

public @NonNull ViewPropertyAnimator withStartAction(Runnable runnable) 

public @NonNull ViewPropertyAnimator withEndAction(Runnable runnable) 

重用ViewPropertyAnimator 执行别的动画也不会再执行,动画被调用cancel取消时不会再执行。

3.2 ObjectAnimator

ofFloat(Object target, String propertyName, float... values)
ofInt(Object target, String propertyName, int... values)
ofArgb(Object target, String propertyName, int... values)
ofObject(Object target, String propertyName, TypeEvaluator evaluator, Object... values)
ofMultiFloat(Object target, String propertyName, TypeConverter<T, float[]> converter, TypeEvaluator<T> evaluator, T... values)
ofMultiInt(Object target, String propertyName, TypeConverter<T, int[]> converter, TypeEvaluator<T> evaluator, T... values)

通过 ObjectAnimator.ofXXX() 创建对象,XXX具体选什么类型根据该属性设置方法的参数类型决定。target是目标View,propertyName是View的哪个属性(不是找同名变量修改值,是拼接出setter方法并调用,找不到IDE会提示。若是自定义View该属性需要提供setter方法,并在最后一行调用 invalidate() 触发重绘),values是目标值(填一个就是目标值,填两个就是起始值和目标值,填多个就是增加中间转接点值。若是自定义View,只填一个值的情况就需要该属性提供getter方法,会获取当前值当作起始值)。调用 start() 才会执行动画。

class MyView2 : View {
    var progress = 0F
    set(value) {
        field = value
        invalidate()    //重写getter触发重绘即调用onDraw()
    }
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        canvas?.drawArc(...)
    }
}

UI {
    val animator = ObjectAnimator.ofFloat(myView, "progress", 0, 65)
    animator.start()
}

3.2.1 动画监听

设置监听

public void addListener(AnimatorListener listener)

重写onAnimationStart动画开始、onAnimationEnd动画结束、onAnimationCancel动画取消(对应调用了cancel时)、onAnimationRepeat动画重复(对应通过repeat播放时)。

更新监听

public void addUpdateListener(AnimatorUpdateListener listener) 

重写onAnimationUpdate每当属性值更新时,参数ValueAnimator可以获取当前动画完成度、属性值等。

暂停监听 public void addPauseListener(AnimatorPauseListener listener)
var boolean = false
onCreate {
    //对View启用动画
    val animate = imagineView.animate().apply {
        //动画类型不能写在里面因为调用就会执行
        duration = 2000 //设置动画时长
        interpolator = AccelerateDecelerateInterpolator()   //设置速度模型
        startDelay = 2000   //延迟播放
        setListener(object : Animator.AnimatorListener{
            override fun onAnimationStart(animation: Animator) { }  //动画开始
            override fun onAnimationEnd(animation: Animator) { }    //动画结束
            override fun onAnimationCancel(animation: Animator) { } //动画取消
            override fun onAnimationRepeat(animation: Animator) { } //动画重复
        })
        setUpdateListener { valueAnimator -> } //动画更新
        withStartAction { Runnable {  } }  //动画开始
        withEndAction { Runnable {  } }    //动画结束
    }
    button1.setOnClickListener {
        //中途再次点击会停留在原地等进度赶上了继续播放
        animate.translationXBy(200F)    //每次点击都有位移效果
        animate.rotation(180F)  //只执行一次,播放完后再次点击无旋转效果

    }
    button2.setOnClickListener {
        //每次点击在strat和cancel切换,测试结果:start()任何时候都无效,cancel()打断动画停在原地
        if (boolean) animate.start() else animate.cancel()
        boolean = !boolean  
    }
}

3.3 DynamicAnimation

四、切换界面动画 Transition

官方页面

五、视图动画 ViewAnimation

视图动画的作用对象是View,又叫补间动画,仅仅是呈现呈现效果,便不会改变控件任何的真实情况(例如Button即便动画移到了下边也不能点击,其实还停留在原处可点击)。可以通过 xml 或代码动态创建(建议使用 xml 因为具有更高的可读性和重用性)。

  • 数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点 

5.1 动画模式

透明度

AlphaAnimation(

    float fromAlpha,        //动画开始的透明度

    float toAlpha        //动画结束的透明度

)

透明度取值范围范围 0~1。

缩放

public ScaleAnimation(
    float fromX,        //初始X轴缩放比例,1.0表示无变化
    float toX,        //结束X轴缩放比例
    float fromY,        //初始Y轴缩放比例
    float toY,        //结束Y轴缩放比例
    float pivotX,        //缩放起点X轴坐标
    float pivotY        //缩放起点Y轴坐标
)

pivotX/pivotY:缩放的中轴点坐标,即距离自身左边缘的位置,比如50%就是以图像的中心为中轴点。

平移

public TranslateAnimation(
    float fromXDelta,        //起始点X轴坐标
    float toXDelta,        //结束点X轴坐标
    float fromYDelta,        //起始点Y轴坐标
    float toYDelta        //结束点Y轴坐标
)

旋转

public RotateAnimation(
    float fromDegrees,        //旋转的起始角度
    float toDegrees,        //旋转的结束角度
    float pivotX,        //缩放起点X坐标

    float pivotY        //缩放起点Y坐标
)

旋转角度:正代表顺时针度数,负代表逆时针度数。

动画集合

AnimationSet(boolean shareInterpolator)

可同时播放以上动画。shareInterpolator:true都用一样的插值器,false用各自的插值器。通过调用addAnimation(Animation a) 将动画添加进集合。

5.2 动画配置

持续时间 public void setDuration(long durationMillis)
重复次数

public void setRepeatCount(int repeatCount) 

值为-1或者infinite时,表示动画永不停止。

重复模式

public void setRepeatMode(int repeatMode)

默认restart,但只有当repeatCount大于0或者infinite或-1时 才有效。还可以设置成reverse,表示偶数次显示动画时会做方向相反的运动。

设置速度模型

public void setInterpolator(Interpolator i)

停留结果

public void setFillAfter(boolean fillAfter)

设为 true 则动画结束后 view 会停留在当前效果。

开始动画

public void startAnimation(Animation animation)

由 view 调用,传入要播放的动画。

5.3 动画监听

public void setAnimationListener(AnimationListener listener)

用动画对象调用,重写三个方法:onAnimationStart动画开始时、onAnimationEnd动画结束时、onAnimationRepeat动画重复时。

5.4 使用方式

5.4.1 xml配置动画

res目录下新建anim文件夹,创建xml文件,可选节点有alpha、rotate、scale、translate、set。

<translate xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    android:fromXDelta="0"  
    android:toXDelta="320"  
    android:fromYDelta="0"  
    android:toYDelta="0"  
    android:duration="2000"/>
AnimationUtils.loadAnimation(this, R.anim.translate)    //加载Xml文件中的动画
imagineView.startAnimation(translate)    //将动画设置到指定的View上

5.4.2 代码配置动画

val imagineView = binding.imagineView
val button = binding.button
//透明
val alphaAnimation = AlphaAnimation(1.0F, 0.2F)
//旋转
val rotateAnimation = RotateAnimation(0F, 360F, Animation.RELATIVE_TO_SELF, 0.5F, Animation.RELATIVE_TO_SELF, 0.5F)
//缩放
val scaleAnimation = ScaleAnimation(1.0F, 5.0F, 1.0F, 5.0F, Animation.RELATIVE_TO_SELF, 0.5F, Animation.RELATIVE_TO_SELF, 0.5F)
//平移
val translateAnimation = TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0F, Animation.RELATIVE_TO_PARENT, 0F,Animation.RELATIVE_TO_PARENT, 0F, Animation.RELATIVE_TO_PARENT, 0.4F)
//动画集合
val set = AnimationSet(true).apply {
    addAnimation(alphaAnimation)
    addAnimation(rotateAnimation)
    addAnimation(scaleAnimation)
    addAnimation(translateAnimation)
    duration = 1     //持续时间
    repeatCount = 10    //重复次数
    repeatMode = Animation.RESTART  //重复方式
    interpolator = AccelerateDecelerateInterpolator() //速度模型
    fillAfter = true //播放完毕后停留在原地
}
//动画监听
set.setAnimationListener(object : AnimationListener {
    override fun onAnimationStart(animation: Animation?) { }    //动画开始
    override fun onAnimationEnd(animation: Animation?) { }    //动画结束
    override fun onAnimationRepeat(animation: Animation?) { }    //动画重复
})
button.setOnClickListener {
    imagineView.startAnimation(set) //开始动画
}

六、帧动画 DrawableAnimation(Frame)

容易引起OOM。

6.1 xml配置

res/drawable目录下创建animation-list文件文章来源地址https://www.toymoban.com/news/detail-434481.html

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">	//true表示只播放一边,默认就是false可不写
    <item android:drawable="@drawable/girl_1" android:duration="100" />
    <item android:drawable="@drawable/girl_2" android:duration="100" />
    <item android:drawable="@drawable/girl_3" android:duration="100" />
</animation-list>

 6.2 代码调用

imagineView.setBackgroundResource(R.drawable.anim_frame)
val animationDrawable = imagineView.background as AnimationDrawable
animationDrawable.start()

到了这里,关于Android - 动画的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 开源预训练框架 MMPRETRAIN官方文档(概览、环境安装与验证、基础用户指南)

    MMPretrain是全新升级的开源预训练框架。它已着手提供多个强大的预训练骨干网并支持不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassification 和MMSelfSup,并开发了许多令人兴奋的新功能。目前,预训练阶段对于视觉识别至关重要。凭借丰富而强大的预训练模型,我们目

    2024年02月13日
    浏览(54)
  • Android 10.0 SystemUI定制之通过系统属性控制锁屏页面通知栏显示与隐藏功能实现

    在10.0的系统产品开发中,在一些SystemUI的系统定制化开发中,在对锁屏页面的通知栏在某些情况下不需要显示通知栏,所以就需要 在systemui的通知栏布局页面中,通过属性来控制是否在锁屏页面的时候显示通知,具体就分析下systemui然后开发相关功能 在systemui系统中最主要的

    2024年02月04日
    浏览(58)
  • Android 应用资源概览

    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 我们继续总结学习 Android 基础知识 ,温故知新。 资源是指代码使用的附加文件和静态内容,例如位

    2024年02月05日
    浏览(28)
  • Android系统启动流程概览

    Boot Rom —— Bootloader —— Linux Kernel —— init进程 —— Zygote进程(dalvik/ art)—— systemServer —— Apps init 进程是Linux系统中,用户空间启动的第一个进程。 创建并挂载一些文件目录 启动属性服务 解析 init.rc 配置文件,启动 Zygote 进程 挂载 seLinux 文件目录,创建seLinux,加载

    2024年02月06日
    浏览(41)
  • Android Audio开发——概览(一)

            Audio 是 Android 系统中比较重要的一个模块,在 Android 中负责音频方面的数据流传输和控制功能,也负责音频设备的管理。         Android 音频架构定义了音频功能的实现方式,并指出实现中所涉及的相关源代码。 应用框架         应用框架包含应用代码,该

    2024年02月10日
    浏览(41)
  • 【HarmonyOS】【应用开发】动画-属性动画与显式动画

    (一)、定义   官网对于属性动画的定义如下: 组件的某些通用属性变化时,可以通过属性动画实现渐变过渡效果,提升用户体验。支持的属性包括width、height、backgroundColor、opacity、scale、rotate、translate等   个人理解:属性动画针对的是同一个组件的属性变化情况,如

    2024年02月02日
    浏览(37)
  • 第3章 开源大模型框架概览3.1 TensorFlow与Keras3.1.1 TensorFlow简介

    TensorFlow是Google开发的一款开源的深度学习框架,由于其强大的性能和灵活性,被广泛应用于机器学习、人工智能等领域。Keras则是一个高层次的神经网络API,可以运行在顶层框架上,包括TensorFlow、CNTK、Theano等。Keras提供了简单易用的接口,使得构建、训练和部署深度学习模型

    2024年01月20日
    浏览(50)
  • 属性动画实现旋转入场效果

    属性动画和硬件加速 日常杂谈 06月07日 首先,我感觉这部分内容真的挺无聊的,没有什么让人新奇的感觉。不过为了博客的整体性,我还是想随便整理一下相关的知识和内容。 一如既往,聊聊我的日常生活,最近可能比较忙,所以可能没有那么多大段的时间来写博客。只能

    2024年02月08日
    浏览(61)
  • svg常用属性及动画效果

    在前端开发中,使用SVG(可缩放矢量图形)已经成为一种常见的技术选择。SVG是一种基于XML的图像格式,它使用矢量图形来描述图像,而不是像传统的位图图像那样使用像素。这使得SVG图像在缩放和调整大小时保持清晰度,无论是在高分辨率屏幕上还是在不同大小的设备上。

    2024年02月07日
    浏览(46)
  • css动画(animation)常用属性

                               1.animation-name:动画名称                                       2.@keyframes:动画定义,后面跟动画名称                                      3.animation-duration:动画持续时长,单位(s)                         

    2023年04月27日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包