Android动画深入分析(View动画)

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

Android动画深入分析(View动画)

Android的动画我其实在View的滑动里面写过,主要还是分为2点。

一个就是View动画,还有一个是属性动画

先讲述View动画

View动画

View动画主要分为4种,平移动画,缩放动画,旋转动画,透明度动画

还有一个叫帧动画,但是表现方式和上面4种不太一样

一般情况下我们是在xml里面定义动画的

先在res创建anim文件夹然后创建文件

代码如下

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:fromXDelta="0dp"
    android:toXDelta="20dp"
    android:duration = "30"/>
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0"
        android:duration = "30"/>
    <rotate
        android:fromDegrees="0"
        android:toDegrees="100"
        android:duration = "30"/>
    <scale
        android:fromXScale="0"
        android:toXScale="2"
        android:duration = "30"/>
</set>

translate为平移

alpha为透明度

rotate为旋转

scale为扩大/缩小

我之前写View动画的时候,发现在xml界面中没有提示写duration的,就以为不写,但是不写的话,根本没办法跑起来,最后把这段代码自己在xml中写了一遍发现也没有报错

然后运行也没啥问题

其中 标签表示动画集合,对应AnimationSet类,它可以包含若干个动画,并且内部也是可以嵌套其他动画集合的,它的内部也是可以嵌套其他动画集合的,两个属性的含义如下:

一个是:interpolator

表示动画集合所采用的插值器,插值器影响动画的速度,比如非匀速动画就需要通过插值器来控制动画播放的过程

第二个是:shareInterpolator

表示集合中的动画是否和集合共享同一个插值器,如果集合不指定插值器,那么子动画就需要单独指定所需的插值器或使用默认值

1.XML文件中定义动画

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:duration="300"
        android:fromDegrees="0"
        android:toDegrees="90" />
    <scale
        android:duration="3000"
        android:fromXScale="1.0"
        android:fromYScale="30%"
        android:toXScale="2.0"
        android:toYScale="2.0" />
</set>

在MainActivity

Animation animation = AnimationUtils.loadAnimation(this,R.anim.animation);
button.startAnimation(animation);

2.代码中定义动画

AlphaAnimation alphaAnimation = new AlphaAnimation(1,0);
alphaAnimation.setDuration(3000);

button1.startAnimation(alphaAnimation);

效果还不错

3.自定义View动画

新的动画继承Animation这个抽象类,然后重写initializeapplyTransformation方法

  1. initialize方法
    initialize方法是View的初始化方法,用于在View被添加到窗口或在View大小发生改变时初始化View的状态。在该方法中,您可以初始化一些变量、获取View的宽度和高度等,以便在后续的绘制过程中使用。
  2. applyTransformation方法
    applyTransformation方法是View动画的核心方法,用于更新View的状态并实现动画效果。该方法会在每一帧绘制之前被调用,并接收一个时间插值器(Interpolator)计算出的动画进度值,以及一个Transformation对象,您可以通过该对象来更新View的状态。

4.帧动画

帧动画是按顺序播放一组预定好的图片,类似于电影播放,

要实现帧动画,我们需要在drawable中先创建一个类

<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:drawable="@drawable/kuga"
    android:duration="500"
    />
    <item
        android:drawable="@drawable/roky"
        android:duration="500"/>
    <item
        android:drawable="@drawable/kiva"
        android:duration="500"/>
</animation-list>

注意它是animation-list开头的

除了它还有

Android动画深入分析(View动画)

这几种,但我试了一下,如果只把animation-list改成其他的会直接闪退

然后在MainActivity中

imageView.setBackgroundResource(R.drawable.animationdrawable);
AnimationDrawable drawable = (AnimationDrawable) imageView.getBackground();
drawable.start();

然后就可以播放动画了

它播放完最后一张图,又会从第一张图重新开始播放

5.View动画的特殊使用场景

前面我们说的主要是作用于View上的,其实View动画还可以作用于ViewGroup和不同Activity切换中

作用于ViewGroup

我们常会看见listView或者recyclerView,它的每一个item都以一定的动画形式出现

并没有采用什么高深的技术而只是使用了一下LayoutAnimation

首先先创建recyclerView,

然后在anim文件中指定每一个元素的动画

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000">
<alpha
    android:fromAlpha="0.0"
    android:toAlpha="1.0"/>
    <translate
        android:fromXDelta="500"
        android:toXDelta="0"/>
</set>

然后定义LayoutAnimation

<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:delay="0.5"
    android:animationOrder="normal"
    android:animation="@anim/anim_item">

</layoutAnimation>

因为我在上面定义了duraion = 3000,然后delay = 0.5,代表着第一个子元素需要延迟1500ms才会播放开场动画

然后android:animationOrder有3个选项normal,reverse,random

normal表示顺序显示

reverse表示逆向显示

random表示随机显示

最后在recyclerView的xml中加上

android:layoutAnimation="@anim/layoutanimation"

就行了

但是我在里面发现了一个问题

就是我把recyclerView设置的高度一次只能显示5个子元素,通过滑动才能显示后面的元素

其中0-4是可以看到动画效果的,剩余的元素看不到动画效果

会这样

Android动画深入分析(View动画)

除了在xml中指定,还可以通过LayoutAnimationController来实现

Animation animation = AnimationUtils.loadAnimation(this,R.anim.anim_item);
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);;
recyclerView.setLayoutAnimation(controller);

Activity的切换效果

主要用到的是overridePendingTransition()

里面第一个参数是表示Activity被打开的时候,所需要的动画资源的id

第二个参数表示Activity被暂停的时候,所需要的动画资源的id

比如我的enter_anim

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000">
<translate
    android:fromYDelta="100.0%"
    android:toYDelta="0.0%"
    />
</set>

我的exit_anim文章来源地址https://www.toymoban.com/news/detail-468457.html

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000">
    <translate
        android:fromYDelta="0.0%"
        android:toYDelta="100.0%"/>

</set>

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

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

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

相关文章

  • Android-高级-UI-进阶之路-(二)-深入理解-Android-8-0-View-触摸事件分发机制,查漏补缺

    我们看到内部又调用了父类 dispatchTouchEvent 方法, 所以最终是交给 ViewGroup 顶级 View 来处理分发了。 顶级 View 对点击事件的分发过程 在上一小节中我们知道了一个事件的传递流程,这里我们就大致在回顾一下。首先点击事件到达顶级 ViewGroup 之后,会调用自身的 dispatchTouchE

    2024年04月14日
    浏览(61)
  • [Android 13]开机动画原理分析

    hongxi.zhu 2023-6-12 Lineageos_20(Android T) on Pixel 2XL 1.1 init.rc启动相应的进程 开机动画跑起来除了需要自身进程的启动外,还肯定以来显示系统的相关进程,即一定需要SurfaceFlinger的进程的合成和送显,所以这里需要启动SurfaceFlinger服务和bootanim服务,两者是在init.rc中启动。rc的触发阶

    2024年02月09日
    浏览(35)
  • Android MediaPlayer 深入分析与实践

            MediaPlayer 是 Android 提供的一个强大的音视频播放类,它允许开发者在应用程序中嵌入音频和视频的播放功能。本文从 MediaPlayer 的概述、工作原理、使用方法以及优势与局限性等方面进行全面的分析,并结合实际代码示例来指导读者如何高效地使用该技术。     

    2024年04月09日
    浏览(58)
  • Android JetPack深入分析Lifecycle源码

    关键类介绍 Lifecycle 定义: 用于存储有关组件(如 activity 或 fragment)的生命周期状态的信息,并允许其他对象观察此状态。 它是一个 抽象类 ,具体实现类为 LifecycleRegistry ; 内部提供了 addObserver(LifecycleObserver observer) 添加观察者 、 removeObserver(LifecycleObserver observer)移除观察者

    2024年02月12日
    浏览(77)
  • Android Compose 入门,深入底层源码分析

    我是跟着AS官网学习的,但是官方的教程写的不是很详细.官网链接 首先创建一个Compose项目,目录结构是这样: ui - theme - - Color.kt - - Theme.kt - - Type.kt MainActivity.kt 通过阅读源码,发现实际上还少了一个Shapes.kt,我手动添加了. 这个没什么好说的,官方的教程说的很明白了.这里简单贴一

    2024年04月10日
    浏览(43)
  • Android JetPack 深入分析ViewModel源码

    本文主要分析 ViewModel 相关源码,相关使用不再赘述,可参考Android ViewModel使用; ViewModel 概览 Google官方给的 ViewModel 定义如下: 定义主要提到两个关键点: 生命周期 上图是Google官网提供的 ViewModel生命周期图示 ,可以看到 ViewModel 的生命周期是从 onCreate 创建到 完成并销毁

    2024年02月11日
    浏览(29)
  • Android JetPack深入分析LiveData源码

    Google Android开发者 LiveData概览 在了解 LiveData 源码之前,建议先了解 LifeCycle 相关知识,请参考:Android JetPack深入分析Lifecycle源码 定义 从定义中,我们可以大概知道: LiveData 是一个数据存储类,能够感知 Activity 、 Fragment 等组件的生命周期,并且支持对它存储的数据进行观察

    2024年02月12日
    浏览(29)
  • Android 13 网络 Adb相关流程深入分析研究

    通过代码分析发现Android13 上对 网络adb 进行了限制! Android13原生代码要求:必现连接上某个wifi,才能进行adb ,并且切换wifi或者关闭wifi都是会停止adb。 并且Android13 上 wifi adb 端口号每次是变化的,这个也是很不方便的! 如果要做成Android11 或者之前一样,设备连接WiFi/有线网

    2024年02月09日
    浏览(37)
  • CSS 滚动驱动动画 view-timeline (view-timeline-name ❤️ view-timeline-axis )

    我们之前在 scroll() 中提到了一个因为绝对定位导致滚动无效的问题, 并使用 scroll-timeline 成功解决了这个问题, 而 scroll-timeline 起到的作用就是指定到底是哪个元素提供 scroll progress timeline . 与此相似, view-timeline 定义了一个具名的 view progress timeline , 通过滚动容器( scroller )中的某

    2024年02月08日
    浏览(27)
  • 带你深入了解Activity,View,Window三者的关系

    Activity、View和Window是Android中三个重要的概念,它们之间存在着紧密的关系。在本文中,我们将详细讨论Activity、View和Window之间的关系,并提供相应的示例代码。 Activity: Activity是Android应用程序的一个组件,它代表着用户界面的一个单独的屏幕。每个Activity都有一个与之关联的

    2024年02月07日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包