Android动画学习记录一(Android动画种类、补间动画和帧动画)

article/2025/8/21 21:01:36

Android动画学习记录一(动画种类、补间动画和帧动画)

动画种类、补间动画和帧动画

  • Android动画学习记录一(动画种类、补间动画和帧动画)
  • 一、动画种类
  • 二、View动画
    • 2.1 补间动画
      • 补间动画公有属性
      • 平移动画(Translate)
      • 缩放动画(Scale)
      • 旋转动画(Rotate)
      • 透明度动画(Alpha)
      • 组合动画
    • 小结
      • 监听动画
    • 2.2 补间动画的特殊使用场景
      • Activity切换
      • Fragment切换
      • 视图组(ViewGroup)中子元素的出场效果(LayoutAnimation)
    • 2.3 属性动画
  • 三、帧动画
      • 使用方式
      • 参考资料

一、动画种类

Android动画主要分为分为两大类(三种):

  1. View动画:补间动画、帧动画
  2. 属性动画
    帧动画通过顺序播放一系列图像从而产生动画效果,可以简单理解为图片切换动画,很显然,如果图片过多过大就会导致OOM
    属性动画通过动态地改变对象的属性从而达到动画效果,属性动画为API 11的新特性,在低版本无法直接使用属性动画,但是我们仍然可以通过兼容库来使用它。

二、View动画

在这里插入图片描述

View动画通过对场景里的对象不断做图像变换(平移、缩放、旋转、透明度)从而产生动画效果,它是一种渐近式动画,并且支持自定义。

2.1 补间动画

我们设置一个view开始和结束的位置,中间的view会自动由系统补齐。补间动画分为4种动画。

补间动画除了用于视图View平移、旋转、缩放 & 透明度外,还可以用于Activity 的切换效果(淡入淡出、左右滑动等),Fragement 的切换效果(淡入淡出、左右滑动等),视图组(ViewGroup)中子元素的出场效果(淡入淡出、左右滑动等)。

补间动画公有属性

android:duration="3000" // 动画持续时间(ms),必须设置,动画才有效果
android:startOffset ="1000" // 动画延迟开始时间(ms)
android:fillBefore = "true" // 动画播放完后,视图是否会停留在动画开始的状态,默认为true
android:fillAfter = "false" // 动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false
android:fillEnabled= "true" // 是否应用fillBefore值,对fillAfter值无影响,默认为true
android:repeatMode= "restart" // 选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart|
android:repeatCount = "0" // 重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复
android:interpolator = "@android:anim/accelerate_decelerate_interpolator" // 插值器,即影响动画的播放速度

android:interpolator
表示动画集合所采用的插值器,插值器影响动画的速度,非匀速动画就需要通过插值器来控制动画的播放过程,比如前200ms很慢,中间600ms很快,最后200ms又很慢。这个属性可以不指定,默认@android:anim/accelerate_decelerate_interpolator,即加速减速插值器。

平移动画(Translate)

res/anim/目录下创建xml文件

<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android"android:fromXDelta="0" // 视图在水平方向x 移动的起始值android:toXDelta="100" // 视图在水平方向x 移动的结束值android:fromYDelta="0" // 视图在竖直方向y 移动的起始值android:toYDelta="100" // 视图在竖直方向y 移动的结束值/> 

<translate>标签标示平移动画,对应TranslateAnimation类,它可以使一个View在水平和竖直方向完成平移的动画效果,它的一系列属性的含义如下:

  • android:fromXDelta——表示x的起始值,比如0;
  • android:toXDelta——表示x的结束值,比如100;
  • android:fromYDelta——表示y的起始值;
  • android:toYDelta——表示y的结束值。

缩放动画(Scale)

缩放动画中有轴点的概念,举个例子,默认情况下轴点是View的中心点,这个时候在水平方向进行缩放的话会导致View向左右两个方向同时进行缩放,但是如果把轴点设为View的右边界,那么View就只会向左边进行缩放,反之则向右边进行缩放。如果设置为View的20%,30%就会改变效果。

在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"android:fromXScale="0.0" // 动画在水平方向X的起始缩放倍数// 0.0表示收缩到没有;1.0表示正常无伸缩// 值小于1.0表示收缩;值大于1.0表示放大android:toXScale="2"  //动画在水平方向X的结束缩放倍数android:fromYScale="0.0" //动画开始前在竖直方向Y的起始缩放倍数android:toYScale="2" //动画在竖直方向Y的结束缩放倍数android:pivotX="50%" // 缩放轴点的x坐标android:pivotY="50%" // 缩放轴点的y坐标// 轴点 = 视图缩放的中心点
/> 

pivotX pivotY,可取值为数字,百分比,或者百分比p。
设置为数字时(如50),轴点为View的左上角的原点在x方向和y方向加上50px的点。在Java代码里面设置这个参数的对应参数是Animation.ABSOLUTE
设置为百分比时(如50%),轴点为View的左上角的原点在x方向加上自身宽度50%和y方向自身高度50%的点。在Java代码里面设置这个参数的对应参数是Animation.RELATIVE_TO_SELF
设置为百分比p时(如50%p),轴点为View的左上角的原点在x方向加上父控件宽度50%和y方向父控件高度50%的点。在Java代码里面设置这个参数的对应参数是Animation.RELATIVE_TO_PARENT

<scale>标签表示缩放动画,对应ScaleAnimation,它可以使View具有放大或者缩小的动画效果,它的一系列属性的含义如下:

  • android:fromXScale——水平方向缩放的起始值,比如0.5;
  • android:toXScale——水平方向缩放的结束值,比如1.2;
  • android:fromYScale——竖直方向缩放的起始值;
  • android:toYScale——竖直方向缩放的结束值;
  • android:pivotX——缩放的轴点的x坐标,它会影响缩放的效果;
  • android:pivotY——缩放的轴点的y坐标,它会影响缩放的效果。

旋转动画(Rotate)

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"android:fromDegrees="0" // 动画开始时 视图的旋转角度(正数 = 顺时针,负数 = 逆时针)android:toDegrees="270" // 动画结束时 视图的旋转角度(正数 = 顺时针,负数 = 逆时针)android:pivotX="50%" // 旋转轴点的x坐标android:pivotY="0" // 旋转轴点的y坐标
/> 

<rotate>标签表示旋转动画,对于RotateAnimation,它可以使View具有旋转的动画效果,它的属性的含义如下:

  • android:fromDegrees——旋转开始的角度,比如0;
  • android:toDegrees——旋转结束的角度,比如180;
  • android:pivotX——旋转的轴点的x坐标;
  • android:pivotY——旋转的轴点的y坐标。

透明度动画(Alpha)

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"android:fromAlpha="1.0" // 动画开始时视图的透明度(取值范围: -1 ~ 1)android:toAlpha="0.0"// 动画结束时视图的透明度(取值范围: -1 ~ 1)
/> 

<alpha>标签表示透明度动画,对应AlphaAnimation,它可以改变View的透明度,它的属性的含义如下:

  • android:fromAlpha——表示透明度的起始值,比如0.1;
  • android:toAlpha——表示透明度的结束值,比如1。

组合动画

<?xml version="1.0" encoding="utf-8"?>
// 采用< Set/>标签
<set xmlns:android="http://schemas.android.com/apk/res/android">// 组合动画独特的属性android:shareinterpolator =true// 表示组合动画中的动画是否和集合共享同一个差值器// 如果集合不指定插值器,那么子动画需要单独设置// 组合动画播放时是全部动画同时开始
// 如果想不同动画不同时间开始就要使用android:startOffset属性来延迟单个动画播放时间
/>

<set>标签表示动画集合,对应AnimationSet类,它可以包含若干个动画,并且它的内部也是可以嵌套其他动画集合。
android:shareInterpolator
表示集合中的动画是否和集合共享同一个插值器。如果集合不指定插值器,那么子动画就需要单独指定所需的插值器或者使用默认值。

小结

以上动画的在Java代码中的用法有两种


第一种:
Animation xxxxanimation = AnimationUtils.loadAnimation(this, R.anim.filename);
view.startAnimation(xxxxanimation);第二种:
AlphaAnimation xxxxalphaAnimation = new AlphaAnimation(0,1);
xxxxalphaAnimation.setDuration(3000);
view.startAnimation(xxxxalphaAnimation);

监听动画

通过Animation的setAnimationListener方法可以给View动画添加过程监听,接口如下所示。

public static interface AnimationListener {void onAnimationStart(Animation animation);void onAnimationEnd(Animation animation);void onAnimationRepeat(Animation animation);
}
// 主要通过setAnimationListener()设置
Animation.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {// 动画开始时回调}@Overridepublic void onAnimationEnd(Animation animation) {// 动画结束时回调}@Overridepublic void onAnimationRepeat(Animation animation) {//动画重复执行的时候回调}
});

2.2 补间动画的特殊使用场景

Activity切换

Activity的动画切换效果存在两种方式:使用系统预设和自定义切换动画效果。

系统已经封装好的动画效果
淡入淡出:android.R.anim.fade_in、android.R.anim.fade_out
由左向右滑入:android.R.anim.slide_in_left、android.R.anim.slide_out_right

在这里插入图片描述

  • 当Activity在X轴 = -100%p时,刚好完全超出屏幕到左边(位置1)
  • 当Activity在X轴 = 0%p时,刚好完全在屏幕内(位置2)
  • 当Activity在X轴 = 100%p时,刚好完全超出屏幕到右边(位置3)

核心方法:overridePendingTransition(int enterAnim, int exitAnim)
调用时机:onCreate()finish()
参数
对于在onCreate()设置:
enterAnim:进入该Activity时的动画效果资源ID
exitAnim:进入该Activity时上一个Activity离开时的动画效果资源ID

 对于在`finish()`设置:`enterAnim`:进入其他Activity时 进入Activity的动画效果资源ID
`exitAnim`:进入其他Activity时 该Activity离开时的动画效果资源ID
// 具体使用
// 方式1:在onCreate()设置
@Override
public void onCreate(Bundle savedInstanceState) {overridePendingTransition(R.anim.fade_in, R.anim.fade_out);super.onCreate(savedInstanceState);
}// 方式2:在finish()设置
@Override
public void finish() {super.finish();overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
}

需要特别注意的是:如果进入退出页面:一个需要动画、另外一个不需要动画,但也必须设置时间相同的、没有任何变化的动画,否则会出现黑屏。

Fragment切换

Fragment切换也有使用系统预设和自定义切换动画效果两种方式。

系统预设动画效果需要通过FragmentTransaction.setTransition(int transit)进行设置
transit参数有三种

  1. FragmentTransaction.TRANSIT_NONE:无动画
  2. FragmentTransaction.TRANSIT_FRAGMENT_OPEN:标准的打开动画效果
  3. FragmentTransaction.TRANSIT_FRAGMENT_CLOSE:标准的关闭动画效果
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)

自定义动画效果需要通过FragmentTransaction.setCustomAnimations()设置,自定义动画效果同Activity

FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.in_from_right,R.anim.out_to_left);

视图组(ViewGroup)中子元素的出场效果(LayoutAnimation)

LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会具有这种动画效果。

(1)为子元素指定具体的入场动画

    // res/anim/anim_item.xml<? xml version="1.0" encoding="utf-8"? ><set xmlns:android="http://schemas.android.com/apk/res/android"android:duration="300"android:interpolator="@android:anim/accelerate_interpolator"android:shareInterpolator="true" ><alphaandroid:fromAlpha="0.0"android:toAlpha="1.0" /><translateandroid:fromXDelta="500"android:toXDelta="0" /></set>

(2)定义LayoutAnimation

// res/anim/anim_layout.xml<?xml version="1.0" encoding="utf-8"?>// 采用LayoutAnimation标签
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"android:delay="0.5"android:animationOrder="normal"android:animation="@anim/view_animation"// 设置入场的具体动画效果// 将步骤1的子元素出场动画设置到这里/>
  • android:delay表示子元素开始动画的时间延迟,比如子元素入场动画的时间周期为300ms,那么0.5表示每个子元素都需要延迟150ms才能播放入场动画。总体来说,第一个子元素延迟150ms开始播放入场动画,第2个子元素延迟300ms开始播放入场动画,依次类推。
  • android:animationOrder表示子元素动画的顺序,有三种选项:normal、reverserandom,其中normal表示顺序显示,即排在前面的子元素先开始播放入场动画;reverse表示逆向显示,即排在后面的子元素先开始播放入场动画;random则是随机播放入场动画。
  • android:animation为子元素指定具体的入场动画。

(3)为ViewGroup指定android:layoutAnimation属性:android:layoutAnimation= “@anim/anim_layout”。对于ListView来说,这样ListView的item就具有出场动画了,这种方式适用于所有的ViewGroup,如下所示。

方式1:xml中给ViewGroup设置android:layoutAnimation="@anim/anim_layout"属性

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#FFFFFF"android:orientation="vertical" ><ListViewandroid:id="@+id/listView1"android:layoutAnimation="@anim/anim_layout"// 指定layoutAnimation属性用以指定子元素的入场动画android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout>

方式2:在Java代码中

// 加载子元素的出场动画
Animation animation = AnimationUtils.loadAnimation(this,R.anim.anim_item);// 设置LayoutAnimation的属性
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);// 为ListView设置LayoutAnimation的属性
ListView.setLayoutAnimation(controller);

其他动画代码中的使用

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

2.3 属性动画

可以看这一篇博客
https://blog.csdn.net/qq_53749266/article/details/123602913?spm=1001.2014.3001.5502

三、帧动画

在这里插入图片描述

帧动画是顺序播放一组预先定义好的图片,类似于电影播放。不同于View动画,系统提供了另外一个类AnimationDrawable来使用帧动画。

使用方式

res/drawable目录下创建xml文件

方式一:xml启动动画

<?xml version="1.0" encoding="utf-8"?><animation-listxmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="true" // 设置是否只播放一次,默认为false><item android:drawable="@drawable/img0" android:duration="100"/><item android:drawable="@drawable/img1" android:duration="100"/><item android:drawable="@drawable/img2" android:duration="100"/><item android:drawable="@drawable/img3" android:duration="100"/></animation-list>将上述的Drawable作为View的背景并通过Drawable来播放动画即可:
启动
// 1. 设置动画
xxxview.setImageResource(R.drawable.xxxfilename);
// 2. 获取动画对象
animationDrawable = (AnimationDrawable) xxxview.getDrawable();
// 3. 启动动画
animationDrawable.start();停止
// 1. 设置动画
xxxview.setImageResource(R.drawable.xxxfilename);
// 2. 获取动画对象
animationDrawable = (AnimationDrawable) xxxview.getDrawable();
// 3. 暂停动画
animationDrawable.stop();

方式二:java

// 方式2:
// 直接从drawable文件夹获取动画资源(图片)
animationDrawable = new AnimationDrawable();
for (int i = 0; i <= 25; i++) {//第一个参数:资源名称,第二个参数:资源类型,如drawable,第三个参数:包名int id = getResources().getIdentifier("a" + i, "drawable", getPackageName());Drawable drawable = getResources().getDrawable(id);animationDrawable.addFrame(drawable, 100);
}启动
// 1. 获取资源对象
xxxview.setImageDrawable(animationDrawable);
// 2. 停止动画
// 特别注意:在动画start()之前要先stop(),不然在第一次动画之后会停在最后一帧,这样动画就只会触发一次
animationDrawable.stop();
// 3. 启动动画
animationDrawable.start();停止
// 1. 获取资源对象
xxxview.setImageDrawable(animationDrawable);
// 2. 停止动画
animationDrawable.stop();

参考资料

https://carsonho.blog.csdn.net/article/details/79860980

Android开发艺术探索


http://chatgpt.dhexx.cn/article/8W3MiCA8.shtml

相关文章

Android动画分类与总结

前言 动画的使用 是 Android 开发中常用的知识可是动画的种类繁多、使用复杂&#xff0c;每当需要 采用自定义动画 实现 复杂的动画效果时&#xff0c;很多开发者就显得束手无策本文将献上一份Android动画的全面介绍攻略&#xff0c;包括动画的种类、使用、原理等&#xff0c;…

Android动画分析(ValueAnimator)

动画创建 先看入口函数&#xff1a; 参数很熟悉了&#xff0c;具体看里面做了什么&#xff0c;其实也很简单&#xff0c;创建一个实例对象&#xff0c;并将参数设置到对象中。 第一个参数暂时先不看&#xff0c;看第二个参数&#xff0c;**anim.setObjectValues(values)**重…

好看的android动画效果

这段时间看到一些比较好看的android动画效果&#xff0c;下面我就给大家一些我比较喜欢的动画效果&#xff0c;并附上源码希望对你们有用处。 1.很简单却很酷的粒子破碎效果 介绍&#xff1a; 实现思路 1.新建一个 Bean Particle&#xff0c;表示一个粒子对象&#xff1b;新…

Android 动画系列二之补间动画

1. 前言 Android三种动画中的第二种——补间动画(Tween)&#xff0c;和帧动画不同&#xff0c;帧动画 是通过连续播放图片来模拟动画效果&#xff0c;而补间动画开发者只需指定动画开始&#xff0c;以及动画结束"关键帧"&#xff0c; 而动画变化的"中间帧"…

Android动画大合集

android中的动画实现方式繁多&#xff0c;在项目中也经常用到动画&#xff0c;网上有很多人也都进行了一些总结&#xff0c;但是感觉还是零零散散&#xff0c;自己总结一下才能加深印象&#xff0c;以后有时间了&#xff0c;也可以从各个分类里进一步去补充完善。 如果喜欢看G…

Android中动画详细讲解

一、前言 Android动画经常会在切换activity、数据加载时会用到动画效果&#xff0c;以前接触的比较少&#xff0c;用的都是封装好的动画效果&#xff0c;自己写的比较少&#xff0c;今天心血来潮想写一个自己设计的动画效果&#xff0c;发现学习动画代码比较简单&#xff0c;但…

android 动画中插值器Interpolator详解

1、插值器简介–Interpolator 通俗易懂的说&#xff0c;Interpolator负责控制动画变化的速率&#xff0c;即确定了 动画效果变化的模式&#xff0c;使得基本的动画效果能够以匀速、加速、减速、抛物线速率等各种速率变化 动画是开发者给定开始和结束的“关键帧”&#xff0c;…

Android中的属性动画

1.属性动画简介 接下来我们学习Android动画中的第三种动画——属性动画(Property Animation) Animation一般动画就是我们前面学的帧动画和补间动画&#xff01;Animator则是本节要讲的属性动画&#xff01; 1.1为什么要用属性动画 补间动画功能比较单调,只有四种动画(透明度…

android 动画库

1. Spruce(安卓动画库)&#xff08;是一个轻量级的动画库&#xff0c;可以帮助排版屏幕上的动画。使用有很多不同的动画库时&#xff0c;开发人员需要确保每个视图都能够在适当的时间活动。&#xff09; 2. Litho&#xff08;是一个非常强大的框架&#xff0c;以声明的方式构建…

android动画类型有哪几种,Android动画概念大揭秘

前言 说起Android里面的动画,我可能会立马想起平移、旋转、渐变、缩放等动画效果,但是对于他们的属性就记的不太清了,知道的都是皮毛而且很容易忘记,每次需要用到的时候总要去baidu或者google,完全无法做到灵活应用,信手拈来。所以抽时间重新温故了一下动画相关的知识,把…

Android 动画分类

前言 动画的使用 是 Android 开发中常用的知识可是动画的种类繁多、使用复杂&#xff0c;每当需要 采用自定义动画 实现 复杂的动画效果时&#xff0c;很多开发者就显得束手无策本文将献上一份Android动画的全面介绍攻略&#xff0c;包括动画的种类、使用、原理等&#xff0c;能…

Android动画

这篇博客主要总结一下自己在项目中对动画的一些使用。我写博客&#xff0c;其实更多的是总结自己在工作中用到的一些知识。比如某一段时间一个知识点相关的技术用的比较多&#xff0c;那我会总结一下。其实&#xff0c;对于Android动画的总结&#xff0c;这是几个月前就应该写完…

Android动画之帧动画

在Android开发时&#xff0c;为了实现一些动态的炫酷的效果&#xff0c;我们常用到帧动画&#xff0c;View动画&#xff08;补间动画&#xff09;和属性动画&#xff0c;今天就来总结下我在使用帧动画的实现方式。 1、什么是帧动画&#xff1f; 帧动画就是顺序播放一组预先定…

【Android】动画

概念 动画实际上就是在指定的时间段内持续的修改某个属性的值&#xff0c;使得该值在指定取值范围之内平滑的过渡 android中的动画分为&#xff1a;View动画、帧动画和属性动画 帧动画 Frame动画是一系列图片按照一定的顺序展示的过程&#xff0c;它的原理是在一定的时间段内切…

STM32 LWIP SNTP实现毫秒级的时间校准

1、首先配置LWIP支持SNTP 然后在opt.h中增加一个timeout->LWIP_SNTP 防止出现类似 Assertion "sys_timeout: timeout ! NULL, pool MEMP_SYS_TIMEOUT is empty" failed at line 190 in ../Middlewares/Third_Party/LwIP/src/core/timeouts.c 这样的错误。 /*…

NTP/SNTP协议介绍和校时服务器搭建

文|Seraph 本文主要简单介绍用于校时的NTP/SNTP协议 同时&#xff0c;以windows 2008 R2为例&#xff0c;搭建NTP/SNTP服务器 NTP可参考文献RFC1305&#xff0c;SNTP可参考文献RFC1796 1. 应用场景 一般应用&#xff0c;连上公网即可通过NTP/SNTP协议进行校时&#xff0c;例如…

linux sntp 代码,C语言window(linux)平台的SNTP实现

C语言实现window(linux)平台的SNTP&#xff0c;本程序功能主要是实现电脑(或者设备)时间同步。摘录部分代码&#xff1a; unsigned char liVnMode; /* LeapSecond(2bits:0), VersionNumber(3bits: 3), Mode(3bits: Client3, Server4) */ unsigned char stratum; /* 时间层级 (0…

学习日记——ESP8266SNTP

SNTP基本知识 1、定义 SNTP是简单网络时间协议&#xff0c;而NTP网络时间协议就是网络计算机上同步计算时间的协议&#xff0c;具有高度的精确性&#xff0c;实际上也用不到这么高精度的算法。所以就在NTP上简化了以下变成SNTP&#xff0c;SNTP协议主要被用来同步因特网上计算…

WiFi开发|ESP8266模组SDK开发之SNTP协议

ESP8266模组SDK开发之SNTP协议 1. NTP和SNTP NTP 是网络时间协议&#xff08;Network Time Protocol&#xff09;&#xff0c;是用来同步网络设备&#xff08;如计算机、手机&#xff09;的时间的协议 SNTP由NTP改编而来&#xff08;简单网络时间协议&#xff0c;Simple Net…

ESP8266学习笔记(11)——SNTP接口使用

一、SNTP简介 简单网络时间协议&#xff08;Simple Network Time Protocol&#xff09;&#xff0c;由 NTP 改编而来&#xff0c;主要用来同步因特网中的计算机时钟 二、SNTP接口 SNTP 接口位于 ESP8266_NONOS_SDK/include/sntp.h。 三、初始化SNTP 设置三个时间服务器…