一起Talk Android吧(第五百四十三回:如何实现流水动画)

news2024/11/17 13:35:53

文章目录

  • 概念介绍
  • 实现方法
    • 平移动画
    • 逐帧动画
  • 经验总结

各位看官们大家好,上一回中咱们说的例子是"无进度值ProgressBar",本章回中介绍的例子是" 如何实现流水动画"。闲话休提,言归正转,让我们一起Talk Android吧!

概念介绍

上一章回中在进度条内使用了动画文件,不过没有详细介绍,我们在本章回中将详细介绍此动画文件,我们称这类动画为流水动画,因为它的效果是向水流一样的直线,如果大家不理解的话,可以参考下面的动画:
在这里插入图片描述

实现方法

平移动画

我们先有一个整体的思路:创建一个直线然后将它从左向右移动,创建直线使用drawable中的shap,移动使用平移类动画。下面是具体的实现步骤:

  1. 创建drawable资源文件,也就是动画中使用的直线,为了好看,代码中使用了渐变色。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
<!--    不指定宽度时默认为无限大-->
<!--    android:width="100dp"-->
    <size
        android:height="1dp">
    </size>
    <!--    填充色-->
    <solid android:color="@color/color_text_gray"/>
    <gradient
        android:startColor="#FF00FF"
        android:centerColor="@color/white"
        android:centerX="0.2"
        android:endColor="@color/white"
        android:angle="0"
        />
</shape>
  1. 创建动画文件,动画是平移类动画,主要用来移动直线。
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromYDelta="0"
        android:fromXDelta="0"
        android:toYDelta="0%"
        android:toXDelta="100%"
        android:duration="2001">
</translate>

上面的动画是从左到右移动直线(文件名line_translate_to_large.xml),下面的动画是从右到左移动直线(文件名:line_translate_to_small.xml)。动画的的思路是让图像的x轴从0变到最大,或者从最大变到0.

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="100%"
    android:fromXDelta="100%"
    android:toYDelta="100%"
    android:toXDelta="0"
    android:duration="2001">
</translate>
  1. 创建ImageView组件,该组件用来显示直线,把直线赋值给它的src属性就可以。
<ImageView
    android:layout_marginTop="66dp"
    android:id="@+id/id_line"
    android:src="@drawable/line_with_color1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
</ImageView>
  1. ImageVeiw绑定动画,这样就可以使用动画来操作直线。因为ImageView是直线的载体。
mIVLine = mBinding.idLine;  //通过视图绑定获取ImageView组件
Animation animation1 = AnimationUtils.loadAnimation(this,R.anim.line_translate_to_large);
Animation animation2 = AnimationUtils.loadAnimation(this,R.anim.line_translate_to_small);
animation1.setRepeatCount(ValueAnimator.INFINITE);
animation2.setRepeatCount(ValueAnimator.INFINITE);
//        mIVLine.startAnimation(animation1);
mIVLine.startAnimation(animation2);

逐帧动画

使用逐帧动画也可以实现流水动画,具体的思路:把一个条直线分为n部分,每部分表示一帧,通过逐帧动画播放所有的帧进而实现流水效果,下面是具体的效果图:
在这里插入图片描述

  1. 创建drawable资源文件,代码中使用渐变色,一共五个文件,表示把直线分成五部分,文件名为line_with_color1,2,3,4,5
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <size
        android:height="1dp">
    </size>
    <solid android:color="@color/color_text_gray"/>
    <gradient
        android:startColor="#FF00FF"
        android:centerColor="@color/white"
        android:centerX="0.2"
        android:endColor="@color/white"
        android:angle="0"
        />
</shape>

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    android:shape="rectangle">
    <size
        android:height="1dp">
    </size>
    <solid android:color="@color/color_text_gray"/>
    <gradient
        android:startColor="#FF00FF"
        android:centerColor="@color/white"
        android:centerX="0.4"
        android:endColor="@color/white"
        android:angle="0"
        />
</shape>

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    android:shape="rectangle">
    <size
        android:height="1dp">
    </size>
    <solid android:color="@color/color_text_gray"/>
    <gradient
        android:startColor="@color/white"
        android:centerColor="#FF00FF"
        android:centerX="0.55"
        android:endColor="@color/white"
        android:angle="0"
        />
</shape>

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    android:shape="rectangle">
    <size
        android:height="1dp">
    </size>
    <solid android:color="@color/color_text_gray"/>
    <gradient
        android:startColor="@color/white"
        android:centerColor="@color/white"
        android:centerX="0.6"
        android:endColor="#FF00FF"
        android:angle="0"
        />
</shape>


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    android:shape="rectangle">
    <size
        android:height="1dp">
    </size>
    <solid android:color="@color/color_text_gray"/>
    <gradient
        android:startColor="@color/white"
        android:centerColor="@color/white"
        android:centerX="0.9"
        android:endColor="#FF00FF"
        android:angle="0"
        />
</shape>
  1. 创建动画文件,使用animation-list把五个文件包含起来,形成动画集合,每个文件相当于动画中的一帧。下面是详细的代码:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/line_with_color1" android:duration="500"> </item>
    <item android:drawable="@drawable/line_with_color2" android:duration="500"> </item>
    <item android:drawable="@drawable/line_with_color3" android:duration="500"> </item>
    <item android:drawable="@drawable/line_with_color4" android:duration="500"> </item>
    <item android:drawable="@drawable/line_with_color5" android:duration="500"> </item>
</animation-list>

代码中的duration表示每帧的播放时间,单位为ms,它可以控制动画的速度,也就是流水的速度,时间值越小流水速度越快,反之越慢。

item中包含了上面定义的文件,每个item表示一帧,每帧相当于直线中的一部分。我使用渐变色来区分不同的帧,从整体上看渐变色中最亮的紫色,从第一帧到最后一帧依次从左到右偏移,下面是偏移效果图。从上到上看,紫色依次从左到向偏移。我在这里使用的是drawable来表示直线,也可以使用图片来表示直线,不过图片中的颜色也要保持同样的效果。
在这里插入图片描述

  1. 创建ImageView,主要用来显示直线,把动画集赋值给它的src属性就可以。
<ImageView
    android:layout_marginTop="66dp"
    android:id="@+id/id_line"
    android:src="@drawable/line_animation_list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
</ImageView>
  1. ImageVeiw绑定动画
mIVLine = mBinding.idLine;
AnimationDrawable animationDrawable = (AnimationDrawable) mIVLine.getDrawable();
animationDrawable.start();

经验总结

实现流水动画的核心思路就是平移图片,围绕此思路,我们给出了两种实现方法,不过逐帧动画的效果比直接平移动画的效果好一些。

直接平移时会有空白,因此有种不连贯的感觉。而逐帧动画平移时其它帧会补充空白,看上去很连贯。如果把逐帧动画中的文件替换成图片的话效果更加好,在此基础上增加图片的数量相当于增加了帧的数量,这样做出的动画效果更加丝滑。

看官们,关于"如何实现流水动画"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

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

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

相关文章

Linux命令·ss

ss是Socket Statistics的缩写。顾名思义&#xff0c;ss命令可以用来获取socket统计信息&#xff0c;它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息&#xff0c;而且比netstat更快速更高效。 当服务器的socket连接数量变得非常…

triton 疑难手册

config.pbtxt 配置参数手册 backend或platform参数用于指示nvidia triton用对应的backend加载模型参数&#xff0c;它的使用示例如下&#xff1a; name: "xxx" platform: "pytorch_libtorch"max_batch_size: 8 input [ {name: "input0"data_ty…

算法加密与解密、字符编码与字符集

加密算法 加密保证数据不会被窃取或者修改 可逆和不可逆加密 区分在于加密后的结果是否可以还原 可逆加密&#xff1a;安全传输数据时使用(如jwt中的数据) AES:流加密 DES&#xff1a;块加密 RSA HS256 不可逆加密&#xff1a;同一个文件或内容每次加密的结果一…

GL绘制自定义线条2_手写曲线应用贝塞尔曲线

上一篇文章的曲线是由触摸点直接生成的&#xff0c;但触摸点并非连续的&#xff0c;而是离散的&#xff0c;而且屏幕触摸点采样的间隔时间其实不短&#xff0c;因此如果单纯只用触摸点生成OpenGL触摸曲线&#xff0c;在高速书写时会导致曲线看起来就像多个线段合起来一样&#…

为何ChatGPT一出现让巨头们都坐不住?

近几个月来&#xff0c;ChatGPT都是当仁不让的舆论话题。 上一次AI在全球范围内引起轰动&#xff0c;还是谷歌的AI机器人AlphaGO下棋战胜围棋世界冠军的时候。 ChatGPT的出现&#xff0c;让国内外几乎所有的科技巨头都坐立不安。 2月1日&#xff0c;谷歌母公司Alphabet首席执…

C++跨平台“点绘机” 代码解读

前言 球球大作战可以自定义皮肤&#xff0c;用画刷绘制。 想着用软件来绘制。 初次尝试&#xff0c;没有达成最终目的&#xff0c;不过也有很大收获。 仓库链接&#xff1a;https://github.com/sixsixQAQ/dolphin 问题 这个半成品&#xff0c;已经有了基本结构了&#xff…

高德地图api 地理编码(地址-->坐标)geocoder.getLocation在官方可以测试出结果,下载代码到本地却用不了 问题解决

问题 高德地图api 地理编码&#xff08;地址-->坐标&#xff09;功能&#xff0c;通过输入 地址信息 得到 经纬度信息。geocoder.getLocation在官方可以测试出结果&#xff0c;下载代码到本地却用不了。 官方示例测试&#xff0c;可以从地址得到坐标 下载官方代码本地运行却…

常见注意力机制解析

1.Squeeze-and-Excitation&#xff08;SE&#xff09; SE的主要思想是通过对输入特征进行压缩和激励&#xff0c;来提高模型的表现能力。具体来说&#xff0c;SE注意力机制包括两个步骤&#xff1a;Squeeze和Excitation。在Squeeze步骤中&#xff0c;通过全局平均池化操作将输…

【2023年Mathorcup杯数学建模竞赛C题】电商物流网络包裹应急调运与结构优化--完整作品分享

1.问题背景 2.论文摘要 为了应对电商物流网络中物流场地和线路电商物流网络中物流场地和线路上货量波动的情况&#xff0c; 设计合理的物流网络调整方案以保障物流网络的正常运行。本文运用 0-1 整数规划模型&#xff0c;多目标动 态规划模型&#xff0c;给出了问题的结果。 针…

深入讲解eMMC简介

1 eMMC是什么 eMMC是embedded MultiMediaCard的简称&#xff0c;即嵌入式多媒体卡,是一种闪存卡的标准&#xff0c;它定义了基于嵌入式多媒体卡的存储系统的物理架构和访问接口及协议&#xff0c;具体由电子设备工程联合委员会JEDEC订立和发布。它是对MMC的一个拓展&#xff0…

redi缓存使用

1、缓存的特征 第一个特征&#xff1a;在一个层次化的系统中&#xff0c;缓存一定是一个快速子系统&#xff0c;数据存在缓存中时&#xff0c;能避免每次从慢速子系统中存取数据。 第二个特征&#xff1a;缓存系统的容量大小总是小于后端慢速系统的&#xff0c;不可能把所有数…

GAMES101 计算机图形学 | 学习笔记 (上)

目录 环境安装什么是计算机图形学物体上点的坐标变换顺序齐次坐标光栅化如何判定一个点在三角形内光栅化填充三角形示例代码光栅化产生的问题 采样不足&#xff08;欠采样&#xff09;导致锯齿抗锯齿滤波算法 环境安装 1. C中安装opencv库 2. C中安装eigen库 3. C中安装open…

ChatGPT调教指北,技巧就是效率!

技巧就是效率 很多人都知道ChatGPT很火很强&#xff0c;几乎无所不能&#xff0c;但跨越了重重门槛之才有机会使用的时候却有些迷茫&#xff0c;一时间不知道如何使用它。如果你就是把他当作一个普通的智能助手来看待&#xff0c;那与小爱同学有什么区别&#xff1f;甚至还差劲…

热乎的面经——踏石留印

⭐️前言⭐️ 本篇文章记录博主面试北京某公司所记录的面经&#xff0c;希望能给各位带来帮助。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论…

Origin如何绘制三维图形?

文章目录 0.引言1.使用矩阵簿窗口2.三维数据转换3.三维绘图4.三维曲面图5.三维XYY图6.三维符号、条状、矢量图7.等高线图 0.引言 因科研等多场景需要&#xff0c;绘制专业的图表&#xff0c;笔者对Origin进行了学习&#xff0c;本文通过《Origin 2022科学绘图与数据》及其配套素…

63.空白和视觉层级的实战应用

例如看我们之前的小网页&#xff1b; 这些标题的上下距离一样&#xff0c;这样让我们很容易对这些标题进行混淆&#xff0c;我们可以适当的添加一点空白 header, section {margin-bottom: 96px; }这样看上去似乎就好很多&#xff01; 除此之外&#xff0c;如我们之间学的空…

【line features】线特征

使用BinaryDescriptor接口提取线条并将其存储在KeyLine对象中&#xff0c;使用相同的接口计算每个提取线条的描述符&#xff0c;使用BinaryDescriptorMatcher确定从不同图像获得的描述符之间的匹配。 opencv提供接口实现 线提取和描述符计算 下面的代码片段展示了如何从图像中…

K8S相关核心概念

个人笔记&#xff1a; 要弄明白k8s的细节&#xff0c;需要知道k8s是个什么东西。它的主要功能&#xff0c;就是容器的调度--也就是把部署实例&#xff0c;根据整体资源的使用状况&#xff0c;部署到任何地方 注意任何这两个字&#xff0c;预示着你并不能够通过常规的IP、端口…

如何全面学习Object-C语言的语法知识 (Xmind Copilot生成)

网址&#xff1a;https://xmind.ai/login/ 登录后直接输入&#xff1a;如何全面学习Object-C语言的语法知识&#xff0c;就可以生成大纲 点击右上角的 按钮&#xff0c;可以显示md格式的问题&#xff0c;再点击生成全文&#xff0c;就可以生成所有内容了&#xff0c; 还有这个…

CentOS7/8 安装 5+ 以上的Linux kernel

CentOS以稳定著称&#xff0c;稳定在另外一方面就是保守。所以CentOS7还在用3.10&#xff0c;CentOS8也才是4.18。而当前最新的Linux Kernel都更新到6.0 rc3了。其他较新的发行版都用上了5.10的版本。本文简单介绍如何在CentOS7、8上直接安装5.1以上版本的第三方内核。 使用ted…