flutter 自定义组件-抽奖大转盘

2023-10-31

import 'dart:async';
import 'dart:math';
import 'dart:ui' as ui;
import 'dart:ui';

import 'package:demo/widget/luck/luck_entity.dart';
import 'package:demo/widget/luck/luck_util.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class LuckDrawWidget extends StatefulWidget {
  ///抽奖相关数据
  @required
  LuckEntity chartEntity;

  double startTurns = .0;
  double radius = 130;

  LuckDrawWidget(this.chartEntity, {this.radius, this.startTurns});

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

class _LuckDrawWidgetState extends State<LuckDrawWidget>
    with TickerProviderStateMixin {
  ///这个是 自动
  AnimationController autoAnimationController;

  Animation<double> tween;

  double turns = .0;

  GlobalKey _key = GlobalKey();

  ///角加速度,类似摩擦力 的作用 ,让惯性滚动 减慢,这个意思是每一秒 ,角速度 减慢vA个pi。
  double vA = 40.0;

  Offset offset;

  double pBy;

  double pBx;

  double pAx;

  double pAy;

  double mCenterX;
  double mCenterY;

  Animation<double> _valueTween;

  double animalValue;

  @override
  void initState() {
    super.initState();
    //获取中心图片资源
    getPoint();
    //获取每条数据item
    getResours();
  }

  getPoint() => getAssetImage(
        widget?.chartEntity?.luckPic,
        width: widget?.chartEntity?.centerWidth,
        height: widget?.chartEntity?.centerHeight,
      )
          .then((value) => widget?.chartEntity?.image = value)
          .whenComplete(() => setState(() {}));

  getResours() => widget?.chartEntity?.entitys?.forEach((e) async => ((e.pic
              .contains("http") ||
          e.pic.contains("https"))
      ? await getNetImage(e?.pic?.trim(), width: e?.width, height: e?.height)
          .then((value) => e.image = value)
          .whenComplete(() => setState(() {}))
      : await getAssetImage(e?.pic?.trim(), width: e?.width, height: e?.height)
          .then((value) => e.image = value)
          .whenComplete(() => setState(() {}))));

  //获取网络图片 返回ui.Image
  Future<ui.Image> getNetImage(String url, {width, height}) async {
    try {
      ByteData data = await NetworkAssetBundle(Uri.parse(url)).load(url);
      ui.Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List(),
          targetWidth: width, targetHeight: height);
      ui.FrameInfo fi = await codec.getNextFrame();
      return fi.image;
    } catch (e) {
      return null;
    }
  }

  //获取本地图片 返回ui.Image
  Future<ui.Image> getAssetImage(String asset, {width, height}) async {
    ByteData data = await rootBundle.load(asset);
    ui.Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List(),
        targetWidth: width, targetHeight: height);
    ui.FrameInfo fi = await codec.getNextFrame();
    return fi.image;
  }

  // 获取图片 本地为false 网络为true
  Future<ui.Image> loadImage(var path, bool isUrl) async {
    ImageStream stream;
    if (isUrl) {
      stream = NetworkImage(path).resolve(ImageConfiguration.empty);
    } else {
      stream = AssetImage(path, bundle: rootBundle)
          .resolve(ImageConfiguration.empty);
    }
    Completer<ui.Image> completer = Completer<ui.Image>();
    listener(ImageInfo frame, bool synchronousCall) {
      final ui.Image image = frame.image;
      completer.complete(image);
      stream.removeListener(ImageStreamListener(listener));
    }

    stream.addListener(ImageStreamListener(listener));
    return completer.future;
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      width: 2 * widget.radius,
      height: 2 * widget.radius,
      child: GestureDetector(
        child: CustomPaint(
          painter: PieChartPainter(
            _key,
            turns,
            widget.startTurns,
            widget.chartEntity.entitys,
            widget?.chartEntity?.image,
            widget.chartEntity.centerHeight,
            widget.chartEntity.centerWidth,
          ),
          key: _key,
        ),
        onPanEnd: _onPanEnd,
        onPanDown: _onPanDown,
        onPanUpdate: _onPanUpdate,
      ),
    );
  }

  void _onPanUpdate(DragUpdateDetails details) {
    pBx = details.globalPosition.dx;
    //后面的 点的 x坐标
    pBy = details.globalPosition.dy;
    //后面的点的 y坐标
    double dTurns = getTurns();
    setState(() {
      turns += dTurns;
    });
    pAx = pBx;
    pAy = pBy;
  }

  void _onPanDown(DragDownDetails details) {
    if (offset == null) {
      //获取position
      RenderBox box = _key.currentContext.findRenderObject();
      offset = box.localToGlobal(Offset.zero);
      mCenterX = offset.dx + 130;
      mCenterY = offset.dy + 130;
    }

    pAx = details.globalPosition.dx; //初始的点的 x坐标
    pAy = details.globalPosition.dy; //初始的点的 y坐标
  }

  double getTurns() {
    ///计算 之前的点相对于水平的 角度
    ///

    ///
    /// o点(offset.dx+130,offset.dy+130).
    /// C点 (offset.dx+260,offset.dy+130).
    /// oc距离  130
    ///
    /// A点 (pAx,pAy),
    /// B点  (pBx,pBy).

    /// AC距离
    double acDistance = LuckUtil.distanceForTwoPoint(
        offset.dx + 2 * widget.radius, offset.dy + widget.radius, pAx, pAy);

    /// AO距离

    double aoDistance = LuckUtil.distanceForTwoPoint(
        offset.dx + widget.radius, offset.dy + widget.radius, pAx, pAy);

    ///计算 cos aoc 的值 ,然后拿到 角 aoc
    ///
    double ocdistance = widget.radius;

    int c = 1;

    if (pAy < (offset.dy + widget.radius)) {
      c = -1;
    }

    double cosAOC = (aoDistance * aoDistance +
            ocdistance * ocdistance -
            acDistance * acDistance) /
        (2 * aoDistance * ocdistance);
    double AOC = c * acos(cosAOC);

    /// BC距离
    double bcDistance = LuckUtil.distanceForTwoPoint(
        offset.dx + 2 * widget.radius, offset.dy + widget.radius, pBx, pBy);

    /// BO距离
    double boDistance = LuckUtil.distanceForTwoPoint(
        offset.dx + widget.radius, offset.dy + widget.radius, pBx, pBy);

    c = 1;
    if (pBy < (offset.dy + widget.radius)) {
      c = -1;
    }

    ///计算 cos boc 的值,然后拿到角 boc;
    double cosBOC = (boDistance * boDistance +
            ocdistance * ocdistance -
            bcDistance * bcDistance) /
        (2 * boDistance * ocdistance);
    double BOC = c * acos(cosBOC);

    return BOC - AOC;
  }

  ///抬手的时候 , 惯性滑动
  void _onPanEnd(DragEndDetails details) {
    double vx = details.velocity.pixelsPerSecond.dx;
    double vy = details.velocity.pixelsPerSecond.dy;
    if (vx != 0 || vy != 0) {
      onFling(vx, vy);
    }
  }

  void onFling(double velocityX, double velocityY) {
    //获取触点到中心点的线与水平线正方向的夹角
    double levelAngle = LuckUtil.getPointAngle(mCenterX, mCenterY, pBx, pBy);
    //获取象限
    int quadrant = LuckUtil.getQuadrant(pBx - mCenterX, pBy - mCenterY);
    //到中心点距离
    double distance =
        LuckUtil.distanceForTwoPoint(mCenterX, mCenterY, pBx, pBy);
    //获取惯性绘制的初始角度
    double inertiaInitAngle = LuckUtil.calculateAngleFromVelocity(
        velocityX, velocityY, levelAngle, quadrant, distance);

    if (inertiaInitAngle != null && inertiaInitAngle != 0) {
      //如果角速度不为0; 则进行滚动

      /// 按照 va的加速度 拿到 滚动的时间 。 也就是 结束后 惯性动画的 执行 时间, 高中物理
      double t = LuckUtil.abs(inertiaInitAngle) / vA;
      double s = t * inertiaInitAngle / 2;

      animalValue = turns;
      var time = new DateTime.now();
      int direction = 1;

      ///方向控制参数
      if (inertiaInitAngle < 0) {
        direction = -1;
      }
      autoAnimationController = AnimationController(
          duration: Duration(milliseconds: (t * 1000).toInt()), vsync: this)
        ..addListener(() {
          var animalTime = new DateTime.now();
          int t1 =
              animalTime.millisecondsSinceEpoch - time.millisecondsSinceEpoch;
          setState(() {
            double s1 = (2 * inertiaInitAngle - direction * vA * (t1 / 1000)) *
                t1 /
                (2 * 1000);
            turns = animalValue + s1;
          });
        });

      autoAnimationController.forward();
    }
  }

  @override
  void dispose() {
    super.dispose();
    if (autoAnimationController != null) {
      autoAnimationController.dispose();
    }
  }
}

class PieChartPainter extends CustomPainter {
  GlobalKey _key = GlobalKey();

  double turns = .0;
  double startTurns = .0;

  @required
  int centerHeight;
  @required
  int centerWidth;
  @required
  List<LuckItem> entitys;
  @required
  ui.Image _image;

  PieChartPainter(
    this._key,
    this.turns,
    this.startTurns,
    this.entitys,
    this._image,
    this.centerHeight,
    this.centerWidth,
  );

  double startAngles = 0;

  @override
  void paint(Canvas canvas, Size size) {
    drawAcr(canvas, size);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }

  void drawAcr(Canvas canvas, Size size) {
    startAngles = 0;
    Rect rect = Rect.fromCircle(
        center: Offset(size.width / 2, size.height / 2),
        radius: size.width / 2);
    Paint paint = Paint()
      ..color = Colors.red
      ..strokeWidth = 1.0
      ..isAntiAlias = true
      ..style = PaintingStyle.fill;
    //画扇形
    drawCircule(canvas, rect, size, paint);
    //画中心图片
    drawCenterPic(canvas, size, paint);
    //绘制内容
    drawContent(canvas, size, paint);
  }

  drawCircule(Canvas canvas, Rect rect, Size size, Paint paint) {
    for (int i = 0; i < entitys.length; i++) {
      paint..color = entitys[i].bgColor ?? Colors.green;
      canvas.drawArc(rect, 2 * pi * startAngles + turns + startTurns,
          2 * pi * entitys[i].percent, true, paint);
      startAngles += entitys[i].percent;
    }
    startAngles = 0;
  }

  drawCenterPic(Canvas canvas, Size size, Paint paint) {
    if (_image != null) {
      canvas.save();
      //画中心按钮图片
      canvas.drawImage(
        _image,
        Offset(
            (size.width - centerWidth) / 2, (size.height - centerHeight) / 2),
        paint,
      );
      canvas.restore();
    }
  }

  drawContent(Canvas canvas, Size size, Paint paint) {
    for (int i = 0; i < entitys.length; i++) {
      canvas.save();
      // 新建一个段落建造器,然后将文字基本信息填入;
      ParagraphBuilder pb = ParagraphBuilder(ParagraphStyle(
        textDirection: TextDirection.ltr,
        // 字体对齐方式
        textAlign: TextAlign.right,
        fontWeight: FontWeight.w500,
        fontStyle: FontStyle.normal,
        fontSize: 12.0,
        maxLines: 5,
        ellipsis: "...",
      ));
      pb.pushStyle(ui.TextStyle(
        color: entitys[i].nameColor ?? Colors.white,
        background: paint..color = Colors.white,
        height: 1,
      ));
      double roaAngle =
          2 * pi * (startAngles + entitys[i].percent / 2) + turns + startTurns;
      pb.addText(entitys[i].name);
      //计算扇形文字宽度
      // 设置文本的宽度约束
      ParagraphConstraints pc = ParagraphConstraints(width: 20);
      // 这里需要先layout,将宽度约束填入,否则无法绘制
      Paragraph paragraph = pb.build()..layout(pc);
      // 文字左上角起始点
      var startX = (centerHeight / 2 + entitys[i].height);
      var offsetAngles =
          (sin((startAngles + (entitys[i].percent / 2)) * (pi / 180)));
      Offset offset =
          Offset(startX, startX * offsetAngles - entitys[i].height / 2);
      canvas.translate(size.width / 2, size.height / 2);
      canvas.rotate((1) * roaAngle);
      if (entitys[i].image != null) {
        Offset offsetPic = Offset(centerHeight / 2 + 3.0,
            (centerHeight / 2) * offsetAngles - entitys[i].height / 2);
        canvas.drawImageRect(
            entitys[i].image,
            Offset(0.0, 0.0) &
                Size(entitys[i].width.toDouble(), entitys[i].height.toDouble()),
            offsetPic &
                Size(entitys[i].width.toDouble(), entitys[i].height.toDouble()),
            paint);
      }
      canvas.drawParagraph(paragraph, offset);
      canvas.restore();
      startAngles += entitys[i].percent;
    }
  }
}

class LuckEntity {
  final String luckPic; //抽奖按钮  现在考虑是否支持网图动态配置
  final int centerHeight;
  final int centerWidth;

  ui.Image image;
  final List<LuckItem> entitys;

  LuckEntity({
    this.luckPic,
    this.centerHeight = 90,
    this.centerWidth = 90,
    this.image,
    this.entitys,
  });

  @override
  String toString() {
    return 'ChartEntity{luckPic: $luckPic, entitys: $entitys}';
  }
}

class LuckItem {
  final String pic; //扇形图片链接
  @required
  ui.Image image;
  int height;
  int width;
  @required
  final String name; //扇形名字
  final Color nameColor; //扇形名字颜色
  @required
  final Color bgColor; //扇形背景颜色
  @required
  final double percent; //百分比

  LuckItem({
    this.pic,
    this.image,
    this.height = 30,
    this.width = 30,
    this.name,
    this.nameColor,
    this.bgColor,
    this.percent,
  });

  @override
  String toString() {
    return 'ChartEntity{ pic: $pic, name: $name, nameColor: $nameColor, bgColor: $bgColor, percent: $percent}';
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flutter 自定义组件-抽奖大转盘 的相关文章

  • 有什么方法可以有效地应用大型 git 补丁吗?

    我们收到了一个大补丁 修改了大约 17000 个文件 其大小为5 2G 应用补丁时git apply 3 12个小时后还没有完成 我们将每个文件的补丁分成更小的补丁 然后一一应用它们 这样至少我们可以看到进度 再次卡在一个文件补丁上 仍然有
  • git am:补丁格式检测失败

    我以前从未在 Git 中使用过补丁 我需要一些帮助 我正在尝试将补丁应用到 Git 存储库来测试 Wine 补丁 特别是这个补丁在这里 https bugs winehq org attachment cgi id 60752 所以我做了以
  • 扑。如何检查自动续订订阅是否仍然有效

    我的应用程序有 1 个月的自动续订订阅 当用户单击 购买订阅 按钮时 我将购买日期保存到共享首选项中 然后 1 个月后 我需要检查该订阅是否仍然有效 那么我该如何实施呢 2020 年 3 月 11 日更新 你好 我可以看到那些正在寻找如何在
  • 如何在 Flutter 上创建复制到剪贴板事件?

    目前我想在用户设备上为 复制到剪贴板 创建事件 当用户单击 列表视图前导图标 内容复制 时 文本应存储在他的设备剪贴板上 请问有人可以帮助我吗 Widget buildListItem BuildContext context Docume
  • 为什么每次合并分支后我的 git log graph 都会多增长一行?

    我习惯使用git log oneline graph decorate all作为别名git ll在终端中查看提交图表 但是当我每次合并我的时 一个问题让我感到困惑develop to master 上面命令的输出可能是这样的 0d1bf7
  • 如何使用 Github Pages 分支正确提交到存储库中

    我有一个问题 情况基于gh pages https pages github com 我的项目使用预处理器和其他困难的人员 因此 我的项目结构如下所示 主分支 src node modules public js css etc index
  • 将多个参数发送到 Flutter 中的计算函数

    我试图在 Flutter 中使用计算功能 void blockPressHandler int row int col async Called when user clicks any block on the sudoku board
  • 如何对 git 子模块使用相同的协议?

    在 git 存储库 R 中 我有一个使用以下命令初始化的子模块 git submodule add git mygitserver 现在用户刚刚使用克隆 Rhttps并在运行时出现错误 git submodule init git subm
  • 如何将 man 和 zip 添加到 Windows 上的“git bash”安装中

    我在用git bash https git for windows github io 在 Windows 上 即git对于 Windows 通过集成bash 显然它使用的是MINGW MSYS支撑 来自 VonC 的更新 现在使用 msy
  • 将新更新从原始 GitHub 存储库提取到分叉的 GitHub 存储库

    我在 GitHub 上分叉了某人的存储库 并希望使用原始存储库中的提交和更新来更新我的版本 这些是在我分叉我的副本后制作的 如何提取在源中所做的更改并将它们合并到我的存储库中 您必须将原始存储库 您分叉的存储库 添加为远程存储库 来自有关分
  • 如何归档旧的 git 标签?

    我的 git 存储库中有一些不再重要的旧标签 我想存档标签 以便在运行 git tag 时默认情况下它们不会显示 我不想删除它们 因为我想保留历史记录 我怎样才能做到这一点 可以将标签保留在存储库中并避免将它们列为标签 它还可以避免默认克隆
  • 添加对 json 数据的“Future”api 调用作为无限滚动 Flutter Gallery 示例项目

    尝试学习新的 flutter 框架 看起来非常有前途 完成所有在线演示后 我现在尝试将外部数据添加到 pesto 部分中的 flutter gallery 示例项目中 这些数据可以通过每 10 个项目调用一次新的 Future 数据来无限滚
  • 在 PowerShell 错误消息中使用 touch 命令创建新文件

    我的桌面上有一个使用 PowerShell 创建的目录 现在我尝试在其中创建一个文本文件 我确实将目录更改为新目录 然后输入touch textfile txt 这是我收到的错误消息 touch The term touch is not
  • 为什么某些 Git 分支名称中包含斜杠?

    我正在阅读本教程https www atlassian com git tutorials syncing git fetch https www atlassian com git tutorials syncing git fetch
  • 如何忽略Git中以数字开头的文件?

    在某个文件夹中 我有名为foo jpg bar png等等 我想将它们保留在版本控制中 除了那些命名为1 baz png 2 zaz jpg等 因为它们实际上是生成的 我应该添加什么条目 gitignore 正则表达式如 0 9 似乎不起作
  • 用于 Flutter 原生广告的 Objective-C 的 Swift 等效项

    我想为我的 Flutter 项目实现原生广告 它使用 Swift 而不是 Objective C https developers google com admob flutter native https developers googl
  • git rebase -i ——为什么它改变提交哈希值?

    所以我或多或少熟悉变基的工作原理 但直到最近我通常只做了一个git rebase i HEAD 20 并修改了需要修改的内容 我很惊讶地发现这将修改所有 20 个提交的哈希值 即使我采取的唯一操作是压缩最后两个提交 我不确定是什么导致其他
  • 子 git 存储库作为主存储库的子集

    我正在寻找一种方法来设置 git 存储库 其中包括来自较大存储库的文件子集 并从该主存储库继承历史记录 我的主要动机是能够通过 GitHub 共享代码子集 我目前通过单个 git 存储库管理我的研究相关 主要是 Matlab 代码 代码本身
  • 忽略提交之间 git-diff 的*所有*空白更改

    我正在检查代码库并修复空白奇怪之处并通常纠正缩进等事情 并且我想确保我没有无意中进行任何其他更改 所以我正在做git diff w显示所有已更改文件中的差异 同时忽略空白差异 问题是这实际上并没有忽略all空白差异 至少是什么I认为仅仅是空
  • 如何让 BottomNavigationBar 粘在键盘颤动的顶部

    我正在尝试制作一个简单的聊天应用程序 所以我创建了一个脚手架和我的身体 将是消息和我的bottomNavigationBar将是我的打字字段和发送图标 我添加了一个文本字段 但键入时导航栏被键盘隐藏 这是我的代码BottomNavigati

随机推荐

  • Visual Studio(vs)与Pycharm,IDEA中常用快捷键汇总

    目录 Visual Studio 窗口管理 搜索 在编辑器中查找 代码编辑器 工具栏 调试 常用 Pycharm IDEA中 Ctrl 快捷键 Alt 快捷键 Shift 快捷键 Ctrl Alt 快捷键 Ctrl Shift 快捷键 Al
  • C++11 ——— 可变参数模板

    文章目录 可变参数模板的概念 可变参数模板的定义方式 参数包的展开方式 递归展开参数包 逗号表达式展开参数包 STL容器中的emplace相关接口函数 可变参数模板的概念 可变参数模板是C 11新增的最强大的特性之一 它对参数高度泛化 能够
  • nginx php站点配置文件,Nginx配置文件详解及多站点配置

    Nginx配置文件详解 配置文件在 etc nginx nginx conf nginx root目录修改报错403解决办法 chmod R 755 目录 usr share nginx html 修改nginx用户为其所有者 chown
  • 前腾讯员工不堪房价回老家进国企!享受清闲日子,但担心又随之而来

    在互联网大厂拿命挣高薪VS回老家进国企提前养老 哪个才是更好的生活 一位前腾讯员工辞职后回老家省会进了国企 过着清闲舒服的日子 却担心再这么下去自己就废了 真是个上进的小哥哥 到手18W 工作量巨少 每天在办公室都不知道干嘛 下午五点就下班
  • 硬盘的三大种类

    文章目录 一 传统硬盘 HDD Hard Disk Drive 二 固态硬盘 SSD Solid State Drive 三 混合硬盘 hybrid hard drive HHD 四 对比 一 传统硬盘 HDD Hard Disk Driv
  • 实验2linux进程控制与通信,实验2 进程控制与通信管理word文档良心出品

    实验2 进程控制与通信管理word文档良心出品 由会员分享 可在线阅读 更多相关 实验2 进程控制与通信管理word文档良心出品 13页珍藏版 请在人人文库网上搜索 1 年级11级专业计算机科学与技术班级五班组号12组实验室9 205日期2
  • ChatGPT?听说Biying把它下架了

    ChatGPT被玩疯了 开始放飞自我 ChatGPT版微软必应上线不到10天 就被网友玩坏了 先说这个词 放飞自我 什么东西才会放飞自我 人放飞自我 人 你确定是人 所以让我们来把上面的句子改写一下 什么东西才会放飞自我 人才会放飞自我 所
  • HTML5实现音频和视频嵌入

    简介 HTML5未出来之前 在线的音频和视频都是借助Flash或者第三方工具实现的 现在HTML5也支持了这方面的功能 在一个支持HTML5的浏览器中 不需要安装任何插件就能播放音频和视频 原生的支持音频和视频 为HTML5注入了巨大的发展
  • [脑科学]-这才是心理学

    这本书出了第9版了 不长 写的挺好 国内也有一本 同样的名字 隋xx写的 文笔也很好 可惜不太有名 1 心理学 就是研究大脑是如何工作的学科 嗯 一定要明白这一点 各种心理学实验就是黑盒测试大脑 脑外科就是白盒研究大脑 要想变得聪明之类的
  • 欢聚集团 -- 前端一面

    面试形式 牛客网面试 一面40多分钟 自我介绍 面试内容 手写事件委托 手写AJAX IE怎么处理 常见的http状态码 和 的区别 js隐式转换 闭包 闭包的结构 原型 原型链 对象的深浅拷贝 深拷贝的实现 怎么获取js对象的自身属性 j
  • Android多个fragment懒加载的坑(卡顿)

    在Android开发中 有很多种情况都是viewpage fragment左右滑动进行布局的 例如下面的今日头条 在今日头条app上 我们可以看到 其顶部都是一栏的类型数据源 可滑动 可联动下面的viewpage里的fragment 但是很
  • django配置DJANGO_SETTINGS_MODULE

    DJANGO SETTINGS MODULE 使用Django时要通知Django当前使用的是哪个配置文件 可以改变环境变量 DJANGO SETTINGS MODULE 实现这一点 当我们使用manage py运行起本地的web服务器时
  • 常见的代码优化技术

    常见的代码优化技术有 复写传播 删除死代码 强度削弱 归纳变量删除 如果有同学有研究过这部分内容 并总结过 有更好的答案 请联系我删除本篇非原创解答 1 复写传播 a d e b d e c d e gt t d e a t b t c t
  • 专治疑难系列 - 解决win11中xbox开机自启问题

    博客主页 Passerby Wang的博客 CSDN博客 系统运维 云计算 Linux基础领域博主 所属专栏 专治疑难系列 上期文章 专治疑难系列 无法激活网络的解决方法 如觉得博主文章写的不错或对你有所帮助的话 还望大家多多支持呀 关注
  • RabbitMQ与KafKa区别

    在应用场景方面 RabbitMQ 遵循AMQP协议 由内在高并发的erlanng语言开发 用在实时的对可靠性要求比较高的消息传递上 kafka是Linkedin于2010年12月份开源的消息发布订阅系统 它主要用于处理活跃的流式数据 大数据
  • 中国知网html如何复制,中国知网如何快速导出参考文献的格式? 来看看吧

    写论文时 需要很多引文及注释 就需要把参考文献标注上 按照参考文献的引文格式一点一点整理很麻烦 涉及大量文献时费时费力 中国知网有快速导出参考文献格式的功能 可单个导出 也可以大量导出 方便实用 工具 材料 中国知网 论文 操作方法 01
  • idea彻底改java项目名(详细说明各个地方改名的作用)

    需求分析 要将手头的java项目文件夹改名 经常会出现以下问题 无法运行 只是改了别名 打war包 jar包的包名还是不变 解决方案 以下将项目名Easyfile改为驼峰命名的EasyFile 改项目名称 此时只改了别名 改文件夹名 解决编
  • Yolov3中Anchor box和confidence的理解(公式未编辑 待续....)

    Anchor box bounding box prior Anchor box原理解释 1 Anchor box其实就是从训练集的所有ground truth 中通过统计聚类的方法 k mean 得到常用的尺寸大小 比如 在某个训练集中最
  • MySQL有哪些锁

    这次 来说说 MySQL 的锁 主要是 Q A 的形式 看起来会比较轻松 在 MySQL 里 根据加锁的范围 可以分为全局锁 表级锁和行锁三类 全局锁 全局锁是怎么用的 要使用全局锁 则要执行这条命 flush tables with re
  • flutter 自定义组件-抽奖大转盘

    import dart async import dart math import dart ui as ui import dart ui import package demo widget luck luck entity dart