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

news2024/11/28 6:34:29

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开头的

除了它还有

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwJl7rBA-1685089024595)(../../assets/QQ图片20230526113250.png)]

这几种,但我试了一下,如果只把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是可以看到动画效果的,剩余的元素看不到动画效果

会这样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-okabojUN-1685089024596)(../../assets/QQ图片20230526121656.jpg)]

除了在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

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

</set>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/572935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python+vue旅游攻略分享推荐网站p0667

基于Python语言设计并实现了旅游分享网站。该系统基于B/S即所谓浏览器/服务器模式&#xff0c;应用Django框架&#xff0c;选择MySQL作为后台数据库。系统主要包括用户、景点信息、攻略分类、旅游攻略、门票购买、留言反馈、论坛管理、系统管理等功能模块。 软件开发前的需求分…

某渣渣企业平台相关加密参数

网址 aHR0cHM6Ly93d3cucWNjLmNvbS93ZWIvZWxpYi90ZWNsaXN0P3RlYz1UX1RTTUVT抓包 GET /api/elib/getTecList?countyCode110101&flag&industry&isSortAsc&pageIndex2&pageSize20&provinceBJ&registCapiBegin&registCapiEnd&searchKey&…

修改git已经push到远端的最近一次提交的commit

需求&#xff1a; 最新一次提交的message写错了且已经push到远程仓库&#xff0c;但是又不想重新创建一个commit记录。 注意&#xff1a; 如果是多人协同开发&#xff0c;使用强推前一定确保当前版本最新&#xff0c;期间无人提交代码。 使用git Bash进入命令行窗口 git co…

基于langChain 的privateGPT 文档问答 研究

参考&#xff1a;gihtub代码 https://github.com/imartinez/privateGPT 官网 privateGPT可以在断网的情况下&#xff0c;借助GPT和文档进行交互&#xff0c;有利于保护数据隐私。 privateGPT可以有四个用处&#xff1a; 1.增强知识管理&#xff1a;私有LLMs自动化&#xff0c…

《Spring Guides系列学习》guide26 - guide30

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

numpy库报错has no attribute ‘_no_nep50_warning‘的解决

本文介绍在Python中&#xff0c;numpy库出现报错module numpy has no attribute _no_nep50_warning的解决方法。 一次&#xff0c;在运行一个Python代码时&#xff0c;发现出现报错module numpy has no attribute _no_nep50_warning&#xff0c;如下图所示。 其中&#xff0c;这…

华为nova11系列:一个月的深度体验感受,告诉你值不值得入手

作为一个追求时尚风格的年轻人&#xff0c; nova系列手机一直是我的关注重点。nova 11 Pro发布之后&#xff0c;独特少见的11号色一下子就戳中了我&#xff0c;于是第一时间我给我自己和我老婆分别下单了一台nova 11和nova 11 Pro。 作为主力机深度使用一个月后&#xff0c;可以…

如何做好建筑行业的信息化建设?

如何做好建筑行业的信息化建设&#xff1f; 首先&#xff0c;我们来了解一下&#xff0c;什么是信息化转型&#xff1f; 信息化转型是指企业或组织通过应用信息技术&#xff0c;以提高业务效率和创新能力&#xff0c;实现组织战略目标的过程。 随着数字技术的发展&#xff0…

把字节大佬花3个月时间整理的软件测试面经偷偷给室友,差点被他开除了···

写在前面 “这份软件测试面经看起来不错&#xff0c;等会一起发给他吧”&#xff0c;我看着面前的面试笔记自言自语道。 就在这时&#xff0c;背后传来了leder“阴森森”的声音&#xff1a;“不错吧&#xff0c;我可是足足花了三个月整理的” 始末 刚入职字节的我收到了大学室…

Junit常见用法

一.Junit的含义 Junit是一种Java编程语言的单元测试框架。它提供了一些用于编写和运行测试的注释和断言方法&#xff0c;并且可以方便地执行测试并生成测试报告。Junit是开源的&#xff0c;也是广泛使用的单元测试框架之一。 二.Junit常用注解 1.Test 表示执行此测试用例 T…

代码随想录训练营Day51| 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

目录 学习目标 学习内容 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组 学习目标 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组 学习内容 300.最长递增子序列 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09;https…

便携式水质检测仪应用范围

随着环境污染的加剧&#xff0c;人们对水质检测的关注越来越多。传统的水质检测仪器往往只能测定单一参数&#xff0c;难以全面准确地反映水质情况。而多参数水质检测仪可以实现同时测定多个参数&#xff0c;为水质检测提供了更加全面准确的数据。它采用多种先进的技术&#xf…

STM32【H7】理论——MPU、Cache

文章目录 1. MPU - 内存保护单元 1. MPU - 内存保护单元 MPU&#xff1a;(Memory Protection Unit,内存保护单元),早在 STM32F1 和 F4 芯片上面也是有这个功能的,但是基本用不上。但是到了 H7 就得用上了,因为要设置 Cache&#xff1b; MPU的作用&#xff1a; 将 memory map&a…

医疗健康元宇宙仿真场景为治疗提供个性化方案

虚拟现实VR元宇宙是一种基于VR虚拟现实制作的全新交互平台&#xff0c;可以为用户提供沉浸式的体验。随着人们对医院就诊服务要求不断提高&#xff0c;借助VR元宇宙平台&#xff0c;将医生为医生、护士和患者提供了一个全新的交流和治疗场景&#xff0c;对提高诊疗水平和服务体…

「实在RPA·税务数字员工」助力税务乘上数字化转型快车

中共中央办公厅国务印发《关于进一步深化税收征管改革的意见》表示&#xff1a;着力建设以服务纳税人缴费人为中心、以发票电子化为改革突破口、以税收大数据为驱动力的具有高集成功能、高安全性能、高应用效能的智慧税务。2023年实现从经验式执法向科学精确执法转变&#xff1…

k8s滚动更新

1.编写一个yaml文件 vi deployment-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata: labels:app: nginxname: nginxnamespace: default spec:replicas: 3progressDeadlineSeconds: 600 #表示在这个时间段内&#xff0c;如果 Deployment 的 Pod 没有完成更新&…

EtherCAT运动控制卡开发教程之python

众所周知&#xff0c;Python作为一门面向对象的新兴开发语言&#xff0c;具有非常完善的基础代码库&#xff0c;更注重实用&#xff0c;同时代码可读极强&#xff0c;编写完程序即可直接运行&#xff0c;被越来越多的人广泛将它用于机器视觉和自动化控制。 今天正运动技术与大…

第三十七章 扩展知识点

1、setState (1). setState(stateChange, [callback])------对象式的setState1.stateChange为状态改变对象(该对象可以体现出状态的更改)2.callback是可选的回调函数, 它在状态更新完毕、界面也更新后(render调用后)才被调用(2). setState(updater, [callback])------函数式的…

敏捷专题:新一代的汽车软件研发

过去&#xff0c;买车属于一锤子买卖&#xff0c;但近年来智能制造、新能源汽车等概念的狂飙突进下&#xff0c;个性化、定制化、智能化的新车型正倍速来到消费者面前&#xff0c;不到20万元就能买到各大车企搭载了智能座舱和智能驾驶功能的产品。 ▲智能座舱 众所周知&#xf…

(一)微服务中间键工作原理——nacos客户端服务注册原理说明及源码解读

前言 本节内容我们主要介绍一下中间键nacos的客户端服务注册原理及其源码解读&#xff0c;便于我们理解nacos作为服务注册中心的具体实现。在springcloud的微服务体系中&#xff0c;nacos客户端的注册是通过使用spring的监听机制ApplicationListener实现的。学习本节内容&…