当前位置:首页>鸿蒙APP>鸿蒙动态渐变背景实战:从属性动画到关键帧动画,打造酷炫视觉效果

鸿蒙动态渐变背景实战:从属性动画到关键帧动画,打造酷炫视觉效果

  • 2026-03-28 18:39:42
鸿蒙动态渐变背景实战:从属性动画到关键帧动画,打造酷炫视觉效果

前言

在鸿蒙应用开发中,视觉体验是提升用户满意度的重要一环。渐变背景因其丰富的色彩层次和现代感,被广泛应用于各种UI设计中。然而,静态的渐变背景虽然美观,却少了一丝灵动与生命力。

想象一下,当用户打开你的应用时,背景色缓缓流动、旋转或变换,仿佛拥有了呼吸感 —— 这种动态效果无疑会让应用更具吸引力。

最近我在开发鸿蒙应用时,就尝试为页面实现了这样一个动态渐变背景。从最基础的属性动画方案,到更强大的关键帧动画方案,我经历了不少踩坑与优化。

本文将完整分享我的实现思路,通过详细的代码示例和原理剖析,带你一步步打造出令人眼前一亮的动态视觉效果。

本文假设你已经对鸿蒙应用开发有基本了解。关于静态渐变的实现,官方文档已有详尽说明,本文不再赘述,建议参考:官方文档-渐变样式。所有示例均以线性渐变(LinearGradient)为例,变量命名力求直观,便于理解和复用。

方案一:属性动画 —— 简单渐变的首选

如果你的动态渐变需求相对简单,例如只需要在几种预设的颜色组合之间平滑切换,那么使用鸿蒙提供的属性动画.animation)是最直接、高效的方式。

这种方案代码量少、实现简单,非常适合初学者快速上手。

1. 原理简介

属性动画的核心思想是:当组件的某个可动画属性(如位置、大小、颜色等)发生变化时,系统会自动在起始值和结束值之间进行插值,生成平滑的过渡效果。

对于渐变背景,我们可以将渐变配置(LinearGradientOptions)视为一个整体属性,通过修改它的颜色数组来触发动画。

需要注意的是,属性动画对渐变角度angle)的变化支持不完美,我们将在后面讨论这一点。

2. 完整实现步骤

下面是一个完整的示例,展示如何在两种颜色组合之间循环切换。

2.1 定义状态变量

首先,我们需要使用 @State 装饰器定义两个变量:一个用于存储当前的渐变配置,另一个作为标志位来控制颜色切换的循环。

@State gradientOptionsLinearGradientOptions = {  angle45,  colors: [    ["#f09819"0],   // 起始颜色及位置(0%)    ["#edde5d"1]    // 结束颜色及位置(100%)  ]};@State flagnumber = 1// 用于标记当前是哪种渐变组合(1或0)
  • gradientOptions:渐变的具体配置,包括角度和颜色数组。颜色数组的每个元素是一个数组,格式为 [color, stop],其中 stop 取值范围 [0, 1]

  • flag:一个简单的标志位,用于指示当前使用的是第几种颜色组合。当动画完成时,我们根据 flag 的值切换到另一种组合。

2.2 在 onDidBuild 回调中启动动画

组件构建完成后,我们需要立即触发第一次动画。通过修改 gradientOptions 的值,系统会自动为渐变属性添加动画效果。

onDidBuild(): void {  // 启动第一次渐变切换  this.gradientOptions = {    angle45,    colors: [      ["#ffee113e"0],      ["#ff1a3864"1]    ]  };}

这里我们将初始的橙黄色渐变切换为紫红色渐变,动画将在 .animation() 修饰器的作用下平滑过渡。

2.3 为组件应用渐变并绑定动画

在目标组件(如 Column)上设置渐变背景,并添加 .animation() 修饰器。在动画的 onFinish 回调中,我们根据 flag 的值循环切换渐变配置,从而实现无限循环的效果。

Column()  .width(200)  .height(200)  .linearGradient(this.gradientOptions) // 绑定渐变  .animation({    duration: 2000,                     // 动画时长2秒    curve: Curve.EaseInOut,             // 缓动曲线    onFinish: () => {      // 动画完成后,切换到另一组渐变配置      if (this.flag === 1) {        this.flag = 0;        this.gradientOptions = {          angle: 45,          colors: [            ["#edde5d"0],            ["#f09819"1]          ]        };      } else {        this.flag = 1;        this.gradientOptions = {          angle: 45,          colors: [            ["#ffee113e"0],            ["#ff1a3864"1]          ]        };      }    }  })
  • duration:动画持续时间,单位毫秒。

  • curve:动画的缓动曲线,这里使用了 Curve.EaseInOut,让动画开始和结束较为平缓。

  • onFinish:动画完成时的回调。我们在其中修改 gradientOptions,触发下一次动画,形成循环。

3. 效果展示

上述代码实现了一个在 45 度角方向上,橙黄色与紫红色之间平滑过渡的动画效果。每次切换耗时 2 秒,完成后自动反向切换,无限循环。动态效果如图所示:

4. 方案总结与局限性

属性动画方案的优势在于简单直接,代码量少,对于只需要颜色切换的场景非常适用。但是,它存在一个明显的局限性:对渐变方向(角度)变化的支持不佳

如果你尝试在动画中同时改变 angle 属性,比如:

this.gradientOptions = {  angle: 90,        // 将角度从45度改为90度  colors: [/* 新颜色 */]};

你会发现渐变的变化会变得生硬、不连贯,甚至出现跳变。这是因为鸿蒙的属性动画在处理复合对象(如 LinearGradientOptions)时,可能无法对内部的每个属性进行平滑插值,尤其是角度这种非线性的属性。

因此,如果你的需求涉及到渐变方向、颜色数量或颜色位置的动态变化,属性动画就显得力不从心了。这时,我们需要更强大的方案——关键帧动画。

方案二:关键帧动画——实现复杂、自由的动态渐变

为了实现更复杂、更自由的动态渐变效果,比如让渐变在屏幕上“流动”或“旋转”,关键帧动画keyframeAnimateTo)是更优解。

其核心思想是:创建一个尺寸远大于父容器(例如宽高为父容器的 500%)的渐变背景层,然后通过关键帧控制这个背景层的位置(position),从而在父容器的“视窗”内呈现出动态变化的视觉效果。

1. 原理详解

这个方案可以形象地比喻为“在窗口后移动一张巨大的画布”:

  • 外层容器:固定大小,并设置 clip(true) 属性,充当“窗口”的角色。只有窗口范围内的部分会被显示,超出部分被裁剪。

  • 内层渐变层:尺寸远大于外层(例如宽高为 500%),应用复杂的多色渐变,充当“巨大画布”。

  • 位置动画:通过关键帧动画,控制内层画布相对于外层容器的位置(position)。随着画布移动,透过窗口看到的渐变区域不断变化,从而产生流动、旋转等视觉效果。

    这种方式的优点在于:

    • 性能优异:只需要移动一张已经绘制好的“画布”,避免了频繁重新计算和绘制渐变,性能开销较小。
    • 极高的自由度:可以轻松实现颜色、方向、移动路径的任意组合变化,甚至可以实现复杂的路径运动。
    • 视觉效果惊艳:可以实现如流动、旋转、闪烁等复杂的动态效果。

    2. 完整实现步骤

    下面是一个完整的实现示例,展示如何通过关键帧动画实现一个不断流动的渐变背景。

    2.1 定义位置状态变量

    我们需要一个状态变量来控制渐变背景层的位置。位置可以是百分比或像素值,这里我们使用百分比,以便于在不同尺寸的设备上保持一致。

    @State pos: Position = { x"0%", y: "0%" };
    • Position:鸿蒙提供的类型,包含 x 和 y 属性,用于描述组件的偏移量。

    • 初始位置为 (0%, 0%),即渐变层的左上角与外层容器的左上角对齐。
    2.2 构建UI结构

    外层容器(固定大小)设置 clip(true) 属性,用于裁剪超出边界的部分。内层 Column(渐变背景层)的尺寸远大于外层,并应用复杂的多色渐变。

    Column() { // 外层容器  Column() // 渐变背景层    .position(this.pos) // 绑定位置状态    .width("500%")      // 宽高设置为外层的5倍    .height("500%")    .linearGradient({      angle60,      colors: [        ["#ffed5d8b"0],        ["#ffb7f019"0.2],        ["#ffae8215"0.4],        ["#ff354bb8"0.6],        ["#ffd3ed5d"0.8],        ["#ff590f86"1],      ]    })}.width(200).height(200).clip(true// 关键:裁剪超出部分,形成“窗口”效果
    • 外层容器:固定宽高 200,背景默认透明。clip(true) 确保内层超出部分不可见。

    • 内层渐变层:宽高均为外层的 5 倍(即 1000×1000)。渐变角度 60 度,颜色从粉色到紫色,包含 6 个颜色节点,色彩丰富。

    • 位置绑定position(this.pos) 使渐变层的位置跟随 pos 状态变化。

    2.3 定义关键帧动画

    使用 uiContext.keyframeAnimateTo 创建一个循环播放的关键帧动画。通过在不同时间点设置不同的 pos 值,驱动背景层在父容器内移动。

    private uiContext?: UIContext;aboutToAppear() {  this.uiContext = this.getUIContext(); // 获取UIContext实例}ani(): void {  this.uiContext?.keyframeAnimateTo(    { iterations: -1 }, // 无限循环    [      // 关键帧定义,每个对象代表一个动画片段      { duration: 1, event: () => { this.pos = { x: "0%", y: "-400%" } } },      { duration: 3000, event: () => { this.pos = { x: "0%", y: "0%" } } },      { duration: 3000, event: () => { this.pos = { x: "-400%", y: "0%" } } },      { duration: 3000, event: () => { this.pos = { x: "-400%", y: "-400%" } } },      { duration: 3000, event: () => { this.pos = { x: "0%", y: "-400%" } } },      { duration: 4242, event: () => { this.pos = { x: "-400%", y: "0%" } } },      { duration: 3000, event: () => { this.pos = { x: "0%", y: "0%" } } },      { duration: 4242, event: () => { this.pos = { x: "-400%", y: "-400%" } } },      { duration: 3000, event: () => { this.pos = { x: "0%", y: "-400%" } } },    ]  );}
    • keyframeAnimateTo:鸿蒙关键帧动画API,第一个参数是动画配置,第二个参数是关键帧数组。

    • iterations: -1 表示无限循环。

    • 关键帧数组:每个元素包含 duration(该片段持续时间)和 event(在该时间段内执行的属性变化)。系统会自动在这些变化之间进行插值,形成平滑过渡。

    • 位置计算:因为渐变层尺寸是外层的500%,所以位置变化范围通常在 -400% 到 0% 之间。-400% 意味着将渐变层向右(或向下)移动自身宽度的4倍,从而使窗口看到不同的区域。

    关键帧路径示意:上面的动画定义了一个复杂的移动路径,背景层会在四个角落之间来回移动。你可以把它想象成一个巨大的、带有华丽渐变的幕布,在一个固定大小的窗口后面移动,从而创造出丰富、流畅且无重复感的动态背景效果。

    2.4 启动动画

    在组件构建完成后(onDidBuild)调用 ani() 方法,动画便会自动开始。

    onDidBuild(): void {  this.ani();}

    3. 效果展示

    通过上述代码,我们实现了一个色彩丰富、路径复杂的动态渐变背景。渐变在屏幕上流动、旋转,仿佛有生命一般。效果如图所示:

    4. 方案优势与注意事项

    优势

    • 性能优异:只移动一个图层,GPU 友好,相比频繁重绘渐变效率更高。
    • 无限可能:通过调整关键帧路径、渐变颜色、图层尺寸,可以实现各种梦幻效果。
    • 平滑流畅:关键帧动画的插值机制保证了移动的平滑性。

    注意事项

    • 内存占用:渐变层尺寸较大,但因为是矢量渐变,内存占用可控。如果使用位图背景则需注意。
    • 边界处理:确保关键帧的位置范围在图层尺寸允许的范围内,避免出现窗口外的区域无法覆盖的情况。
    • 响应式设计:如果父容器尺寸变化,可能需要重新计算位置范围。可以使用 @Watch 监听尺寸变化,动态调整动画参数。

    性能优化与进阶技巧

    在实际应用中,我们还可以对上述方案进行一些优化,以达到更好的性能和视觉效果。

    1. 使用 @Watch 监听尺寸变化

    如果外层容器的尺寸可能发生变化(如屏幕旋转、窗口大小改变),我们需要动态调整内层渐变层的尺寸和位置范围,以确保效果始终正确。

    @State containerWidthnumber = 200;@State containerHeightnumber = 200;@Watch('onContainerSizeChange')@State posPosition = { x"0%"y"0%" };onContainerSizeChange() {  // 当容器尺寸变化时,重新计算内层尺寸和动画参数  // 这里可以重启动画}

    2. 利用 @Builder 封装动态背景组件

    将动态渐变背景封装成一个独立的组件,方便复用:

    @Componentstruct DynamicGradientBackground {  @Prop widthnumber;  @Prop heightnumber;  @State posPosition = { x"0%"y"0%" };  private uiContext?: UIContext;  aboutToAppear() {    this.uiContext = this.getUIContext();    this.startAnimation();  }  startAnimation() {    // 关键帧动画代码  }  build() {    Column() {      Column()        .position(this.pos)        .width("500%")        .height("500%")        .linearGradient({          angle60,          colors: [/* 自定义渐变 */]        })    }    .width(this.width)    .height(this.height)    .clip(true)  }}

    使用时只需:

    DynamicGradientBackground({ width: 300, height: 300 })

    3. 控制动画运行状态

    通过状态变量控制动画的开始、暂停和停止,可以提升用户体验。例如,当页面不可见时暂停动画,节省资源。

    @State isAnimatingboolean = true;startAnimation() {  if (!this.isAnimatingreturn;  // 启动关键帧动画}onPageHide() {  this.isAnimating = false;  // 停止动画(需要额外实现停止逻辑)}onPageShow() {  this.isAnimating = true;  this.startAnimation();}

    4. 动态调整渐变参数

    关键帧动画方案中,渐变颜色和角度是静态的。如果你需要动态改变渐变本身(如颜色随时间变化),可以结合属性动画,在移动背景的同时改变渐变的颜色配置。但要注意性能开销。

    两种方案对比与选型建议

    特性
    属性动画方案
    关键帧动画方案
    实现复杂度
    简单
    中等
    性能
    中等(频繁重绘渐变)
    高(仅移动图层)
    支持角度变化
    好(通过移动实现)
    支持复杂路径
    不支持
    支持
    支持无限循环
    通过回调实现
    内置支持
    适用场景
    简单的颜色切换
    复杂的流动、旋转效果

    选型建议

    • 如果只需要在几种颜色之间切换,且不涉及角度变化,优先选择属性动画方案,代码简洁。
    • 如果需要实现如彩虹流动、光影旋转等炫酷效果,或者需要动态改变渐变方向,请使用关键帧动画方案

    完整 Demo 代码

    为了方便你快速上手,这里提供一份完整的示例代码,包含上述两种方案,并封装了组件,可直接运行。

    import { UIContext } from '@ohos.arkui.UIContext';@Entry@Componentstruct DynamicGradientDemo {  @State currentScheme: number = 0// 0: 属性动画, 1: 关键帧动画  build() {    Column() {      // 方案选择按钮      Row() {        Button("属性动画方案")          .onClick(() => this.currentScheme = 0)          .margin(10)        Button("关键帧动画方案")          .onClick(() => this.currentScheme = 1)          .margin(10)      }      .width("100%")      .height(50)      .justifyContent(FlexAlign.Center)      // 展示区域      if (this.currentScheme === 0) {        PropertyAnimationDemo()      } else {        KeyframeAnimationDemo()      }    }    .width("100%")    .height("100%")    .backgroundColor(Color.White)  }}// 方案一:属性动画@Componentstruct PropertyAnimationDemo {  @State gradientOptions: LinearGradientOptions = {    angle: 45,    colors: [["#f09819"0], ["#edde5d"1]]  };  @State flag: number = 1;  aboutToAppear() {    // 启动动画    setTimeout(() => {      this.gradientOptions = {        angle: 45,        colors: [["#ffee113e"0], ["#ff1a3864"1]]      };    }, 100);  }  build() {    Column()      .width(200)      .height(200)      .linearGradient(this.gradientOptions)      .animation({        duration: 2000,        curve: Curve.EaseInOut,        onFinish: () => {          if (this.flag === 1) {            this.flag = 0;            this.gradientOptions = {              angle: 45,              colors: [["#edde5d"0], ["#f09819"1]]            };          } else {            this.flag = 1;            this.gradientOptions = {              angle: 45,              colors: [["#ffee113e"0], ["#ff1a3864"1]]            };          }        }      })  }}// 方案二:关键帧动画@Componentstruct KeyframeAnimationDemo {  @State pos: Position = { x: "0%", y: "0%" };  private uiContext?: UIContext;  aboutToAppear() {    this.uiContext = this.getUIContext();    this.startAnimation();  }  startAnimation() {    this.uiContext?.keyframeAnimateTo(      { iterations: -1 },      [        { duration: 1, event: () => { this.pos = { x: "0%", y: "-400%" } } },        { duration: 3000, event: () => { this.pos = { x: "0%", y: "0%" } } },        { duration: 3000, event: () => { this.pos = { x: "-400%", y: "0%" } } },        { duration: 3000, event: () => { this.pos = { x: "-400%", y: "-400%" } } },        { duration: 3000, event: () => { this.pos = { x: "0%", y: "-400%" } } },        { duration: 4242, event: () => { this.pos = { x: "-400%", y: "0%" } } },        { duration: 3000, event: () => { this.pos = { x: "0%", y: "0%" } } },        { duration: 4242, event: () => { this.pos = { x: "-400%", y: "-400%" } } },        { duration: 3000, event: () => { this.pos = { x: "0%", y: "-400%" } } },      ]    );  }  build() {    Column() {      Column()        .position(this.pos)        .width("500%")        .height("500%")        .linearGradient({          angle: 60,          colors: [            ["#ffed5d8b"0],            ["#ffb7f019"0.2],            ["#ffae8215"0.4],            ["#ff354bb8"0.6],            ["#ffd3ed5d"0.8],            ["#ff590f86"1],          ]        })    }    .width(200)    .height(200)    .clip(true)  }}

    总结

    本文从实际开发需求出发,详细介绍了鸿蒙应用中实现动态渐变背景的两种主流方案:

    1. 属性动画方案:适合简单的颜色切换,代码简洁,易于上手。
    2. 关键帧动画方案:通过移动巨大的渐变画布,实现复杂、流畅的动态效果,性能优异,自由度极高。

    通过两种方案的对比和完整代码示例,相信你已经掌握了在鸿蒙应用中打造动态渐变背景的核心技术。

    在实际开发中,你可以根据具体的视觉效果需求选择合适的方案,甚至可以结合两者,打造独一无二的视觉体验。

    最新文章

    随机文章

    基本 文件 流程 错误 SQL 调试
    1. 请求信息 : 2026-03-29 00:31:36 HTTP/2.0 GET : https://c.mffb.com.cn/a/479568.html
    2. 运行时间 : 0.139687s [ 吞吐率:7.16req/s ] 内存消耗:4,315.89kb 文件加载:140
    3. 缓存信息 : 0 reads,0 writes
    4. 会话信息 : SESSION_ID=218cfcd682c0ab396e64f8b53c698a50
    1. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/public/index.php ( 0.79 KB )
    2. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
    3. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
    4. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
    5. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
    6. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
    7. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
    8. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
    9. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
    10. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
    11. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
    12. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
    13. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
    14. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
    15. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
    16. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
    17. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
    18. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
    19. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
    20. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
    21. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
    22. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/provider.php ( 0.19 KB )
    23. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
    24. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
    25. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
    26. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/common.php ( 0.03 KB )
    27. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
    28. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
    29. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/app.php ( 0.95 KB )
    30. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/cache.php ( 0.78 KB )
    31. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/console.php ( 0.23 KB )
    32. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/cookie.php ( 0.56 KB )
    33. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/database.php ( 2.48 KB )
    34. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
    35. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/filesystem.php ( 0.61 KB )
    36. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/lang.php ( 0.91 KB )
    37. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/log.php ( 1.35 KB )
    38. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/middleware.php ( 0.19 KB )
    39. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/route.php ( 1.89 KB )
    40. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/session.php ( 0.57 KB )
    41. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/trace.php ( 0.34 KB )
    42. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/view.php ( 0.82 KB )
    43. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/event.php ( 0.25 KB )
    44. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
    45. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/service.php ( 0.13 KB )
    46. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/AppService.php ( 0.26 KB )
    47. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
    48. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
    49. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
    50. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
    51. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
    52. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/services.php ( 0.14 KB )
    53. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
    54. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
    55. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
    56. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
    57. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
    58. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
    59. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
    60. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
    61. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
    62. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
    63. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
    64. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
    65. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
    66. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
    67. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
    68. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
    69. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
    70. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
    71. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
    72. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
    73. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
    74. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
    75. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
    76. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
    77. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
    78. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
    79. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
    80. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
    81. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
    82. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
    83. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/Request.php ( 0.09 KB )
    84. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
    85. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/middleware.php ( 0.25 KB )
    86. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
    87. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
    88. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
    89. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
    90. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
    91. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
    92. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
    93. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
    94. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
    95. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
    96. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
    97. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
    98. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
    99. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/route/app.php ( 1.72 KB )
    100. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
    101. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
    102. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
    103. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
    104. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/BaseController.php ( 2.05 KB )
    105. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
    106. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
    107. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
    108. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
    109. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
    110. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
    111. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
    112. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
    113. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
    114. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
    115. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
    116. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
    117. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
    118. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
    119. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
    120. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
    121. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
    122. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
    123. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
    124. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
    125. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
    126. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
    127. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
    128. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
    129. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
    130. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
    131. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
    132. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
    133. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
    134. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
    135. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
    136. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
    137. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
    138. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
    139. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/runtime/temp/cefbf809ba1a84190cb04b0cb7abcf79.php ( 11.98 KB )
    140. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
    1. CONNECT:[ UseTime:0.000867s ] mysql:host=127.0.0.1;port=3306;dbname=c_mffb;charset=utf8mb4
    2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001367s ]
    3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000474s ]
    4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000453s ]
    5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001020s ]
    6. SELECT * FROM `set` [ RunTime:0.000349s ]
    7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001107s ]
    8. SELECT * FROM `article` WHERE `id` = 479568 LIMIT 1 [ RunTime:0.000877s ]
    9. UPDATE `article` SET `lasttime` = 1774715496 WHERE `id` = 479568 [ RunTime:0.001180s ]
    10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000469s ]
    11. SELECT * FROM `article` WHERE `id` < 479568 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000749s ]
    12. SELECT * FROM `article` WHERE `id` > 479568 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000778s ]
    13. SELECT * FROM `article` WHERE `id` < 479568 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001353s ]
    14. SELECT * FROM `article` WHERE `id` < 479568 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001890s ]
    15. SELECT * FROM `article` WHERE `id` < 479568 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002239s ]
    0.144575s