HarmonyOS-Next开源三方库 MPChart:打造出色的图表体验

news2024/11/25 4:28:18

点击下载源码icon-default.png?t=N7T8https://download.csdn.net/download/liuhaikang/89228765

简介

随着移动应用的不断发展,数据可视化成为提高用户体验和数据交流的重要手段之一。在 OpenAtom OpenHarmony(简称“OpenHarmony”)应用开发中,一个强大而灵活的图表库是实现这一目标的关键。

在 ohpm 中心仓(OpenHarmony三方库中心仓)中,汇聚了众多开发者贡献的图表库,其中之一就是 MPChart。自其发布以来,MPChart 已被广泛应用于各类应用程序,它为开发者提供了丰富的功能和灵活性,使得创建各种类型的图表变得轻而易举。

效果图

特性与优势

  1. 多样的图表类型: MPChart 支持多种图表类型,从基本的折线图、柱状图、圆饼图、散点图到更复杂的蜡烛图、雷达图、瀑布图和组合图等,开发者可以根据项目需要选择最适合的图表类型。
  2. 高度可定制: 该库允许开发者通过代码自定义图表的外观和行为,从而实现个性化的设计,可以定制图表的颜色、字体、坐标轴样式等,以满足项目的 UI 需求。
  3. 动画效果: MPChart 内置了丰富的动画效果,使得图表的展示更加生动有趣。这不仅提升了用户体验,也使得数据的变化更加直观。

新版本使用说明

MPChart 在 2023 年 6 月 1 日推出了首个正式版 2.0.0,该版本主要利用 Path 和 Shape 组件实现了图表的绘制。而后,经过了多个版本的优化与迭代,在 2024 年 1 月 8 日,MPChart 迎来重大更新,发布了采用 Canvas 组件绘制的重构版本 3.0.0-rc.0,标志着 MPChart 库进入全新阶段。与先前版本相比,重构版本在细节处理和功能拓展上均进行了显著优化,同时要求 SDK 版本在 API10 以上。截至发稿前,MPChart 重构版本还处于 rc 版本阶段。

以下是 MPChart 重构版本新增和优化的一些功能:

  1. 图表支持按百分比设置宽高尺寸;且当图表尺寸调整时,能够自动重绘以适配新的大小,确保内容的准确展示。
BarChart({ model: this.model })
          .width('100%')
          .height('70%')
  1. 新增图表横向滚动功能,使得宽幅数据图表得以部分显示。用户仅需滑动屏幕便可逐步浏览全部信息。该功能不仅提升了信息的细节展示,还扩大了可视内容的范围。
  2. 新增了对自定义点击、长按、双击、拖拽等事件的支持。用户可以设置监听器监听这些交互,并且支持引入自定义组件以响应这些动作。
  3. 对组合图进行了扩展,新增设置瀑布图的支持。
  4. 对手势缩放以及双击缩放的交互进行了优化,提高了操作的流畅性。
  5. 提供了更加简化的使用体验,使用时需要定义的代码量更少。

这些改进使得 MPChart 更加易用且功能丰富,满足了用户对高效图表工具的需求。

因代码重构,MPChart 2.7.0 及以下版本(以下简称”2.7 版本“)使用的方法和 MPChart 3.0.0-rc.0 及以上版本(以下检查”3.0 版本”)略有不同,接下来分别介绍使用方法。

一、 创建图表对象

首先需要创建一个 model 对象,用来承载图表数据。

1)3.0 版本

this.model = new LineChartModel();

2)2.7 版本

2.7 版本需要在创建 model 对象并且传入数据后调用 init 方法进行初始化。

this.model = new LineChartModel();
//省略传入数据代码
model.init();

二、 设置图表数据

1)3.0 版本

// 创建一个 JArrayList 对象,用于存储 EntryOhos 类型的数据
let values: JArrayList<EntryOhos> = new JArrayList<EntryOhos>();

// 循环生成 1 到 20 的随机数据,并添加到 values 中
for (let i = 1; i <= 20; i++) {
  values.add(new EntryOhos(i, Math.random() * 100));
}

// 创建 LineDataSet 对象,使用 values 数据,并设置数据集的名称为 'DataSet'
let dataSet = new LineDataSet(values, 'DataSet');

let dataSetList: JArrayList<ILineDataSet> = new JArrayList<ILineDataSet>();
dataSetList.add(dataSet);
// 创建 LineData 对象,使用 dataSetList数据,并将其传递给model
let lineData: LineData = new LineData(dataSetList);
this.model.setData(lineData);

使用 JArrayList 存储 EntryOhos 类型的数据,然后通过 LineDataSet 和 LineData 对象来设置图表的数据集。最后,将数据传递给 model。在 2.7 版本中,需要将最后一行的 setData 方法替换为 setLineData 方法,即 this.model.setLineData(lineData)。

三、 引入图表组件

在页面布局中引入 LineChart 组件,可通过属性设置图表的宽高,背景色等。

1)3.0 版本

LineChart({ model: this.model })
          .width('100%')
          .height('100%')
          .backgroundColor(Color.White)

2)2.7 版本

2.7 版本不支持通过组件.width 和.height 设置宽高属性,而是通过 model 的 setWidth()和 setHeight()方法设置宽高,并且不能设置百分比宽高,只能设置固定的数值宽高。

aboutToAppear() {
    //...
    this.model.setWidth(300);
    this.model.setHeight(300);
    this.model.init();
}
LineChart({ lineChartModel: $model })

通过以上三步即可创建一个基础的 LineChart,效果图如下:

3.0 版本的页面完整代码如下:

import {
JArrayList,EntryOhos,LineDataSet,ILineDataSet,LineData,LineChart,LineChartModel,
} from '@ohos/mpchart';

@Entry
@Component
struct Index {
  private model: LineChartModel = new LineChartModel();

  aboutToAppear() {
    // 创建一个 JArrayList 对象,用于存储 EntryOhos 类型的数据
    let values: JArrayList<EntryOhos> = new JArrayList<EntryOhos>();
    // 循环生成 1 到 20 的随机数据,并添加到 values 中
    for (let i = 1; i <= 20; i++) {
      values.add(new EntryOhos(i, Math.random() * 100));
    }
    // 创建 LineDataSet 对象,使用 values 数据,并设置数据集的名称为 'DataSet'
    let dataSet = new LineDataSet(values, 'DataSet');

    let dataSetList: JArrayList<ILineDataSet> = new JArrayList<ILineDataSet>();
    dataSetList.add(dataSet);
    // 创建 LineData 对象,使用 dataSetList数据,并将其传递给model
    let lineData: LineData = new LineData(dataSetList);
    this.model?.setData(lineData);
  }

  build() {
    Column() {
      LineChart({ model: this.model })
        .width('100%')
        .height('100%')
        .backgroundColor(Color.White)
    }
  }
}

2.7 版本的页面完整代码如下:

import {
  LineChart,LineChartModel,XAxis,XAxisPosition,YAxis,
  AxisDependency,YAxisLabelPosition,LineData,LineDataSet,EntryOhos,JArrayList,ILineDataSet
} from '@ohos/mpchart'

@Entry
@Component
struct Basic {
  topAxis: XAxis = new XAxis(); //顶部X轴
  bottomAxis: XAxis = new XAxis(); //底部X轴
  mWidth: number = 350; //表的宽度
  mHeight: number = 300; //表的高度
  leftAxis: YAxis | null = null;
  rightAxis: YAxis | null = null;
  lineData: LineData | null = null;
  @State
  lineChartModel: LineChartModel = new LineChartModel();
  titleSelcetString: string = 'X'

  public aboutToAppear() {
    this.lineData = this.initCurveData(30, 180);

    this.topAxis.setLabelCount(4, false);
    this.topAxis.setPosition(XAxisPosition.TOP);
    this.topAxis.setAxisMinimum(11);
    this.topAxis.setAxisMaximum(44);

    this.bottomAxis.setLabelCount(4, false);
    this.bottomAxis.setPosition(XAxisPosition.BOTTOM);
    this.bottomAxis.setAxisMinimum(11);
    this.bottomAxis.setAxisMaximum(44);

    this.leftAxis = new YAxis(AxisDependency.LEFT);
    this.leftAxis.setLabelCount(10, false);
    this.leftAxis.setPosition(YAxisLabelPosition.OUTSIDE_CHART);
    this.leftAxis.setAxisMinimum(10);
    this.leftAxis.setAxisMaximum(200);

    this.rightAxis = new YAxis(AxisDependency.RIGHT);
    this.rightAxis.setDrawGridLines(false);
    this.rightAxis.setLabelCount(10, false);
    this.rightAxis.setAxisMinimum(10); // this replaces setStartAtZero(true)
    this.rightAxis.setAxisMaximum(200);

    this.leftAxis.setDrawLimitLinesBehindData(true);

    this.lineChartModel.setTopAxis(this.topAxis);
    this.lineChartModel.setBottomAxis(this.bottomAxis);
    this.lineChartModel.setWidth(this.mWidth);
    this.lineChartModel.setHeight(this.mHeight);
    if (this.leftAxis) {
      this.lineChartModel.setLeftAxis(this.leftAxis);
    }
    if (this.rightAxis) {
      this.lineChartModel.setRightAxis(this.rightAxis);
    }
    if (this.lineData) {
      this.lineChartModel.setLineData(this.lineData);
    }
    this.lineChartModel.init();
  }

  /**
   * 初始化数据
   * @param count  曲线图点的个数
   * @param range  y轴范围
   */
  private initCurveData(count: number, range: number): LineData {

    let values = new JArrayList<EntryOhos>();

    for (let i = 0; i < count; i++) {
      let val: number = Math.random() * range;
      values.add(new EntryOhos(i, val));
    }

    let dataSet = new JArrayList<ILineDataSet>();

    let set1 = new LineDataSet(values, "DataSet 1");
    dataSet.add(set1);

    return new LineData(dataSet)
  }

  build() {
    Column() {
      Stack({ alignContent: Alignment.TopStart }) {
        LineChart({ lineChartModel: $lineChartModel })
      }
    }
  }
}

除了基本设置之外,我们还可以进行图表的其他个性化设置,接下来介绍图表的个性化设置。

四、 个性化设置

1、 XY 轴的绘制

1)3.0 版本

3.0 版本中可以通过如下代码获取到 x 轴/y 轴对象。

//获取x轴
let xAxis = model.getXAxis();
//获取左y轴
let leftAxis = model.getAxisLeft();
//获取右y轴
let rightAxis = model.getAxisRight();

2)2.7 版本

2.7 版本可以通过如下代码设置 x 轴/y 轴对象。

//x轴
let topAxis = new XAxis();
//...省略设置属性方法
topAxis.setPosition(XAxisPosition.TOP);

//左y轴
let leftAxis = new YAxis(AxisDependency.LEFT);
//...省略设置属性方法
this.lineChartModel.setLeftAxis(leftAxis);

//右y轴
let rightAxis = new YAxis(AxisDependency.RIGHT);
//...省略设置属性方法
this.lineChartModel.setRightAxis(rightAxis);

获取 x 轴和左右 y 轴对象之后,可以调用以下方法设置它们的属性,在 3.0 版本和 2.7 版本中都可使用。

x 轴/y 轴都可设置:


             ● setEnabled(enabled: boolean):设置轴是否被绘制。默认绘制,设置为false则不会被绘制。

             ● setDrawLabels(enabled: boolean):设置为true绘制轴的标签。

             ● setDrawAxisLine(enabled: boolean): 设置为true绘制轴线。

             ● setDrawGridLines(enabled: boolean): 设置为true绘制网格线。

             ● setTextColor(color: string | number | CanvasGradient | CanvasPattern): 设置轴标签文本颜色。

             ● setTextSize(size: number):设置轴标签的字体大小。
             ● setTypeface(tf: FontFamily):设置轴标签的FontFamily,指定字体系列,支持如下几种类型:'sans-serif', 'serif', 'monospace'。
             ● setGridColor(color: number): 设置网格线颜色。

             ● setGridLineWidth(width: number):设置网格线宽度。

             ● setAxisLineColor(color: number):设置此轴的坐标轴的颜色。

             ● setAxisLineWidth(width: number): 设置此轴的坐标轴的宽度。

             ● enableGridDashedLine(lineLength: number, spaceLength: number, phase: number): 显示网格线虚线模式,"lineLength"控制短线条的长度,"spaceLength"控制两段线之间的间隔长度,"phase"控制开始的点。

             ● setAxisMaxValue(max: number):设置一个自定义的最大值,如果设置了数值,这个值将不会依赖于提供的数据自动计算。

             ● setAxisMinValue(min: number): 设置一个自定义的最小值。如果设置了数值,这个值将不会依赖于提供的数据进行自动计算。

x 轴专属设置:

             ● setAvoidFirstLastClipping(enabled: boolean):如果设置为true,图表将避免在图表或屏幕的边缘的标签条目被裁剪掉。

             ● setPosition(pos: XAxisPosition):设置XAxis应该出现的位置。可以选择TOP,BOTTOM,BOTH\_SIDED,TOP\_INSIDE或者BOTTOM\_INSIDE。

y 轴专属设置:

             ● setInverted(enabled: boolean): 如果设置为true,这个轴将被反向,那意味着最大值将被放到底部,最小值将被放到顶部。

             ● setSpaceTop(percent: number):设置在图表上最高处的值相比轴上最高值的顶端空间(占总轴范围的百分比)。

             ● setSpaceBottom(percent: number): 设置在图表上最低处的值相比轴上最低处值的底部空间(总轴范围的百分比)。

             ● setPosition(pos: YAxisLabelPosition):设置轴标签应该被绘制的位置。INSIDE\_CHART或者OUTSIDE\_CHART中的一个。 

2、 图表交互设置

图表 model 对象可调用以下方法进行图表交互个性化设置:

             ● setTouchEnabled( enabled: boolean): 允许打开或者关闭与图表的所有触摸交互的情况。

             ● setDragEnabled( enabled: boolean): 打开或关闭对图表的拖动。

             ● setScaleEnabled(enabled: boolean):打开或关闭对图表所有轴的的缩放。

             ● setScaleXEnabled(enabled: boolean): 打开或关闭x轴的缩放

             ● setScaleYEnabled(enabled: boolean): 打开或关闭y轴的缩放。

             ● setPinchZoom(enabled: boolean): 如果设置为true,手势捏合缩放被打开。如果设置为false,x和y轴可以被手势捏合缩放。

             ● setHighlightPerTapEnabled(enabled: boolean): 如果设置为true,在图表中选中触发高亮效果。

             ● setHighlightPerDragEnabled(enabled: boolean): 设置为true时允许在手指滑动结束时显示高亮效果。默认:true

             ● setHighlightIndicatorEnabled(enabled: boolean): 如果设置为true, 选中数据时,将展示指标线。

             ● 此方法为dataset设置:setVisibleXRangeMaximum(maxXRange: number):设置x轴最多显示数据条数,(要在设置数据源后调用,否则是无效的)

3、 颜色设置

  1. 数据集颜色设置

针对某个数据集,可以使用 dataSet.setColor(color:number) 方法来设置其颜色。例如,在折线图中:

this.dataSet.setColorByColor(Color.Blue); //设置折线的颜色为蓝色
  1. 渐变颜色设置

对于一些图表元素,可以使用渐变颜色。可以通过 dataSet.setGradientFillColor() 方法来实现。这通常用于折线图的填充色效果。

let gradientFillColor = new JArrayList<ChartColorStop>();
gradientFillColor.add(["#0C0099CC", 0.2]);
gradientFillColor.add(["#7F0099CC", 0.4]);
gradientFillColor.add(["#0099CC", 1.0]);
this.dataSet.setGradientFillColor(gradientFillColor);
  1. 多种颜色设置

如果想为数据点设置不同的颜色,可以通过设置 dataSet.setColorsByVariable(colors: number[]) 方法,传入一个颜色列表。

dataSet.setColorsByVariable([
ColorTemplate.colorRgb(192, 255, 140), 
ColorTemplate.colorRgb(255, 247, 140), 
ColorTemplate.colorRgb(255, 208, 140)]);

4、 自定义坐标轴标签

如果不想用坐标轴本身的阿拉伯数字标签,也可以自定义坐标轴标签,实现方法是通过创建自定义类实现 IAxisValueFormatter 接口,修改其中的 getFormattedValue 方法,最后调用坐标轴对象的 setValueFormatter 方法就可以实现自定义坐标轴标签,3.0 和 2.7 版本代码相同,如下所示:

class MyAxisValueFormatter implements IAxisValueFormatter {
  getFormattedValue(value: number, axis: AxisBase): string {
    let mmdd = new Date().toDateString().split(' ')
    let day = Number(mmdd[2]) + value / 20
    let hours = new Date().getHours() + value / 20
    console.log('lz getFormattedValue value:' + value)
    return day + ' ' + mmdd[1] + ' ' + hours
  }
}
...
this.topAxis.setValueFormatter(new TopAxisValueFormatter())

实现效果如图所示:

五、 MPChart 常见问题

1 . 如何隐藏 Y 轴线

this.model.getAxisLeft().setEnabled(false) //隐藏左边Y轴轴线,此时标签数字也隐藏

如果想隐藏轴线但是想显示数字标签:

this.model.getAxisRight().setDrawAxisLine(false);

2 . 如何控制 Y 轴线数据标签个数

this.model.getAxisLeft().setLabelCount(8, false);//设置了8个

3 . 如何设置轴线颜色,宽度等信息

let leftAxis = this.model.getAxisLeft();
leftAxis.setPosition(YAxisLabelPosition.OUTSIDE_CHART);//显示轴线在图表内部则使用INSIDE_CHART
this.leftAxis.setAxisLineColor(ColorTemplate.rgb("#ff0000"));//设置轴线颜色
leftAxis.setAxisLineWidth(1);// 设置轴线宽度
leftAxis.setTextSize(20);//设置y轴标签字体大小
leftAxis.setDrawGridLines(true);//设置显示网格线

下载安装

下载和安装 MPChart 可以通过以下命令完成:

ohpm install @ohos/mpchart

OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包

源码链接

如果您对 MPChart 的源代码感兴趣,可以在以下链接找到它的源码:

OpenHarmony-SIG/ohos-MPChart,请随时查阅这些资源,以获取关于 MPChart 的更多信息和详细说明。如果大家对 OpenHarmony 开源三方库有更多的诉求和问题,欢迎在 OpenHarmony 开发者论坛三方库专区一起研讨:标签 - JS/ArkTS三方库 OpenHarmony开发者论坛

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

边缘计算在视频监控领域的应用

一、边缘计算在视频监控领域的应用 运用边缘计算解决视频监控问题&#xff0c;可以带来许多优势。以下是一些具体的应用示例&#xff1a; 实时分析与处理&#xff1a;在视频监控系统中&#xff0c;边缘计算盒子可以实时处理和分析视频流&#xff0c;实现对监控画面的智能识别…

2024电子、电路与控制工程国际学术会议(IACECIE2024)

2024电子、电路与控制工程国际学术会议&#xff08;IACECIE2024) 会议简介 2024年国际电子、电路与控制工程学术会议&#xff08;IACCECIE2024&#xff09;将于2024年在重庆隆重举行。本次会议汇集了来自全球电子、电路和控制工程领域的杰出学者、研究人员和行业代表&#…

底层逻辑(1) 是非对错

底层逻辑(1) 是非对错 关于本书 这本书的副标题叫做&#xff1a;看清这个世界的底牌。让我想起电影《教父》中的一句名言&#xff1a;花半秒钟就看透事物本质的人&#xff0c;和花一辈子都看不清事物本质的人&#xff0c;注定是截然不同的命运。 如果你看过梅多丝的《系统之美…

Power BI数据刷新 - 网关 数据源凭据详解

众所周知&#xff0c;如果在Power BI云服务中设置数据源自动刷新&#xff0c;有两种方式供你选择, 分别是&#xff1a; Gateway and cloud connections&#xff08;网关和云连接&#xff09;&#xff1b;Data Source Credentials&#xff08;数据源凭据&#xff09;&#xff1…

Linux——NFS网络文件系统

在生产环境中共享宿主目录可以用于集中管理账户 一、存储设备 DAS 是直连存储相当于移动硬盘 NAS 是网络文件系统&#xff0c;挂载后可以直接访问 SAN 存储区域网络 IPSAN 网线连接 共享的是设备&#xff0c;需要挂载后分区使用 FCSAN 光纤连接 二、服务的管理 1、安…

如何在PostgreSQL中创建一个新的数据库,并指定所有者?

文章目录 解决方案示例代码 PostgreSQL是一个强大的开源关系型数据库管理系统&#xff0c;它允许用户创建和管理多个数据库。在PostgreSQL中创建一个新的数据库并指定所有者是一个常见的操作。下面&#xff0c;我们将详细解释如何执行这一操作&#xff0c;并提供示例代码。 解…

OpenHarmony鸿蒙南向开发案例:【智能加湿器】

样例简介 智能加湿器具有实时监控其所处环境温度、湿度&#xff0c;并通过数字管家设置日程&#xff0c;自动打开加湿器控制湿度功能。显示界面使用DevEco Studio 编写的js应用&#xff0c;具有很好的兼容和移植特性。硬件上采用了带有HDF框架的驱动模型&#xff0c;通过GPIO和…

信号带宽和上升沿时间

我们在抽取高速信号的S参数时避不开的一个环节是设置仿真带宽,经常听到有人讲要设置基频(奈奎斯特频率)的4倍or 5倍带宽,如果是这样,就有一个问题:如果是56Gbps的NRZ信号,那仿真带宽真要设置到100G以上吗?这么宽的带宽,计算时间和所耗费的资源可想而知!第二个常见的问…

【Win】PsPing:深入网络性能测试与故障排查

在维护 Azure 虚拟机的过程中&#xff0c;可能会遇到一些网络连通性的问题。例如&#xff0c;当您尝试从个人 PC 上 ping 虚拟机的公网 IP 地址时&#xff0c;可能会发现出现 “Request time out” 的信息&#xff0c;导致无法 ping 通。这种情况的发生&#xff0c;通常是因为在…

python基础之元组、集合和函数的定义与返回值

1.元祖 1.元祖的定义 元组的数据结构跟列表相似 特征&#xff1a;有序、 有序&#xff1a;有&#xff08;索引/下标/index&#xff09; 正序、反序标识符&#xff1a; ( ) 里面的元素是用英文格式的逗号分割开来关键字&#xff1a;tuple 列表和元组有什么区别&#xff1f; 元组…

Golang操作Redis

一. Redis介绍 1.1 简介 Redis是完全开源免费的&#xff0c;遵循BSD协议&#xff0c;是一个高性能的key-value数据库。 Redis与其它的key-value缓存产品有以下三个特点&#xff1a; Redis支持数据持久化&#xff0c;可以见内存中的数据报错在磁盘中&#xff0c;重启的时候可以…

OpenHarmony实战开发-按钮 (Button)

Button是按钮组件&#xff0c;通常用于响应用户的点击操作&#xff0c;其类型包括胶囊按钮、圆形按钮、普通按钮。Button做为容器使用时可以通过添加子组件实现包含文字、图片等元素的按钮。具体用法请参考Button。 创建按钮 Button通过调用接口来创建&#xff0c;接口调用有…

APISix如何配置gzip压缩、cache、跨域

网上查到的apisix的配置很多都很古老&#xff0c;要改配置文件。其实现在apisix都是使用插件方式实现各种配置&#xff0c;很方便。这里简单介绍下三个常用插件、gzip压缩、cache缓存和跨域插件。这里均使用apisix的Dashboard看板进行配置。 gzip压缩 1. 打开apisix看板&#…

Web-SpringBootWen

创建项目 后面因为报错&#xff0c;所以我把jdk修改成22&#xff0c;仅供参考。 定义类&#xff0c;创建方法 package com.start.springbootstart.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotati…

单细胞+RIP-seq项目文章| Cell ReportshnRNPU蛋白在小鼠精原干细胞池建立的关键作用

精原干细胞&#xff08;SSCs&#xff09;是负责精子发生的干细胞&#xff0c;具有自我更新和分化产生功能性精子的能力。SSCs的持续再生对于维持雄性生育力至关重要。然而&#xff0c;SSC池的发育起源尚不清楚。在哺乳动物中&#xff0c;SSCs源自名为 prospermatogonia&#xf…

基于JAVA实现的贪吃蛇小游戏

JAVA贪吃蛇小游戏实现: 贪吃蛇曾经在我们的童年给我们带来了很多乐趣。贪吃蛇这款游戏现在基本上没人玩了&#xff0c;甚至在新一代人的印象中都已毫无记忆了。。。但是&#xff0c;这款游戏可以在一定程度上锻炼自己的编程能力。 目前这个版本只是一个测试版本&#xff0c;所以…

AI:162-如何使用Python进行图像识别与处理深度学习与卷积神经网络的应用

本文收录于专栏:精通AI实战千例专栏合集 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 每一个案例都附带关键代码,详细讲解供大家学习,希望可以帮到大家。正在不断更新中~ 一.如何使用Python进行图像识别与处理…

在Windows 10中如何关闭BitLocker加密?这里提供详细步骤

序言 BitLocker加密将有助于保持卷或闪存驱动器处于安全模式。但是&#xff0c;如果你不再需要BitLocker加密&#xff0c;你可以在Windows 10计算机上轻松删除BitLocker加密。在这里&#xff0c;我们将向你展示在Windows 10上删除/禁用BitLocker驱动器加密的四种方法。 通过控…

Qt/C++音视频开发71-指定mjpeg/h264格式采集本地摄像头/存储文件到mp4/设备推流/采集推流

一、前言 用ffmpeg采集本地摄像头&#xff0c;如果不指定格式的话&#xff0c;默认小分辨率比如640x480使用rawvideo格式&#xff0c;大分辨率比如1280x720使用mjpeg格式&#xff0c;当然前提是这个摄像头设备要支持这些格式。目前市面上有一些厂家做的本地设备支持264格式&am…

1688获得店铺所有商品API接口技术解析与应用实践

在电商领域&#xff0c;快速获取店铺所有商品信息对于商家和开发者来说至关重要。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富的API接口供开发者使用&#xff0c;其中获得店铺所有商品API接口是其中之一。本文将深入解析该API接口的技术实现&#xff0c;并探讨其在实…