SelectionArea 实现富文本

使用 SelectionArea + Text.rich + TextSpan + WidgetSpan实现富文本。

前置知识点学习

SelectionArea

`SelectionArea` 是 Flutter 中的一个组件,用于管理文本的选择功能。它允许用户在应用中选择和复制文本,这是在支持文本选择的应用程序中常见的功能。`SelectionArea` 提供了一种简单而有效的方法来启用或禁用子树中的文本选择。

`SelectionArea` 的基本使用

`SelectionArea` 是一个小部件,通常用于包裹其他文本小部件,例如 `Text` 或 `RichText`,以允许用户选择和复制其中的文本。它的功能类似于网页上的文本选择。

示例代码

以下是一个简单的示例,展示如何使用 `SelectionArea` 来使文本可选择:

import 'package:flutter/material.dart';

class SelectionAreaExample extends StatelessWidget {
  const SelectionAreaExample({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Selection Area Example")),
      body: const Center(
        child: SelectionArea(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(
                'This text can be selected.',
                style: TextStyle(fontSize: 18),
              ),
              Text(
                'You can select and copy this text.',
                style: TextStyle(fontSize: 18),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

解释

`SelectionArea`:

  • `SelectionArea` 包裹了一个或多个文本小部件,使得这些文本可被用户选择和复制。
  • 当用户长按或双击文本时,系统会显示选择控件,允许用户选择文本。

嵌套结构:

  • 在 `SelectionArea` 内,可以嵌套任何小部件。在示例中,使用 `Column` 布局多个 `Text` 小部件。
  • 所有被 `SelectionArea` 包裹的文本小部件都将支持选择功能。

复制功能:

  • 一旦文本被选择,用户可以使用设备的系统功能(通常是长按弹出的菜单)来复制选定的文本。

 使用场景

  • 文档阅读器: 在阅读器应用中,使得用户可以选择和复制文本内容。
  • 教育应用: 允许学生选择文本进行复制或分享。
  • 消息应用: 在聊天界面中,使得用户可以选择和复制聊天记录。

注意事项

  • 选择禁用: 可以在特定的文本区域使用 `SelectionContainer.disabled` 来禁用选择功能,这对于需要保护某些文本不被复制的场景很有用。
  • 兼容性: `SelectionArea` 组件的行为依赖于平台的文本选择功能,不同平台可能有不同的文本选择体验。

通过 `SelectionArea`,开发者可以轻松地在应用中支持文字选择和复制功能,这对于增强用户体验和文本交互非常有用。

WidgetSpan

`WidgetSpan` 是 Flutter 中用于在富文本中嵌入小部件的一个非常有用的工具。它允许你在文本流中插入任意的 Flutter 小部件,提供了创建复杂布局的灵活性。`WidgetSpan` 是 `InlineSpan` 的一个子类,它可以与 `TextSpan` 结合使用在 `RichText` 中。

`WidgetSpan` 的基本概念

`WidgetSpan` 是 `InlineSpan` 的一个子类。它不像 `TextSpan` 仅用于显示文本,而是用于显示小部件。这使得你可以在文本中插入图标、图片、按钮等,增强文本的表现力和交互性。

使用 `WidgetSpan`

`WidgetSpan` 的一个常见用法是与 `RichText` 和 `TextSpan` 结合使用,以创建混合内容的布局。下面是一个简单的例子,展示如何在文本中插入一个图标:

import 'package:flutter/material.dart';

class WidgetSpanExample extends StatelessWidget {
  const WidgetSpanExample({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("WidgetSpan Example")),
      body: Center(
        child: RichText(
          text: const TextSpan(
              style: TextStyle(fontSize: 18, color: Colors.blueGrey),
              children: <InlineSpan>[
                TextSpan(text: "Here is a star: "),
                WidgetSpan(
                    child: Icon(
                  Icons.star,
                  color: Colors.blue,
                  size: 24,
                )),
                TextSpan(text: ' and some more text.')
              ]),
        ),
      ),
    );
  }
}

 解释

`RichText` 和 `TextSpan`:

  • `RichText` 用于显示和管理复杂的文本布局。
  • `TextSpan` 定义文本的样式和内容。

`WidgetSpan`:

  • `WidgetSpan` 在文本流中插入一个小部件。
  • 在示例中,它插入了一个 `Icon` 小部件,让图标成为文本的一部分。

灵活性:

  • 通过使用 `WidgetSpan`,你可以在文本中嵌入任何小部件。这使得文本布局非常灵活,可以包含动态内容。

使用场景

  • 图文混排: 在文本中插入图片、图标或其他小部件。
  • 动态内容: 嵌入需要动态更新的小部件,如计数器、进度条等。
  • 装饰性元素: 在文本中插入装饰性元素,如分隔线、徽章等。

 注意事项

  • 布局影响: `WidgetSpan` 会影响文本的布局,因为它插入的是小部件而不是纯文本。需要考虑小部件的尺寸和对齐方式。
  • 性能考虑: 嵌入复杂的小部件可能会影响性能,尤其是在需要频繁重绘的场景中。

通过 `WidgetSpan`,开发者可以在富文本中实现更复杂的布局和交互效果,支持更丰富的用户界面设计。

SizedBox

`SizedBox` 是 Flutter 中的一个常用布局小部件,主要用于在布局中创建具有特定尺寸的空白区域或调整其子小部件的尺寸。它是一个非常简单但功能强大的小部件,能够帮助开发者精确地控制 UI 元素的大小和布局。

基本用法

`SizedBox` 可以通过指定宽度和高度来定义其尺寸。当不包含子小部件时,它可以用作在布局中创建固定大小的空白区域;当包含子小部件时,它会调整子小部件的尺寸以适应指定的尺寸限制。

构造函数

SizedBox({
  Key? key,
  double? width,
  double? height,
  Widget? child,
})

属性

  • `width`: 指定 `SizedBox` 的宽度。如果未指定,则宽度由子小部件决定或由父布局约束。
  • `height`: 指定 `SizedBox` 的高度。如果未指定,则高度由子小部件决定或由父布局约束。
  • `child`: 可选的子小部件。如果存在子小部件,`SizedBox` 会限制其尺寸;如果没有,`SizedBox` 只是一个固定大小的空白区域。

示例代码

下面是一些常见的 `SizedBox` 用法示例:

用作空白区域
SizedBox(
  width: 100,
  height: 100,
)

这段代码创建了一个 100x100 像素的空白区域。

调整子小部件尺寸
SizedBox(
  width: 200,
  height: 100,
  child: Container(
    color: Colors.blue,
  ),
)

这段代码创建一个 200x100 像素的蓝色矩形。`SizedBox` 将 `Container` 的尺寸调整为指定的宽度和高度。

仅指定一个维度
SizedBox(
  height: 50,
  child: Text("Hello, world!"),
)

这段代码将文本高度限制为 50 像素,宽度则由文本内容决定。

使用场景

  • 间距控制: 使用 `SizedBox` 在小部件之间创建固定大小的间距。
  • 尺寸约束: 限制子小部件的尺寸,使其符合特定的布局需求。
  • 占位符: 用于在布局中为未来的小部件预留空间。

 注意事项

  • 无子小部件时的行为: 当 `SizedBox` 没有子小部件时,它可以用作固定尺寸的空白区域。
  • 尺寸为零的行为: 如果 `width` 和 `height` 都设置为 `0`,`SizedBox` 不会占用任何空间。

`SizedBox` 是一个非常灵活的小部件,广泛用于布局调整和空间管理,帮助开发者精确控制 Flutter 应用的用户界面布局。

BoxFit

`BoxFit` 是 Flutter 中的一个枚举类,用于定义如何在布局中调整图像或其他内容的尺寸,以适应其显示容器的大小。它提供了多种模式来控制内容的拉伸或缩放方式,以确保在不同的容器中显示得当。

 `BoxFit` 枚举值

`BoxFit` 包含多个枚举值,分别控制内容在容器内的适应方式:

`BoxFit.fill`:

  • 拉伸内容以完全填充容器的宽度和高度。
  • 不保留内容的宽高比,因此可能会导致图像失真。

`BoxFit.contain`:

  • 缩放内容以适应容器,同时保持其宽高比。
  • 内容会完全显示在容器内,可能会留有空白区域。

`BoxFit.cover`:

  • 缩放内容以覆盖整个容器,同时保持其宽高比。
  • 内容可能会被裁剪,以确保没有空白区域。

`BoxFit.fitWidth`:

  • 缩放内容以适应容器的宽度,同时保持宽高比。
  • 高度可能超出容器范围。

`BoxFit.fitHeight`:

  • 缩放内容以适应容器的高度,同时保持宽高比。
  • 宽度可能超出容器范围。

`BoxFit.none`:

  • 不缩放内容,保持其原始尺寸。
  • 内容可能会超出或小于容器范围。

`BoxFit.scaleDown`:

  • 缩放内容以适应容器,但仅在内容尺寸大于容器时缩放。
  • 实际效果类似于 `contain`,但不会放大内容。

示例使用

以下是如何在 `Container` 中使用 `BoxFit` 来控制图像的显示方式:

import 'package:flutter/material.dart';

class BoxFitExample extends StatelessWidget {
  const BoxFitExample({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("BoxFit Example")),
      body: Center(
        child: Column(
          children: [
            Container(
              width: 300,
              height: 200,
              decoration: const BoxDecoration(
                  image: DecorationImage(
                      image: AssetImage("static/demo.png"),
                      fit: BoxFit.cover)),
            ),
            const Text("BoxFit.cover Example"),
          ],
        ),
      ),
    );
  }
}

使用场景

  • 背景图片: 使用 `BoxFit.cover` 或 `BoxFit.fill` 使背景图片填满整个区域。
  • 图像显示: 使用 `BoxFit.contain` 或 `BoxFit.scaleDown` 确保完整显示图片而不裁剪。
  • 特定布局需求: 根据不同的 UI 需求选择合适的 `BoxFit` 模式,以实现最佳视觉效果。

注意事项

  • 选择合适的模式: 根据图像的用途和布局需求选择合适的 `BoxFit` 模式,以避免不必要的裁剪或失真。
  • 性能考虑: 当处理大量或高分辨率图像时,要注意图像的加载和渲染性能,特别是在使用模式如 `BoxFit.fill` 时。

SelectionContainer

`SelectionContainer` 是 Flutter 提供的一个小部件,用于管理和控制其子树中内容的选择行为。它与 `SelectionArea` 配合使用,可以细化对某些内容是否可以被选中的控制。

`SelectionContainer` 的基本概念

`SelectionContainer` 允许开发者指定哪些内容可以被选中,以及在何种情况下可以被选中。它的主要功能是启用或禁用内容选择,提供更细粒度的控制。

常用属性

  • `enabled`: 一个布尔值,表示是否启用选择功能。默认情况下,内容是可选中的。
  • `disabled`: 这是一个常见的用法,通过 `SelectionContainer.disabled` 来显式禁用选择。

使用示例

下面是一个简单的示例,展示如何使用 `SelectionContainer` 来控制文本的选择行为:

import 'package:flutter/material.dart';

class SelectionContainerExample extends StatelessWidget {
  const SelectionContainerExample({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Selection Container Example")),
      body: const Center(
        child: SelectionArea(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(
                'This text can be selected.',
                style: TextStyle(fontSize: 18),
              ),
              SelectionContainer.disabled(
                  child: const Text(
                'This text cannot be selected.',
                style: TextStyle(fontSize: 18, color: Colors.grey),
              ))
            ],
          ),
        ),
      ),
    );
  }
}

解释

`SelectionArea`:

  • `SelectionArea` 包裹在文本外层,使其默认情况下可选择。

`SelectionContainer`:

  • `SelectionContainer` 用于细化选择控制。
  • `SelectionContainer.disabled` 明确指定其子小部件不可被选中。

嵌套使用:

  • 可以嵌套使用 `SelectionContainer` 和 `SelectionArea`,通过设置 `disabled` 来禁用特定部分的选择功能。

使用场景

  • 启用/禁用文本选择: 在需要精确控制哪些文本段落可被选中的应用场景中非常有用。
  • 保护敏感信息: 确保某些文本信息不被用户复制或选择。
  • 定制用户交互: 根据应用的需求,定制用户如何与文本内容交互。

注意事项

  • 默认行为: 在 `SelectionArea` 中的所有文本默认是可选中的,除非使用 `SelectionContainer.disabled` 来禁用。
  • 嵌套效果: 在复杂布局中,注意嵌套的 `SelectionContainer` 和 `SelectionArea` 的影响,以确保选择行为符合预期。

通过 `SelectionContainer`,开发者可以在 Flutter 应用中提供更细致的文本选择控制,增强用户界面交互的灵活性和安全性。

ScaffoldMessenger

`ScaffoldMessenger` 是 Flutter 中用于显示 `SnackBar` 和处理 `SnackBar` 队列的一个重要工具。它提供了一种在整个应用范围内管理 `SnackBar` 的机制,无需依赖于特定的 `Scaffold` 实例。这在需要跨多个页面或上下文显示通知时特别有用。

`ScaffoldMessenger` 的基本概念

`ScaffoldMessenger` 是一个状态管理小部件,负责管理显示在 `Scaffold` 上的 `SnackBar`。它解决了以前版本中 `SnackBar` 的一些限制,使得显示 `SnackBar` 更加灵活和强大。

主要功能

  • 管理 `SnackBar` 队列: `ScaffoldMessenger` 可以在一个队列中管理多个 `SnackBar`,并按顺序显示它们。
  • 跨 `Scaffold` 显示: 允许在应用的任何位置显示 `SnackBar`,而不必绑定到特定的 `Scaffold`。
  • 提供更好的状态管理: 通过 `ScaffoldMessenger`,可以在应用的不同部分之间更好地管理和共享 `SnackBar` 状态。

使用示例

以下是一个示例,展示如何使用 `ScaffoldMessenger` 来显示 `SnackBar`:

import 'package:flutter/material.dart';

class ScaffoldMessengerExample extends StatelessWidget {
  const ScaffoldMessengerExample({super.key});

  void _showSnackBar(BuildContext context) {
    final snackBar = SnackBar(
      content: const Text('This is a SnackBar!'),
      action: SnackBarAction(
        label: 'Undo',
        onPressed: () {},
      ),
    );

    ScaffoldMessenger.of(context).showSnackBar(snackBar);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("ScaffoldMessenger Example")),
      body: Center(
        child: ElevatedButton(
          onPressed: () => _showSnackBar(context),
          child: const Text("Show SnackBar"),
        ),
      ),
    );
  }
}

解释

`ScaffoldMessenger.of(context)`:

  • 用于获取与给定 `BuildContext` 关联的 `ScaffoldMessenger` 实例。
  • 通过这个实例,可以调用 `showSnackBar` 来显示 `SnackBar`。

`SnackBar` 和 `SnackBarAction`:

  • `SnackBar` 是一个临时显示的消息条,通常在底部显示。
  • `SnackBarAction` 提供了一个可选的动作按钮供用户交互。

跨页面显示:

  • 因为 `ScaffoldMessenger` 与应用的 `BuildContext` 相关联,所以可以在应用的任何地方调用,而不局限于当前页面的 `Scaffold`。

使用场景

  • 全局通知: 在应用的任何位置显示通知或消息,而不依赖于特定页面的 `Scaffold`。
  • 状态反馈: 在操作后向用户提供反馈,比如操作成功或失败的消息。
  • 多页面应用: 在多页面应用中管理 `SnackBar`,确保持续的用户体验。

注意事项

  • 队列管理: `ScaffoldMessenger` 自动管理 `SnackBar` 队列,通过调用 `showSnackBar` 可以不断添加新的 `SnackBar`。

IconButton

`IconButton` 是 Flutter 中的一个小部件,用于创建一个带有图标的可点击按钮。它是一个无状态的小部件,提供了一种简洁的方式来为用户界面添加交互元素。

`IconButton` 的基本属性

`IconButton` 的主要功能是展示一个图标,并在用户点击时触发一个回调函数。以下是 `IconButton` 的常用属性:

  • `icon`: 这是一个 `Widget`,通常是一个 `Icon`,用于指定按钮中显示的图标。
  • `onPressed`: 一个回调函数,当按钮被点击时调用。如果为 `null`,按钮会被禁用(不可点击),并显示禁用状态。
  • `iconSize`: 用于设置图标的大小,默认为 24.0。
  • `color`: 用于指定图标的颜色。
  • `splashColor`: 点击按钮时的水波纹颜色。
  • `highlightColor`: 按下按钮时的颜色。
  • `padding`: 指定按钮的内边距。默认值是 `EdgeInsets.all(8.0)`。
  • `tooltip`: 当用户长按或将鼠标悬停在按钮上时显示的文本提示。

使用示例

下面是一个简单的 `IconButton` 使用示例,展示如何在应用中创建一个带有图标的按钮:

import 'package:flutter/material.dart';
class IconButtonExample extends StatelessWidget {
  const IconButtonExample({super.key});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("IconButton Example")),
      body: Center(
        child: IconButton(
          icon: const Icon(Icons.volume_up),
          onPressed: () {
            // Define the action to take when the button is pressed
            ScaffoldMessenger.of(context).showSnackBar(
              const SnackBar(content: Text("Volume Up button pressed")),
            );
          },
          color: Colors.blue, // Icon color
          iconSize: 40.0,    // Icon size
          tooltip: 'Increase volume', // Tooltip text
        ),
      ),
    );
  }
}

解释

`icon` 属性:

  • 设置为 `Icon(Icons.volume_up)`,这表示按钮上显示的图标。

`onPressed` 属性:

  • 定义了一个简单的回调,使用 `ScaffoldMessenger` 显示一个 `SnackBar`,作为点击按钮时的反馈。

其他属性:

  • `color` 设置图标颜色为蓝色。
  • `iconSize` 将图标的尺寸设置为 40 像素。
  • `tooltip` 提供了一个简短的说明,当用户长按或悬停时显示。

使用场景

  • 工具栏按钮: 常用于应用程序的工具栏或导航栏中,提供快速操作。
  • 可交互图标: 在页面中提供图标按钮,执行特定任务,如播放、暂停、音量控制等。
  • 视觉提示: 通过图标直观地向用户传达按钮的功能。

注意事项

  • 禁用状态: 如果 `onPressed` 设置为 `null`,按钮将显示为禁用状态,用户无法点击。
  • 无文本标签: `IconButton` 仅用于显示图标,如果需要图标和文本一起使用,考虑使用 `TextButton` 或 `ElevatedButton` 等。

富文本代码学习

import 'package:flutter/material.dart';

class RichTextDemoPage2 extends StatefulWidget {
  const RichTextDemoPage2({super.key});

  @override
  _RichTextDemoState2 createState() => _RichTextDemoState2();
}

class _RichTextDemoState2 extends State<RichTextDemoPage2> {
  double size = 50;

  @override
  Widget build(BuildContext mainContext) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("RichTextDemoPage"),
        actions: <Widget>[
          IconButton(
            onPressed: () {
              setState(() {
                size += 10;
              });
            },
            icon: const Icon(Icons.add_circle_outline),
          ),
          IconButton(
            onPressed: () {
              setState(() {
                size -= 10;
              });
            },
            icon: const Icon(Icons.remove_circle_outline),
          )
        ],
      ),
      body: SelectionArea(
        child: Container(
          margin: const EdgeInsets.all(10),
          child: Builder(builder: (context) {
            return Center(
              child: Text.rich(TextSpan(
                children: <InlineSpan>[
                  const TextSpan(text: 'Flutter is'),
                  const WidgetSpan(
                      child: SizedBox(
                    width: 120,
                    height: 50,
                    child: Card(
                        color: Colors.blue,
                        child: Center(child: Text('Hello World!'))),
                  )),
                  WidgetSpan(
                      child: SizedBox(
                    width: size > 0 ? size : 0,
                    height: size > 0 ? size : 0,
                    child: Image.asset(
                      "static/demo.png",
                      fit: BoxFit.cover,
                    ),
                  )),
                  const TextSpan(text: 'the best!'),
                  const WidgetSpan(
                    child: SelectionContainer.disabled(
                      child: Text(' not copy'),
                    ),
                  ),
                ],
              )),
            );
          }),
        ),
      ),
    );
  }

 
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flask基础

from flask import Flask, requestapp Flask(__name__)# app.route(/) # def hello_world(): # put applications code here # return Hello World!app.route(/) # 路由 当用户访问特定 URL 时&#xff0c;Flask 会调用对应的视图函数来处理请求 def index():return …

WPF使用OpenCvSharp4

WPF使用OpenCvSharp4 创建项目安装OpenCvSharp4 创建项目 安装OpenCvSharp4 在解决方案资源管理器中&#xff0c;右键单击项目名称&#xff0c;选择“管理 NuGet 包”。搜索并安装以下包&#xff1a; OpenCvSharp4OpenCvSharp4.ExtensionsOpenCvSharp4.runtime.winSystem.Man…

社媒运营专线 - SD-WAN 跨境网络专线 —— 外贸企业社媒平台的专属 “快车道”

在当今全球化的商业浪潮中&#xff0c;社交媒体平台已成为外贸企业拓展国际市场、提升品牌知名度和促进业务增长的关键阵地。然而&#xff0c;网络访问速度慢、IP 不纯净等问题却如影随形&#xff0c;严重制约了企业社媒运营的效率和效果。幸运的是&#xff0c;社媒运营专线 - …

RustDesk内置ID服务器,Key教程

RustDesk内置ID服务器&#xff0c;Key教程 首先需要准备一个域名&#xff0c;并将其指定到你的 rustdesk 服务器 ip 地址上&#xff0c;这里编译采用的是Github Actions &#xff0c;说白了是就workflows&#xff0c;可以创建一些自动化的工作流程&#xff0c;例如代码的检查&a…

代码随想录算法【Day4】

Day4 1.链表的题目&#xff0c;要在草稿纸上模拟清晰后就简单了 2.双指针更加灵活的应用。 3.环形链表多练习。 24. 两两交换链表中的节点 class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode* _dummyHead new ListNode(0); //虚拟头结点_dummyHead…

计算机毕业设计hadoop+spark+hive民宿推荐系统 酒店推荐系统 民宿价格预测 酒店价格 预测 机器学习 深度学习 Python爬虫 HDFS集群

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

win11中win加方向键失效的原因

1、可能是你把win键锁了&#xff1a; 解决办法&#xff1a;先按Fn键&#xff0c;再按win键 2、可能是可能是 贴靠窗口设置 中将贴靠窗口关闭了&#xff0c;只需要将其打开就好了

Unity自定义Inspector属性名特性以及特性自定义布局问题

前言&#xff1a; 在Unity中编辑属性的适合&#xff0c;一般都是显示属性的英文&#xff0c;如果想要改成中文的话又不能改变属性名&#xff0c;那么自定义特性是很好的选择。 一、自定以特性 这一块没有什么要多说的&#xff0c;就是自定义特性 using UnityEngine; #if UNI…

sentinel集成nacos启动报[check-update] get changed dataId error, code: 403错误排查及解决

整合nacos报403错误 因为平台写的一个限流代码逻辑有问题&#xff0c;所以准备使用sentinel来限流。平台依赖里面已经引入了&#xff0c;之前也测试过&#xff0c;把sentinel关于nacos的配置加上后&#xff0c;启动一直输出403错误 [fixed-10.0.20.188_8848-test] [check-upda…

普通人怎么入门学习并使用AI?

前言 作为普通人看着AI一天一天变革&#xff0c;心急如焚&#xff0c;未来但是就是不知道怎么才算真正进入了AI&#xff0c;使用AI....作为从头至尾追随AI脚步的码农有几点小建议~ 一、&#x1f4bb;使用 AI 网站或软件&#xff0c;解决实际问题 不管用哪种AI&#xff0c;先用…

洛谷 P1725:琪露诺 ← 单调队列+DP

【题目来源】https://www.luogu.com.cn/problem/P1725【题目描述】 在幻想乡&#xff0c;琪露诺是以笨蛋闻名的冰之妖精。 某一天&#xff0c;琪露诺又在玩速冻青蛙&#xff0c;就是用冰把青蛙瞬间冻起来。但是这只青蛙比以往的要聪明许多&#xff0c;在琪露诺来之前就已经跑到…

SDL单设备登录

SDL单设备登录 需求&#xff1a;当账户在其他地方登录时&#xff0c;当前已登录账户会被顶下线 核心思路&#xff1a; 前后端建立WebSocket连接&#xff0c;当客户端登录账户&#xff0c;根据用户id保存Socket连接&#xff0c;如果该用户已有保存的连接&#xff0c;则通知下线…

MySQL数据库函数——日期函数

常用的日期函数 函数功能curdate()返回当前日期curtime()返回当前时间now()返回当前日期和时间year(date)获取指定date的年份month(date)获取指定date的月份day(date)获取指定date的日期date_add(date,interval expr type)返回一个日期/时间值加上一个时间间隔expr后的时间值d…

基于MATLAB的冰箱水果保鲜识别系统

摘要&#xff1a;本作品旨在研究和实现基于MATLAB软件的冰箱水果保鲜识别系统&#xff0c;针对多种常见水果混合的图像进行处理和识别。首先&#xff0c;根据水果与背景的差异选择合适的阈值&#xff0c;对图像进行去噪和对比度增强&#xff0c;然后进行二值化处理。接下来&…

谷歌地球引擎GEE计算NDVI与NDWI的年平均值的方法

本文介绍在谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;中&#xff0c;基于哨兵2号遥感影像数据&#xff0c;计算某一指定区域NDVI、NDWI等指标的年平均值的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;…

《机器视觉:开启智能新时代》

《机器视觉&#xff1a;开启智能新时代》 一、机器视觉&#xff1a;工业之眼的崛起二、核心组件&#xff1a;构建精准视觉系统&#xff08;一&#xff09;光源&#xff1a;照亮视界的画笔&#xff08;二&#xff09;镜头&#xff1a;聚焦精准的慧眼&#xff08;三&#xff09;相…

RPA系列-uipath 学习笔记4

使用Uipath 处理hover的问题 备注&#xff1a;使用uipath stversion&#xff1a;2024.10.6,所有学习来源自uipath Academy 首先&#xff0c;打开uipath给我们提供的一个网站 ACME,这个网站呢&#xff0c;需要提前注册一下的哈。 今天呢&#xff0c;就是记录一下&#xff0c;怎…

Excel将混乱的多行做成1列

目标是将数据按从左到右&#xff0c;再从上到下排成一列。 公式法 首先用textjoin函数将文本包起来&#xff0c;做成一个超长文本。 然后用公式 截取文本 Mid(m1,n,3)&#xff0c;意思就是对m1单元格&#xff0c;从第n个字符开始&#xff0c;截取3个字符出来。 这个公式如何自…

期权懂|期权入门知识:如何选择期权合约?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 期权入门知识&#xff1a;如何选择期权合约&#xff1f; 一、选择月份&#xff1a; 通常情况下&#xff0c;月份的选择与期货合约的选择类似&#xff0c;主要关注主力合约。主力…

ADC(三):注入组的使用

有关ADC的基础知识请参考标准库入门教程 ADC&#xff08;三&#xff09;&#xff1a;注入组的使用 1、规则组软件触发注入组自动注入2、规则组外部触发注入组自动注入3、规则组软件触发注入组外部触发&#xff08;TIM2_CC1&#xff09;4、规则组软件触发注入组外部触发&#xf…