基于HarmonyOS 5.0 (Next)的一种面向多设备跨平台的高性能自适应布局能力研究和实现

news/2024/12/22 15:06:51/文章来源:https://www.cnblogs.com/baoto/p/18622141

引言

随着万物互联时代的到来,操作系统作为连接设备、应用与用户体验的核心,其重要性日益凸显。华为最新发布的HarmonyOS 5.0(Next)作为一款完全自主的第三大手机操作系统,不仅实现了全栈自研,更在技术架构和生态体验上实现了颠覆性升级。HarmonyOS 5.0(Next)通过全新的技术框架和独特的ArkTS编程语言,构建了一个完全国产的手机操作系统生态,为开发者提供了丰富的开放能力和工具支持。

在这里插入图片描述

在智能设备生态系统日益复杂的背景下,用户对于跨设备、跨平台的无缝体验需求愈发强烈。HarmonyOS 5.0(Next)凭借其强大的分布式能力,重新定义了设备间的协同逻辑,实现了设备间的高效互联互通。这一特性为开发者提供了前所未有的机遇,可以创建出能够在多种华为终端设备上良好展示和交互的应用。

然而,要实现这种跨设备、跨平台的无缝体验,应用布局的自适应性成为了一个关键挑战。不同设备的屏幕尺寸、分辨率、交互方式各不相同,如何确保应用在各种设备上都能提供一致且优质的用户体验,是开发者需要解决的重要问题。

在这里插入图片描述

本文旨在研究和实现基于HarmonyOS 5.0(Next)的一种面向多设备跨平台的高性能自适应布局能力。通过深入分析HarmonyOS 5.0(Next)的技术特点和生态优势,结合具体的开发实践,本文将探讨如何利用自适应布局和响应式布局技术,实现应用在鸿蒙生态中的各种设备上无需大幅修改即可正常运行和展示。这不仅将提高开发效率,减少维护成本,还将为用户带来更加流畅和一致的使用体验。

本文的研究和实现将基于HarmonyOS 5.0(Next)的分布式能力、统一开发语言ArkTS以及全新的技术框架,通过具体的案例和代码实现,展示如何在多设备跨平台环境下实现高性能的自适应布局。希望本文的研究成果能够为开发者提供有益的参考和启示,推动鸿蒙生态的进一步发展和壮大。

背景与需求

说明
业界UI框架提供了基础的组件、布局、事件、动效等能力,但都缺乏高级的布局容器(比如下图中的瀑布流组件等),另外,随着设备的种类越来越多,屏幕尺寸多样化,如何做到多设备自适应以及高性能体验一直是应用开发的关键诉求及难点;本课题通过基于ArkUI相关能力设计并实现适合多设备跨平台的高级可自定义布局组件(比如类似瀑布流组件);
本课题包括如下内容:
1、基于自定义布局能力实现适合多设备和跨平台的高级可自定义组件(比如下图中的瀑布流ArkTS组件)
加分项:2、提供ArkUI的GeometryReader测量组件尺寸能力,且基于该能力实现高级自定义组件
(2)要求
1)该高级组件能自动适应不同屏幕设备做到行数自适应
2)该高级组件支持item增、删及相应的补位动效
3)该高级组件支持scrollToIndex的快速跳转及动效,不丢帧
4)快速滑动不丢帧,60FPS
5) ArkUI上提供GeometryReader测量组件尺寸能力(加分项)
6)使用GeometryReader实现高级自定义组件(比如类似瀑布流组件)(加分项)
概念注释:1、多设备:手机、平板、PC等 2、跨平台:ArkUI-X

@

目录
  • 引言
    • 背景与需求
      • 瀑布流组件的设计目标
    • 关键技术代码实现
      • 1. ArkUI布局机制
      • 2.组件渲染
      • 3. 高性能优化
      • 4. 动态更新与快速跳转
      • 5. GeometryReader的使用(加分项)
    • 数据的处理
    • 组件的复用
    • 布局计算
    • 性能优化
    • 响应式布局
    • 总结

随着移动设备和桌面平台的快速发展,多设备跨平台的用户界面开发已成为开发者面临的重要挑战。特别是针对不同屏幕尺寸和分辨率的自适应布局,传统UI框架提供的布局方式往往显得力不从心。华为ArkUI,作为面向未来智能设备设计的高效开发工具,凭借其强大的自定义能力和跨平台特性,为开发者提供了无限可能。本文将探讨如何利用ArkUI实现一种高性能的自适应瀑布流组件,并详细介绍其设计与实现过程。

瀑布流组件的设计目标

瀑布流布局,以其独特的视觉呈现方式,在信息流展示、图片墙等场景中广泛应用。在设计ArkUI中的瀑布流组件时,我们设定了以下核心目标:

多设备自适应:组件需能够自动适应手机、平板、PC等多种设备的屏幕尺寸。
高性能:滑动流畅,不丢帧,达到60FPS的流畅度。
动态更新:支持动态添加、删除项,并能平滑过渡补位动效。
快速跳转:支持scrollToIndex快速跳转功能,带有流畅动效。

关键技术代码实现

1. ArkUI布局机制

ArkUI基于Flexbox和Grid布局模型,提供了丰富的布局容器和组件。但为了实现自定义的瀑布流布局,我们需要基于ArkUI的自定义组件能力,创建一个全新的布局组件。

  1. 自定义瀑布流组件
    组件结构设计
    瀑布流组件的核心在于动态计算每个项目的位置。我们可以通过一个瀑布流管理器(WaterfallManager)来管理所有子项的位置和尺寸。
// 瀑布流管理器伪代码  
class WaterfallManager {  private items: any[];  private columns: number;  private columnHeights: number[];  constructor(columns: number) {  this.columns = columns;  this.columnHeights = Array(columns).fill(0);  this.items = [];  }  addItem(item: any) {  // 分配位置  let minIndex = 0;  let minHeight = Number.MAX_SAFE_INTEGER;  for (let i = 0; i < this.columns; i++) {  if (this.columnHeights[i] < minHeight) {  minHeight = this.columnHeights[i];  minIndex = i;  }  }  // 计算并设置位置  // ...  this.items.push(item);  this.columnHeights[minIndex] += item.height;  }  // 其余方法:removeItem, refresh等  
}

在这里插入图片描述

2.组件渲染

瀑布流组件的渲染需要结合ArkUI的渲染机制和自定义布局逻辑。我们使用ArkTS(ArkUI的TypeScript声明式UI编程方式)来构建组件:

@Component  
struct WaterfallLayout {  private waterfallManager: WaterfallManager;  build() {  Column() {  this.waterfallManager.items.forEach((item, index) => {  // 根据waterfallManager中计算的位置渲染每个项  Position({  left: `${item.x}px`,  top: `${item.y}px`  }) {  // 渲染项目内容  // Image(), Text()等  }  });  }  }  // 初始化逻辑  onInit() {  this.waterfallManager = new WaterfallManager(3); // 假设有三列  // 填充数据并调用addItem  }  
}

3. 高性能优化

为了确保组件在滑动时保持60FPS的流畅度,我们需要对性能进行优化:

使用虚拟滚动:只渲染可视区域内的元素,减少DOM节点的数量。
减少重绘和重排:利用ArkUI的性能优化机制,如合并DOM操作。
合理利用ArkUI的缓存机制:对于频繁变更但不直接影响布局的组件,可以使用缓存技术减少渲染压力。

4. 动态更新与快速跳转

动态更新项目时,使用ArkUI的动画API来创建平滑的补位动效。对于scrollToIndex的快速跳转,同样利用动画API来实现平滑滚动效果。
在这里插入图片描述

5. GeometryReader的使用(加分项)

GeometryReader组件可以在布局过程中实时获取父容器的尺寸信息,这对于实现复杂的自适应布局非常有用。

在 ArkUI 中,GeometryReader 是一个强大的组件,它允许你在布局阶段访问父容器或特定组件的尺寸和位置信息。这对于实现更加复杂和自适应的布局非常有帮助,特别是在设计如瀑布流这样需要动态调整子项位置的组件时。

GeometryReader 示例
首先,我们需要明确 GeometryReader 的使用场景。在瀑布流组件中,我们可能不需要直接在 GeometryReader 内部实现瀑布流逻辑,因为瀑布流的核心是动态计算和分配子项位置,这通常在组件初始化或数据更新时完成。然而,GeometryReader 可以用于确保瀑布流组件能够正确响应其父容器尺寸的变化。

下面是一个简化的示例,展示了如何在 ArkUI 中使用 GeometryReader 来获取父容器的尺寸,并据此调整瀑布流组件的布局:

@Component  
struct WaterfallLayoutWithGeometryReader {  private waterfallManager: WaterfallManager;  // 假设 waterfallManager 已经根据初始数据进行了初始化  build() {  GeometryReader({  onSizeChange: (size: { width: number, height: number }) => {  // 当父容器尺寸变化时,重新计算瀑布流布局  // 注意:这里只是一个示例,实际中可能不需要在每次尺寸变化时都重新计算  // 除非有特定的布局需求(如响应式布局)  // 一般情况下,瀑布流布局的计算会在数据更新时进行  // 示例:调整列数以适应新的宽度  if (size.width > someThreshold) {  this.waterfallManager.setColumns(4); // 假设现在可以展示4列  } else {  this.waterfallManager.setColumns(3); // 默认3列  }  // 注意:这里的重新计算可能需要更复杂的逻辑,  // 并且可能需要重新渲染整个瀑布流组件或至少重新定位部分子项  }  }) {  Column({ scroll: true }) {  // 渲染瀑布流子项,使用 waterfallManager 计算的位置  // ...(与之前的示例类似)  }  }  }  // 初始化逻辑和其他方法保持不变  
}  // 注意:上面的代码是一个概念性示例,实际实现时可能需要根据具体情况进行调整  
// ArkUI 的 GeometryReader 可能不直接提供 onSizeChange 事件,这里是为了说明如何响应尺寸变化  
// 在实际开发中,你可能需要监听父容器的尺寸变化(如果可能的话),或者根据其他方式(如窗口大小变化事件)来触发瀑布流布局的重新计算

然而,需要注意的是,ArkUI 的 GeometryReader 可能并不直接提供 onSizeChange 这样的回调。在实际开发中,你可能需要利用 ArkUI 提供的其他机制来监听容器尺寸的变化,比如监听窗口大小变化事件(如果可用),或者在组件的 onResize 生命周期钩子中处理尺寸变化(如果 ArkUI 支持这样的钩子)。

另外,对于瀑布流组件来说,更常见的做法是在数据更新时重新计算子项的位置,而不是监听父容器的尺寸变化。因为瀑布流组件的布局通常是由其内部的数据驱动的,而不是由外部容器的尺寸驱动的。

我们可以继续深入讨论如何在ArkUI中实现一个瀑布流组件,特别是关注于数据的处理、组件的复用以及性能优化等方面。

数据的处理

瀑布流组件的核心在于如何高效地处理数据并映射到UI上。通常,数据会以一个列表的形式存在,每个条目包含了显示所需的所有信息(如图片URL、标题、描述等)。
数据排序:在某些情况下,你可能需要按照特定的顺序(如时间、热度等)来排序数据。这可以在数据获取之后立即进行,或者在组件的某个特定时刻(如刷新时)进行。
分页加载:如果数据量非常大,一次性加载所有数据可能会导致性能问题。因此,实现分页加载是一个常见的做法。你可以根据滚动位置来动态加载更多的数据。

组件的复用

在ArkUI中,为了提高性能,减少不必要的渲染,应该尽可能地复用组件。

列表项复用:瀑布流中的每个条目都可以视为一个列表项。你可以使用ArkUI提供的列表组件(如List),这些组件内部实现了项复用机制。当列表滚动时,只有进入或离开视窗的项会被重新渲染。
使用Key属性:在列表项中,为每个项指定一个唯一的key属性可以帮助ArkUI更有效地识别和管理组件的复用。

布局计算

瀑布流布局的关键在于计算每个项的位置和大小。这通常涉及到以下几个步骤:
确定列数:根据屏幕宽度或父容器的宽度来确定瀑布流应该有多少列。这可以通过简单的除法运算(宽度除以每个项的宽度)来实现,但也要考虑到边距等因素。
计算位置:遍历数据列表,为每个项计算其在瀑布流中的位置。这通常涉及到跟踪每列当前的高度,并将新项添加到高度最小的列中。
动态调整:当有新数据加载或屏幕尺寸变化时,需要重新计算布局。

性能优化

异步加载图片:瀑布流中通常会包含大量的图片,异步加载图片可以避免页面卡顿。
懒加载:只加载当前视窗内的图片或内容,当用户滚动到新的区域时再加载该区域的内容。
使用缓存:对于重复使用的数据或计算结果,使用缓存可以避免不必要的计算。
避免不必要的渲染:利用ArkUI的生命周期钩子和条件渲染(如if语句)来避免不必要的组件渲染。

响应式布局

为了使瀑布流组件能够适应不同的屏幕尺寸和方向,你需要实现响应式布局。
监听屏幕尺寸变化:在ArkUI中,你可能需要监听屏幕尺寸变化的事件,并在事件发生时重新计算布局。
使用百分比或Flex布局:在某些情况下,使用百分比或Flex布局可以使组件更容易适应不同的屏幕尺寸。然而,在瀑布流中,由于列的高度是不固定的,因此这种方法可能不太适用。
结论
实现一个高性能、自适应的瀑布流组件需要考虑多个方面,包括数据的处理、组件的复用、布局的计算以及性能的优化。通过结合ArkUI提供的工具和最佳实践,你可以创建一个既美观又高效的瀑布流组件,以满足你的应用需求。

请注意,由于ArkUI的具体实现细节可能会随着版本的更新而变化,因此建议查阅最新的官方文档和社区资源以获取最准确的信息。

在计算瀑布流中每个条目的位置和大小时,你需要跟踪每一列当前的最高位置,并根据条目的内容(如图片和文本)动态地确定其高度。以下是一个简化的步骤说明,用于计算瀑布流中每个条目的位置和大小:

  1. 定义数据结构
    首先,定义一个数据结构来存储瀑布流的状态,包括列的数量、每列的高度以及所有条目的信息。
interface Column {  height: number; // 当前列的高度  
}  interface Item {  key: string; // 条目的唯一标识  contentHeight: number; // 条目内容的高度(根据图片和文本计算得出)  // 其他需要的信息,如图片URL、标题等  
}  class WaterfallLayout {  private columns: Column[];  private items: Item[];  constructor(numColumns: number) {  this.columns = Array.from({ length: numColumns }, () => ({ height: 0 }));  this.items = [];  }  // 添加条目的方法(示例)  addItem(item: Item) {  // 这里只是简单地将条目添加到items数组中,实际计算位置会在其他地方进行  this.items.push(item);  // 注意:实际开发中,你可能会在这里就计算并设置条目的位置  }  // 计算所有条目的位置(通常会在数据更新或组件初始化时调用)  calculatePositions() {  // 假设所有条目都已经被添加到items数组中  let minColumnIndex = 0;  this.items.forEach(item => {  // 找到当前高度最小的列  minColumnIndex = this.columns.findIndex(column => column.height === Math.min(...this.columns.map(c => c.height)));  // 假设item.y是条目的垂直位置,item.x是水平位置(基于列索引)  // 这里我们简单地将x设置为列索引乘以条目宽度加上一些边距(如果有的话)  // 但实际上,在ArkUI中,你可能不需要手动设置x,而是由布局系统来管理  // item.x = minColumnIndex * itemWidth + margin; // 伪代码,不直接设置  // 设置条目的垂直位置为当前列的高度  // 在实际中,你可能需要更新UI组件的状态或属性来反映这一点  // 这里只是逻辑上的计算  let itemPosition = this.columns[minColumnIndex].height;  // 更新列的高度  this.columns[minColumnIndex].height += item.contentHeight;  // 假设有一个方法来更新UI组件的位置(伪代码)  // updateItemPositionInUI(item, { x: minColumnIndex * someValue, y: itemPosition });  });  }  
}
  1. 注意事项
    内容高度(contentHeight):这个值通常需要根据条目的实际内容来计算,比如图片加载完成后的高度加上文本的高度等。在ArkUI中,你可能需要在图片加载完成后更新这个值,并重新计算布局。
    布局更新:当有新条目添加、现有条目内容变化(如图片加载完成)或屏幕尺寸变化时,你需要重新计算布局。这可能需要触发组件的重新渲染或更新其内部状态。
    性能优化:在大量数据或频繁更新的情况下,重新计算整个瀑布流的布局可能会很昂贵。你可以通过只重新计算受影响的区域、使用虚拟滚动或延迟更新来优化性能。
    响应式布局:当屏幕尺寸变化时,你可能需要重新计算列数并重新布局所有条目。这可能需要监听窗口大小变化事件并在事件处理程序中执行相应的逻辑。
  2. 实际应用
    在ArkUI中,你可能需要将这些逻辑与UI组件的生命周期和事件处理相结合。例如,在组件的onReady或onAttached生命周期钩子中初始化瀑布流布局,在onResize或自定义的窗口大小变化监听器中重新计算布局,以及在数据更新时调用calculatePositions方法并更新UI。

请注意,上面的代码是一个简化的示例,用于说明瀑布流布局计算的基本原理。在实际应用中,你可能需要根据ArkUI的具体API和框架特性进行调整和扩展。

在这里插入图片描述

在计算瀑布流中每个条目的位置和大小时,你需要跟踪每一列当前的最高位置,并根据条目的内容(如图片和文本)动态地确定其高度。以下是一个简化的步骤说明,用于计算瀑布流中每个条目的位置和大小:

  1. 定义数据结构
    首先,定义一个数据结构来存储瀑布流的状态,包括列的数量、每列的高度以及所有条目的信息。
interface Column {  height: number; // 当前列的高度  
}  interface Item {  key: string; // 条目的唯一标识  contentHeight: number; // 条目内容的高度(根据图片和文本计算得出)  // 其他需要的信息,如图片URL、标题等  
}  class WaterfallLayout {  private columns: Column[];  private items: Item[];  constructor(numColumns: number) {  this.columns = Array.from({ length: numColumns }, () => ({ height: 0 }));  this.items = [];  }  // 添加条目的方法(示例)  addItem(item: Item) {  // 这里只是简单地将条目添加到items数组中,实际计算位置会在其他地方进行  this.items.push(item);  // 注意:实际开发中,你可能会在这里就计算并设置条目的位置  }  // 计算所有条目的位置(通常会在数据更新或组件初始化时调用)  calculatePositions() {  // 假设所有条目都已经被添加到items数组中  let minColumnIndex = 0;  this.items.forEach(item => {  // 找到当前高度最小的列  minColumnIndex = this.columns.findIndex(column => column.height === Math.min(...this.columns.map(c => c.height)));  // 假设item.y是条目的垂直位置,item.x是水平位置(基于列索引)  // 这里我们简单地将x设置为列索引乘以条目宽度加上一些边距(如果有的话)  // 但实际上,在ArkUI中,你可能不需要手动设置x,而是由布局系统来管理  // item.x = minColumnIndex * itemWidth + margin; // 伪代码,不直接设置  // 设置条目的垂直位置为当前列的高度  // 在实际中,你可能需要更新UI组件的状态或属性来反映这一点  // 这里只是逻辑上的计算  let itemPosition = this.columns[minColumnIndex].height;  // 更新列的高度  this.columns[minColumnIndex].height += item.contentHeight;  // 假设有一个方法来更新UI组件的位置(伪代码)  // updateItemPositionInUI(item, { x: minColumnIndex * someValue, y: itemPosition });  });  }  
}

注意事项
内容高度(contentHeight):这个值通常需要根据条目的实际内容来计算,比如图片加载完成后的高度加上文本的高度等。在ArkUI中,你可能需要在图片加载完成后更新这个值,并重新计算布局。
布局更新:当有新条目添加、现有条目内容变化(如图片加载完成)或屏幕尺寸变化时,你需要重新计算布局。这可能需要触发组件的重新渲染或更新其内部状态。
性能优化:在大量数据或频繁更新的情况下,重新计算整个瀑布流的布局可能会很昂贵。你可以通过只重新计算受影响的区域、使用虚拟滚动或延迟更新来优化性能。
响应式布局:当屏幕尺寸变化时,你可能需要重新计算列数并重新布局所有条目。这可能需要监听窗口大小变化事件并在事件处理程序中执行相应的逻辑。
实际应用
在ArkUI中,你可能需要将这些逻辑与UI组件的生命周期和事件处理相结合。例如,在组件的onReady或onAttached生命周期钩子中初始化瀑布流布局,在onResize或自定义的窗口大小变化监听器中重新计算布局,以及在数据更新时调用calculatePositions方法并更新UI。

请注意,上面的代码是一个简化的示例,用于说明瀑布流布局计算的基本原理。在实际应用中,你可能需要根据ArkUI的具体API和框架特性进行调整和扩展。

总结

通过结合 ArkUI 的自定义组件能力、布局机制以及可能的性能优化技术,我们可以实现一个高性能、自适应的瀑布流组件。虽然 GeometryReader 在这个特定场景中的直接应用可能有限,但它仍然是 ArkUI 提供的一个强大工具,可以在其他需要响应式布局的场合中发挥重要作用。在开发过程中,我们应该根据实际需求选择最合适的工具和技术来实现目标。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024-2025-1 20241319 《计算机基础与程序设计》第十三周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13这个作业的目标 《C语言程序设计》第12章作业正文 https://www.cnblogs.com/wchxx/p/18622144**教材学习内容总结 结构体(struct) 1…

【原创】xenomai环境下开源实时数控系统LinuxCNC编译安装

LinuxCNC是一款基于Linux操作系统的开源实时数控系统,可将普通计算机转变为高效的CNC(计算机数字控制)机器,本文记录xenomai下linuxcnc的构建安装。linuxcnc 在xenomai下的构建简单记录,参考链接https://www.linuxcnc.org/docs/devel/html/code/building-linuxcnc.html 1.…

2024-2025-1 20241301 《计算机基础与程序设计》第十三周学习总结

|这个作业属于哪个课程|2024-2025-1-计算机基础与程序设计| |这个作业要求在哪里|2024-2025-1计算机基础与程序设计第一周作业| |这个作业的目标|<复习知识,巩固基础>| |作业正文|https://www.cnblogs.com/HonJo/p/18622132| 一、教材学习内容 (一)网络 根据提供的搜索…

【ByPass】最新发现绕过浏览器隔离技术的攻击方法

BaizeSec 白泽安全实验室 2024年12月10日 15:26 北京 在网络安全领域,浏览器隔离技术一直被视为对抗网络钓鱼和基于浏览器的攻击的有效手段。然而,根据Mandiant的最新研究,攻击者已经找到了一种利用QR码绕过浏览器隔离的攻击方法,从而能够从远程服务器向受害设备发送恶意数…

【ByPass】绕过EDR系统检测的新型攻击技术

近日,Akamai安全研究团队披露了Windows UI Automation框架的一种新型攻击技术,该技术能够绕过端点检测和响应(EDR)系统检测,引发了广泛的安全担忧。研究发现,攻击者通过诱骗用户运行一个使用UI Automation的程序,可以实现隐蔽的命令执行,进而窃取敏感数据、重定向浏览器…

Origin绘图教程 | 灵活选择绘图数据

主要内容:使用多个工作表的数据绘图 + 使用另一列的数据作为设定图形颜色的参数 + 使用多个不相邻列绘图 使用多个工作表的数据绘图 1. 使用在 第二课: 图形模板与批量绘图中保存的项目文件。选择任意工作簿, 并确认没有任何数据列被选择. 你可以点击数据列外的灰色区域,以取…

第十三周学习总结

学期2024-2025- 学号20241414 《计算机基础与程序设计》第十三周学习总结 作业信息这个作业属于哪个课程 <班级的链接>2024-2025-1-计算机基础与程序设计这个作业要求在哪里 <作业要求的链接>2024-2025-1计算机基础与程序设计第一周作业这个作业的目标 文件操作作业…

【AI+物联网】AIOT :打造边云协同的物联网新模式

在当今数字化浪潮中,AIOT(人工智能物联网)与边缘智能宛如一对闪耀的双子星,正以前所未有的速度重塑着各个行业,为人们的生活与生产带来翻天覆地的变革。 一、AIOT:万物互联的智慧基石 AIOT 作为人工智能技术与物联网深度融合的结晶,为智能制造搭建起关键架构。物联网凭借…

第十章

例10.1点击查看代码 import numpy as np import statsmodels.api as sm import pylab as pltdef check(d):x0 = d[0]; y0 = d[1]; d = {x:x0, y:y0}re = sm.formula.ols(y~x, d).fit()print(re.summary())print(re.outlier_test())print(残差的方差, re.mse_resid)pre=re.get_…

Javascript元编程

元编程 (Metaprogramming) 是编写操作程序本身的程序的艺术,允许程序通过操作代码结构和行为来自我调整。元编程的核心是增强代码灵活性和动态性,典型的元编程功能包括拦截、修改、生成代码等 文章首发博客,点击查看 扫码关注公众号,查看更多优质文章引文:引用维基百科元编…

23粘性定位-z index-浮动-浮动练习

一、粘性定位 - sticky 另外还有一个定位的值是position:sticky,比起其他定位值更新一些。 sticky是一个大家期待已久的属性; 可以看作是相对定位和固定(绝对)定位的结合体; 它允许被定位的元素表现得像相对定位一样,直到它滚动到某个阈值点; 当达到这个阈值点时,就会变…