【Android】App开发-动画效果篇

news2025/1/21 18:55:30

在我们玩手机的过程中,如果我们点击某一个页面时,会出现一个页面动画加载或者动画效果的现象。现在我们就来看看App开发中是如何实现动画效果的。

目录

动画的分类

逐帧动画:

补间动画:


动画的分类

在常见的app使用的动画中,常见的就是逐帧动画、补间动画和属性动画,这三种动画各有优点,下面我们来看看它们是如何是实现的:

逐帧动画:

逐帧动画,顾名思义就是动画的内容是由一张张图片构成的,所以我们只需要设置这些图片的展现次序以及展现的实现就可以实现逐帧动画的效果。

要想实现逐帧的动画,首先我们得有几张动画,我准备了下面6张图片,我计划让它们像放幻灯片一样每隔一段时间来显示:

准备完了照片,接下来就该创建一个动画的列表来播放这些图片:我们在drawable文件下面新创建一个animation(动画)类型的xml文件用于存储这几张要按动画效果播放的图片,这样这些图片就可以按照逐帧的形式展现了。创建完后我们记得将下面红圈位置改成animation-list,这样才能创造一个animation类型的控件:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    tools:ignore="MissingDefaultResource">

    <item android:drawable="@drawable/pic2" android:duration="220"/>
    <item android:drawable="@drawable/pic2" android:duration="220"/>
    <item android:drawable="@drawable/pic3" android:duration="220"/>
    <item android:drawable="@drawable/pic4" android:duration="220"/>
    <item android:drawable="@drawable/pic5" android:duration="220"/>
    <item android:drawable="@drawable/pic6" android:duration="220"/>

</animation-list>

准备完了播放的动画,接下来我们就要准备一个Relativelayout图层来容纳这个动画xml文件,这里的xml文件可以近似看成一张图片,只不过是一张会动的图片,所以我们处理它们的时候可以按照类似图片的方式处理。我们设置背景就是这个动画xml文件,这样就可以将这个动画xml文件逐帧在背景上显示了,这里也可以调整出一个区域来设置设置这张“图片”,这样它不是全屏播放。因为下面我们设置放置这张“图片”的位置是Relativelayout的backgrou即背景。既然我们图片可以作为背景,那么图片也可以在一个区域中显示,所以我们也可以划出一个区域来放置:

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/animation"
        android:id="@+id/Relid"
    />

设置完这些我们就可以直接在Main程序里面创建这个图层了,首先我们必须要创建一个Relativelayout的图层,并且将之前我们设置的图层通过findbyid的形式找到并且传递给创建的变量,然后再实例化一个动画类型的变量animation,为了触发这个动画效果,我们还设置调用Relativelayout里面的点击效果函数来设置点击开启动画效果。动画效果的开始就是调用动画类型变量animation里的start方法,结束就是调用stop方法:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RelativeLayout relativeLayout = findViewById(R.id.Relid);
        AnimationDrawable animationDrawable = (AnimationDrawable) relativeLayout.getBackground();
        relativeLayout.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                animationDrawable.start();
            }
        });
    }

补间动画:

在我们看完逐帧动画之后,下面我们就来看一下补间动画。所谓的补间动画就是操作图片进行平移、缩放、旋转和透明度设置的操作。

要对图片进行操作,首先我们要准备一张图片:

    <ImageView
        android:id="@+id/img1"
        android:layout_width="0dp"
        android:layout_height="300dp"
        android:layout_marginStart="54dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="54dp"
        android:src="@drawable/pic5"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

准备完了要去操作的图片,进行补间动画的操作我们需要在res文件夹下新创一个文件夹,并且命名为“anim”一定要叫anim,其它名字没有Animation Resource file的文件),然后再在这个文件夹下面创建出一个Animation Resource file的文件:

下图为改了anim名字后的文件,里面没有Animation Resource file的文件:

这个Animation Resource file文件编写记录的是我们的操作,补间动画对图片有四种操作:Alpha、roatate、translate、scales。分别对应:透明度变化、旋转、平移和放缩。下面我们来看看四种变换的实现方式:

alpha:

alpha表示对图片进行透明度处理,当我们在anim目录下新创一个Animation Resource file后,我们会得到一个set的节点,我们再在节点里面创建一个aplha节点,如下图所示。这个节点就是用来配置图片透明度处理信息的。fromalpha表示开始时图片的透明度,这里选择完全不透明,我想要的效果是图片一开始完全不透明,我点击后它会逐渐变透明,所以toalpha我选择0。这里有一个很重要的设置就是duration,它表示这个图片透明度变化的持续时间,必须要设置。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0"
        android:duration = "6000"
        />
</set>

变化效果(变化过程中):

rotate:

这个表示图片旋转动画,与前面类似,只不过配置方法不同。这里的fromDegrees表示开始时图片的角度,我设置为0度,旋转完成后的角度为toDegrees,我设置为180度,旋转轴为pivotX和pivotY,它们分别表示旋转轴在图片的哪个位置,50%、50%表示在X、Y轴一半处,也就是中心。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:fromDegrees="0"
        android:toDegrees="180"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration = "6000"
        />
</set>

旋转效果(变化过程中):

 translate:

这种变换是平移变换,既然是平移,就需要初始位置和末尾位置,初始位置fromXdelta和fromYDelta就直接设置为0,0。末尾位置就设置为移动量为X是20和Y是300处。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="20"
        android:toYDelta="100"
        android:duration = "6000"

        />
</set>

移动过程:

 

scale:

这个操作表示缩放效果,它也要有一个缩放的中心轴。这里我们就照旧设置为中点。既然缩放,那就免不了有缩放前的比例和缩放后的比例。缩放前的fromXScale和fromYScale我们就设置为1,就是原始状态。而缩放后的toXScale和toYScale就设置为都是0.5即可。这个变换表示将长、宽图片按0.5比例缩小。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromXScale="1"
        android:fromYScale="1"
        android:toXScale="0.5"
        android:toYScale="0.5"
        android:duration = "6000"
        />
</set>

缩放效果(变化过程中):

了解完四种变化效果,接下来就要将变化效果设置到图片中去了。首先照旧在Main方法里创建出来图片,并且设置点击方法。这里我们要想用到动画效果,就需要将动画效果加载到图片中。首先我们实例化出一个动画效果的对象an。然后将这个对象通过AnimationUtils的loadAnimation方法加载到an里面这个loadAnimation方法两个参数,一个是上下文,另一个是我们之前创建的4中动画效果,要加载哪一种就找到它将它传进去即可。最后就是调用图片控件的startAnimation方法,将动画效果的对象作为参数传递进去即可。

ImageView imageView = findViewById(R.id.img1);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Animation an = AnimationUtils.loadAnimation(MainActivity.this, R.anim.scales);
                imageView.startAnimation(an);
            }
        });

​​​​​​​

 

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

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

相关文章

面试:事件拦截相关问题

Q1&#xff1a;分发的事件被view消耗了&#xff0c;后续事件是如何快速找到这个view的&#xff1f; ViewGroup不拦截事件又是如何将事件分发给子View&#xff1f; 带着问题重学Android事件分发 - 掘金 我们之前经常背的八股文&#xff1a; 当你手指触摸到屏幕这时候ViewGro…

BUUCTF Misc 隐藏的钥匙 另外一个世界 FLAG 神秘龙卷风

隐藏的钥匙 下载文件 使用010 editor工具查看 查找flag 将内容复制到base64在线 得到flag flag{377cbadda1eca2f2f73d36277781f00a} 另外一个世界 下载文件 使用010 eitor查看 看到了一串二进制&#xff0c;进行二进制转换字符串 得到flag flag{ko…

XCTF1-web unseping

unseping 题目描述 进入场景 源代码分析&#xff0c;反序列化场景 <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_…

FPGA 20个例程篇:18.SD卡存放音频WAV播放(上)

第七章 实战项目提升&#xff0c;完善简历 18.SD卡存放音频WAV播放&#xff08;上&#xff09; 在最后一章里&#xff0c;我们来做几个实战项目&#xff0c;一方面是对前面学习知识的一种回顾&#xff0c;另一方面这几个小项目也非常贴近实际工程&#xff0c;其中例程“SD卡存…

CENTOS安装 graylog4.39

我们直接开始 基础环境和java sudo yum install epel-release 并安装带有 sudo yum install pwgenyum install java-1.8.0-openjdk-headless.x86_64 MONGODB 安装数据库 vi /etc/yum.repos.d/mongodb-org.repo[mongodb-org-4.2] nameMongoDB Repository baseurlhttps://rep…

【STL】map容器

map 作为关联式容器的一种&#xff0c;map容器存储的都是pair对象&#xff0c;也就是用pair类模板创建的键值对。其中&#xff0c;各个键值对的键和值可以是任意数据类型&#xff0c;包括C基本数据类型、使用结构体或类自定义的类型。 默认情况下&#xff0c;map容器选用std:…

vmware虚拟机centos7扩容

vmware先进行磁盘扩展 从原来的20G扩展到100G: 扩展磁盘时可能会遇到需要修复磁盘的情况: // 进入vmware安装目录cd D:\开发工具\VMWare\ // 修复, 其中.vmdk文件为虚拟机磁盘文件vmware-vdiskmanager -R "F:\VM_Centos\CentOS 7 64 位.vmdk" 扩展成功&#xff1…

mysql死锁介绍以及解决

什么是死锁 死锁是2个线程在执行过程中&#xff0c; 因争夺资源而造成的相互等待的现象&#xff0c;若无外力作用&#xff0c;它们将无法推进下去。 死锁产生的4个必要条件 互斥条件 指进程对所分配的资源进行排他性使用&#xff0c;即一段时间内某资源只有一个进程占用&#…

TC277的Ovc功能

TC277的Ovc功能 文章目录前言Data Access Overlay (OVC)<br>特点和功能概述数据访问重定向目标内存地址Online Data Acquisition (OLDA) SpaceOverlay MemoriesLocal MemoryEmulation MemoryDSPR & PSPR MemoryGlobal Overlay ControlGlobal Overlay Control Synchro…

控制算法-模型预测MPC

本文记录一下MPC控制算法的学习过程和自己的理解&#xff0c;初步接触控制算法&#xff0c;理解肯定不是很完善&#xff0c;重在记录思考的过程。 背景 随着自动驾驶技术以及机器人控制技术的不断发展及逐渐火热&#xff0c;模型预测控制(MPC)算法作为一种先进的控制算法&…

LeetCode 202. 快乐数

题目链接&#xff1a;https://leetcode.cn/problems/happy-number/ 思路如下&#xff1a; 由题目可知&#xff0c;nnn 的取值在 [1,231−1][1, 2^{31}-1][1,231−1] 的范围内&#xff0c;在 [1,2147483647][1, 2147483647][1,2147483647] 这个区间里面&#xff0c;平方和最大…

【博客544】golang pprof性能调试:寻找memory瓶颈

golang pprof性能调试&#xff1a;寻找memory瓶颈 1、前置 pprof的使用与输出列解析看姐妹篇&#xff1a;golang pprof性能调试&#xff1a;寻找cpu瓶颈 2、引入pprof到程序中&#xff0c;以调试memory瓶颈 给程序加入&#xff1a; import _ "net/http/pprof"go…

Java 8 集合 Stream

Java 8 是一个成功的版本&#xff0c;新增的内容很实用。比如大家熟悉的 lamda 表达式&#xff0c;集合的 Stream&#xff0c;等等。 本文讲讲 Stream 的使用。 Stream 是什么&#xff1f; Stream 将要处理的集合看做流&#xff0c;然后方便的对流做操作&#xff0c;比如筛选…

node日志log4js库使用示例

在node开发或者electron项目开发中&#xff0c;我们可能需要记录日志的功能&#xff0c;便于我们出错排查问题。今天介绍node中的日志库log4js。 log日志记录&#xff0c;一般需要配置日志记录的级别&#xff0c;日志输出类型&#xff0c;日志格式等信息。log4js可以在初始化的…

ssh免密登陆

文章目录一、免密登陆1、生成密钥对2、将公钥拷贝到所创建的虚拟机上3、测试免密登陆成功没有二、遇到免密登陆失败的解决办法解决办法1、修改机器名&#xff0c;去掉.novalocal后缀2、重新做免密登录一、免密登陆 ssh密钥登录比密码登录安全&#xff0c;主要是因为他使用了非…

Spring - BeanPostProcessors 扩展接口

文章目录PreBean的生成过程org.springframework.beans.factory.config.BeanPostProcessor 介绍ApplicationContext注册Bean PostProcessor源码解析AbstractApplicationContext#refreshAbstractApplicationContext#registerBeanPostProcessorsPostProcessorRegistrationDelegate…

InnoDB底层存储结构探秘

一 innoDB 为什么不用平衡二叉树 计算机存储层次结构 计算机存储设备一般分为两种&#xff1a;内存储器(main memory)和外存储器(external memory)。 内存储器为内存&#xff0c;内存存取速度快&#xff0c;但容量小&#xff0c;价格昂贵&#xff0c;而且不能长期保存数据(在…

动物大全和动物识别系统毕业设计,动物大全和动物AI识别系统设计与实现,动物识别系统论文毕设作品参考

功能清单 【后台管理员功能】 系统设置&#xff1a;设置网站简介、关于我们、联系我们、加入我们、法律声明 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信息&a…

第七届NVIDIA Sky Hackathon项目报告书

系列文章目录 数据集收集和标注情况 1.1ASR语音数据集收集和标注情况 1.2CV图像数据集收集和标注情况进行模型的训练 2.1进行ASR模型的训练 2.2进行CV模型的训练在Jetson平台进行部署和推理 3.1部署和推理ASR模型 3.2部署和推理CV模型优化UI界面 文章目录系列文章目录1. 数据集…

详解BFS,Dijkstra算法,Floyd算法是如何解决最短路径问题的

目录 1.BFS算法 2.Dijkstra算法 3.Floyd算法 4.总结 1.BFS算法 G纲是个物流离散中心&#xff0c;经常需要往各个城市运东西&#xff0c;怎么运送距离最近——单源最短路径问题 各个城市之间也学要来往&#xff0c;相互之间怎么走距离最近&#xff1f;——每对顶点之间的最…