cairo填充_Cairo 图形指南 (5) —— 形状与填充

这一部分,讲述一些基本的以及较为高级的形状绘制及其纯色 (solid color)、图案 (pattern) 与渐变 (gradient) 填充方法。

基本形状

Cairo 提供了几个用于绘制基本形状的函数。

#include

#include

#include

static gboolean

on_expose_event (GtkWidget * widget,

GdkEventExpose * event, gpointer data)

{

cairo_t *cr;

cr = gdk_cairo_create (widget->window);

cairo_set_source_rgb (cr, 0, 0, 0);

cairo_set_line_width (cr, 1);

cairo_rectangle (cr, 20, 20, 120, 80);

cairo_rectangle (cr, 180, 20, 80, 80);

cairo_stroke_preserve (cr);

cairo_set_source_rgb (cr, 1, 1, 1);

cairo_fill (cr);

cairo_set_source_rgb (cr, 0, 0, 0);

cairo_arc (cr, 330, 60, 40, 0, 2 * M_PI);

cairo_stroke_preserve (cr);

cairo_set_source_rgb (cr, 1, 1, 1);

cairo_fill (cr);

cairo_set_source_rgb (cr, 0, 0, 0);

cairo_arc (cr, 90, 160, 40, M_PI / 4, M_PI);

cairo_close_path (cr);

cairo_stroke_preserve (cr);

cairo_set_source_rgb (cr, 1, 1, 1);

cairo_fill (cr);

cairo_set_source_rgb (cr, 0, 0, 0);

cairo_translate (cr, 220, 180);

cairo_scale (cr, 1, 0.7);

cairo_arc (cr, 0, 0, 50, 0, 2 * M_PI);

cairo_stroke_preserve (cr);

cairo_set_source_rgb (cr, 1, 1, 1);

cairo_fill (cr);

cairo_destroy (cr);

return FALSE;

}

int

main (int argc, char *argv[])

{

GtkWidget *window;

GtkWidget *darea;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

darea = gtk_drawing_area_new ();

gtk_container_add (GTK_CONTAINER (window), darea);

g_signal_connect (darea, "expose-event",

G_CALLBACK (on_expose_event), NULL);

g_signal_connect (window, "destroy",

G_CALLBACK (gtk_main_quit), NULL);

gtk_window_set_position (GTK_WINDOW (window),

GTK_WIN_POS_CENTER);

gtk_window_set_default_size (GTK_WINDOW (window), 390, 240);

gtk_widget_show_all (window);

gtk_main ();

return 0;

}

这个示例,绘制了矩形、正方形、圆、圆弧和椭圆。

下面对关键代码简单分析:

cairo_rectangle (cr, 20, 20, 120, 80);

cairo_rectangle (cr, 180, 20, 80, 80);

绘制矩形与正方形。正方形在 cairo 中是矩形的一种特例。

cairo_arc (cr, 330, 60, 40, 0, 2 * M_PI);

画了一个圆,圆心为 (330, 60)px,半径为 40px。Cairo 所谓的圆,其实是起始角为 0 度,终止角为 360 度的弧线。

cairo_scale (cr, 1, 0.7);

cairo_arc (cr, 0, 0, 50, 0, 2 * M_PI);

画椭圆的方法也与画圆类似,只是需要先设定长轴与短轴的比例,在本例中为 1:0.7。

复杂的图形

复杂的图形是由简单的图形拼凑出来的,譬如下面这个绘制圆角矩形的程序。

#include

#include

#include

static void

draw_round_rectangle (cairo_t * cr,

double x, double y,

double width, double height, double r)

{

cairo_move_to (cr, x + r, y);

cairo_line_to (cr, x + width - r, y);

cairo_move_to (cr, x + width, y + r);

cairo_line_to (cr, x + width, y + height - r);

cairo_move_to (cr, x + width - r, y + height);

cairo_line_to (cr, x + r, y + height);

cairo_move_to (cr, x, y + height - r);

cairo_line_to (cr, x, y + r);

cairo_arc (cr, x + r, y + r, r, M_PI, 3 * M_PI / 2.0);

cairo_arc (cr, x + width - r, y + r, r, 3 * M_PI / 2, 2 * M_PI);

cairo_arc (cr, x + width - r, y + height - r, r, 0, M_PI / 2);

cairo_arc (cr, x + r, y + height - r, r, M_PI / 2, M_PI);

}

static gboolean

on_expose_event (GtkWidget * widget,

GdkEventExpose * event, gpointer data)

{

cairo_t *cr;

int width, height;

double w, h, x, y, r;

gtk_window_get_size (GTK_WINDOW (widget), &width, &height);

x = width / 5.0;

y = height / 5.0;

w = 3 * width / 5.0;

h = 3 * height / 5.0;

r = h / 4.0;

cr = gdk_cairo_create (widget->window);

cairo_set_source_rgb (cr, 0.8, 0.4, 0);

cairo_set_line_width (cr, 6);

draw_round_rectangle (cr, x, y, w, h, r);

cairo_stroke_preserve (cr);

cairo_set_source_rgb (cr, 0.8, 0.8, 0.2);

cairo_fill (cr);

cairo_destroy (cr);

g_print ("test\n");

return FALSE;

}

static gboolean

on_configure_event (GtkWidget * widget,

GdkEventConfigure * event, gpointer data)

{

gdk_window_invalidate_rect (widget->window,

&widget->allocation,

FALSE);

return FALSE;

}

int

main (int argc, char *argv[])

{

GtkWidget *window;

GtkWidget *darea;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

g_signal_connect (window, "expose-event",

G_CALLBACK (on_expose_event), NULL);

g_signal_connect (window, "destroy",

G_CALLBACK (gtk_main_quit), NULL);

g_signal_connect(G_OBJECT(window), "configure-event",

G_CALLBACK(on_configure_event), NULL);

gtk_window_set_position (GTK_WINDOW (window),

GTK_WIN_POS_CENTER);

gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);

gtk_widget_set_app_paintable (window, TRUE);

gtk_widget_show_all (window);

gtk_main ();

return 0;

}

注:因为 "The cairo graphics tutorial" 在这一部分所提供的示例程序不具代表性,因此写了这个程序。

该示例程序绘制了一个可跟随窗口尺寸进行缩放变化的圆角矩形。

自定义的 draw_round_rectangle () 函数利用 Cairo 提供的基本图元函数,利用直线段与圆弧拼凑出圆角矩形。on_configure_event () 函数用于响应窗口尺寸变化事件,在其中调用 gdk_window_invalidate_rect () 函数让窗口绘图区域失效,并产生窗口重绘制事件(即 expose 事件)。

填充 (Fill)

虽然上一篇已经讲述了一些有关填充的知识,但这里所讲述的内容是与形状相关的。填充可分为三种类型:纯色、图案、渐变。

纯色 (Solid color)

对象的颜色是采用红 (R)、绿 (G)、蓝 (B) 三原色描述的,Cairo 的 RGB 取值是从 0 到 1 的双精浮点数。

#include

#include

static gboolean

on_expose_event (GtkWidget * widget,

GdkEventExpose * event, gpointer data)

{

cairo_t *cr;

cr = gdk_cairo_create (widget->window);

int width, height;

gtk_window_get_size (GTK_WINDOW (widget), &width, &height);

cairo_set_source_rgb (cr, 0.5, 0.5, 1);

cairo_rectangle (cr, 20, 20, 100, 100);

cairo_fill (cr);

cairo_set_source_rgb (cr, 0.6, 0.6, 0.6);

cairo_rectangle (cr, 150, 20, 100, 100);

cairo_fill (cr);

cairo_set_source_rgb (cr, 0, 0.3, 0);

cairo_rectangle (cr, 20, 140, 100, 100);

cairo_fill (cr);

cairo_set_source_rgb (cr, 1, 0, 0.5);

cairo_rectangle (cr, 150, 140, 100, 100);

cairo_fill (cr);

cairo_destroy (cr);

return FALSE;

}

int

main (int argc, char *argv[])

{

GtkWidget *window;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

g_signal_connect (G_OBJECT (window), "expose-event",

G_CALLBACK (on_expose_event), NULL);

g_signal_connect (G_OBJECT (window), "destroy",

G_CALLBACK (gtk_main_quit), NULL);

gtk_window_set_position (GTK_WINDOW (window),

GTK_WIN_POS_CENTER);

gtk_window_set_default_size (GTK_WINDOW (window), 270, 260);

gtk_window_set_title (GTK_WINDOW (window), "colors");

gtk_widget_set_app_paintable (window, TRUE);

gtk_widget_show_all (window);

gtk_main ();

return 0;

}

该示例绘制了 4 个正方形,分别采用四种不同颜色进行填充。这个例子,由于很简单,就不再像原作者那样自作多情的分析了。

图案 (Pattern)

所谓图案填充,就是将图片填充到形状内部。

#include

#include

#include

cairo_surface_t *surface1;

cairo_surface_t *surface2;

cairo_surface_t *surface3;

cairo_surface_t *surface4;

static void

create_surfaces ()

{

surface1 = cairo_image_surface_create_from_png ("blueweb.png");

surface2 = cairo_image_surface_create_from_png ("maple.png");

surface3 = cairo_image_surface_create_from_png ("crack.png");

surface4 =

cairo_image_surface_create_from_png ("chocolate.png");

}

static void

destroy_surfaces ()

{

g_print ("destroying surfaces");

cairo_surface_destroy (surface1);

cairo_surface_destroy (surface2);

cairo_surface_destroy (surface3);

cairo_surface_destroy (surface4);

}

static gboolean

on_expose_event (GtkWidget * widget,

GdkEventExpose * event, gpointer data)

{

cairo_t *cr;

cairo_pattern_t *pattern1;

cairo_pattern_t *pattern2;

cairo_pattern_t *pattern3;

cairo_pattern_t *pattern4;

cr = gdk_cairo_create (widget->window);

int width, height;

gtk_window_get_size (GTK_WINDOW (widget), &width, &height);

pattern1 = cairo_pattern_create_for_surface (surface1);

pattern2 = cairo_pattern_create_for_surface (surface2);

pattern3 = cairo_pattern_create_for_surface (surface3);

pattern4 = cairo_pattern_create_for_surface (surface4);

cairo_set_source (cr, pattern1);

cairo_pattern_set_extend (cairo_get_source (cr),

CAIRO_EXTEND_REPEAT);

cairo_rectangle (cr, 20, 20, 100, 100);

cairo_fill (cr);

cairo_set_source (cr, pattern2);

cairo_pattern_set_extend (cairo_get_source (cr),

CAIRO_EXTEND_REPEAT);

cairo_arc (cr, 200, 70, 50, 0, 2 * M_PI);

cairo_fill (cr);

cairo_set_source (cr, pattern3);

cairo_pattern_set_extend (cairo_get_source (cr),

CAIRO_EXTEND_REPEAT);

cairo_rectangle (cr, 20, 140, 100, 100);

cairo_fill (cr);

cairo_set_source (cr, pattern4);

cairo_pattern_set_extend (cairo_get_source (cr),

CAIRO_EXTEND_REPEAT);

cairo_rectangle (cr, 150, 140, 100, 100);

cairo_fill (cr);

cairo_pattern_destroy (pattern1);

cairo_pattern_destroy (pattern2);

cairo_pattern_destroy (pattern3);

cairo_pattern_destroy (pattern4);

cairo_destroy (cr);

return FALSE;

}

int

main (int argc, char *argv[])

{

GtkWidget *window;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

g_signal_connect (G_OBJECT (window), "expose-event",

G_CALLBACK (on_expose_event), NULL);

g_signal_connect (G_OBJECT (window), "destroy",

G_CALLBACK (gtk_main_quit), NULL);

create_surfaces ();

gtk_window_set_position (GTK_WINDOW (window),

GTK_WIN_POS_CENTER);

gtk_window_set_default_size (GTK_WINDOW (window), 270, 260);

gtk_window_set_title (GTK_WINDOW (window), "patterns");

gtk_widget_set_app_paintable (window, TRUE);

gtk_widget_show_all (window);

gtk_main ();

destroy_surfaces ();

return 0;

}

该示例,载入 4 张图片,分别填充至三个矩形与一个圆形内部区域。所使用的 4 幅图,均采用 GIMP 制作。程序中,图片的外观 (surface) 实在 on_expose_event () 函数中创建的,这并不是很妥当,因为窗口每次被重绘时,都需要从硬盘中读取图片。

pattern1 = cairo_pattern_create_for_surface (surface1);

由图片外观创建一个图案。

cairo_set_source (cr, pattern1);

cairo_pattern_set_extend (cairo_get_source (cr),

CAIRO_EXTEND_REPEAT);

cairo_rectangle (cr, 20, 20, 100, 100);

cairo_fill (cr);

这里,绘制第一个矩形。cairo_set_source () 函数通知 Cairo 环境,让它使用一份图案作为源 (source)。图片所形成的图案或许并不适合于形状,当使用 cairo_pattern_set_extend () 函数讲图案填充模式设为 CAIRO_EXTEND_REPEAT 时,可以让图案像瓦片那样填充于形状内部。cairo_rectangle () 函数创建一个矩形路径,cairo_fill () 函数将已经准备好的图案填充到矩形路径所构成的封闭区域中。

渐变 (Gradient)

在计算机图形学中,渐变是形状由明到暗或者从一种颜色向另一种颜色的平滑过度。在 2D 绘图与渲染程序中,渐变通常被用于创造多彩的背景与一些特效,比如光影的仿真。

#include

#include

static gboolean

on_expose_event (GtkWidget * widget,

GdkEventExpose * event, gpointer data)

{

cairo_t *cr;

cairo_pattern_t *pat1;

cairo_pattern_t *pat2;

cairo_pattern_t *pat3;

cr = gdk_cairo_create (widget->window);

pat1 = cairo_pattern_create_linear (0.0, 0.0, 350.0, 350.0);

gdouble j;

gint count = 1;

for (j = 0.1; j < 1; j += 0.1) {

if ((count % 2)) {

cairo_pattern_add_color_stop_rgb (pat1, j, 0, 0,

0);

} else {

cairo_pattern_add_color_stop_rgb (pat1, j, 1, 0,

0);

}

count++;

}

cairo_rectangle (cr, 20, 20, 300, 100);

cairo_set_source (cr, pat1);

cairo_fill (cr);

pat2 = cairo_pattern_create_linear (0.0, 0.0, 350.0, 0.0);

gdouble i;

count = 1;

for (i = 0.05; i < 0.95; i += 0.025) {

if ((count % 2)) {

cairo_pattern_add_color_stop_rgb (pat2, i, 0, 0,

0);

} else {

cairo_pattern_add_color_stop_rgb (pat2, i, 0, 0,

1);

}

count++;

}

cairo_rectangle (cr, 20, 140, 300, 100);

cairo_set_source (cr, pat2);

cairo_fill (cr);

pat3 = cairo_pattern_create_linear (20.0, 260.0, 20.0, 360.0);

cairo_pattern_add_color_stop_rgb (pat3, 0.1, 0, 0, 0);

cairo_pattern_add_color_stop_rgb (pat3, 0.5, 1, 1, 0);

cairo_pattern_add_color_stop_rgb (pat3, 0.9, 0, 0, 0);

cairo_rectangle (cr, 20, 260, 300, 100);

cairo_set_source (cr, pat3);

cairo_fill (cr);

cairo_pattern_destroy (pat1);

cairo_pattern_destroy (pat2);

cairo_pattern_destroy (pat3);

cairo_destroy (cr);

return FALSE;

}

int

main (int argc, char *argv[])

{

GtkWidget *window;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

g_signal_connect (G_OBJECT (window), "expose-event",

G_CALLBACK (on_expose_event), NULL);

g_signal_connect (G_OBJECT (window), "destroy",

G_CALLBACK (gtk_main_quit), NULL);

gtk_window_set_position (GTK_WINDOW (window),

GTK_WIN_POS_CENTER);

gtk_window_set_default_size (GTK_WINDOW (window), 340, 390);

gtk_window_set_title (GTK_WINDOW (window), "gradients");

gtk_widget_set_app_paintable (window, TRUE);

gtk_widget_show_all (window);

gtk_main ();

return 0;

}

在这一示例程序中,我们绘制了三个具有不同渐变风格的矩形。

pat3 = cairo_pattern_create_linear (20.0, 260.0, 20.0, 360.0);

这里,创建了一个线性渐变图案。参数设定了绘制渐变方向的直线,在示例中,它是一条竖线。

cairo_pattern_add_color_stop_rgb (pat3, 0.1, 0, 0, 0);

cairo_pattern_add_color_stop_rgb (pat3, 0.5, 1, 1, 0);

cairo_pattern_add_color_stop_rgb (pat3, 0.9, 0, 0, 0);

定义了渐变图案的断点。在示例中,渐变图案表现为黑色与黄色的过渡。通过添加两个黑色断点和一个黄色断点,就可以构成一个水平方向的渐变图案,颜色 的变化方向则是沿竖直方向。渐变图案从矩形的上端至下端,开始是黑色,到 1/10 宽度时,黑色便停止了,然后就是由黑色向黄色的渐变渲染;到达矩形中部时,黄色达到饱和状态。黄色断点会在 9/10 宽度处终止,最后的 1/10 又是黑色。

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

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

相关文章

java集合进行排序的两种方式

java集合的工具类Collections中提供了两种排序的方法,分别是: Collections.sort(List list)Collections.sort(List list,Comparator c) 第一种称为自然排序,参与排序的对象需实现comparable接口,重写其compareTo()方法,方法体中实现对象的比较大小规则,示例如下: 实体类:(基本…

ubuntu编写python脚本_python在ubuntu中的几种方法(小结)

通过ubuntu官方的apt工具包安装通过PPA(Personal Package Archive) 的apt工具包安装通过编译python源代码安装通过ubuntu官方的apt工具包安装安装完成后&#xff0c; 可以用下面的命令进行确认从PPA(Personal Package Archives) 安装apt工具包类似使用apt工具包安装python的工…

Java中String类中compareTo( )方法

compareTo方法是比较简单的&#xff0c;我们可以直接看其源码: 源码如下&#xff1a; public int compareTo(String anotherString) {int len1 value.length;int len2 anotherString.value.length;int lim Math.min(len1, len2);char v1[] value;char v2[] anotherString…

python elif可以单独使用_Python的elif语句怎么用

else和elif语句也可以叫做子句&#xff0c;因为它们不能独立使用&#xff0c;两者都是出现在if、for、while语句内部的。else子句可以增加一种选择&#xff1b;而elif子句则是需要检查更多条件时会被使用&#xff0c;与if和else一同使用&#xff0c;elif是else if 的简写。if和…

SpringMVC接收哪些类型参数参数

支持的数据类型&#xff1a; 基本类型参数&#xff1a; 包括基本类型和 String 类型 POJO 类型参数&#xff1a; 包括实体类&#xff0c;以及关联的实体类 数组和集合类型参数&#xff1a; 包括 List 结构和 Map 结构的集合&#xff08;包括数组&#xff09; SpringMVC …

禁用当前的账户win7_系统小技巧:服务客人 开启Windows 10来宾账户

出于安全考虑&#xff0c;Windows 10默认以管理员账户登录&#xff0c;没有开启来宾账户。但对于那些只需在电脑上浏览网页或收看电子邮件的用户&#xff0c;给他们开启来宾账户非常必要。来宾权限或账户的开启&#xff0c;可以通过下面的两种方法。1. 通过系统设置 开启来宾权…

Java之接口的静态方法的定义和使用

格式如下&#xff1a;&#xff08;就是将abstract或者default换成ststic即可&#xff0c;带上方法体&#xff09; public static 返回值类型 方法名称&#xff08;参数列表&#xff09;{方法体----}代码如下&#xff1a; //定义一个接口 public interface MyInterfaceStatic …

三阶魔方还原步骤图_三阶魔方公式图解、教程

三阶魔方公式、魔方图解、魔方教程&#xff0c;从零基础到精通&#xff01;魔方还原法 Rubics Cube Solution ————先看理论“魔方的还原方法很多精彩内容&#xff0c;尽在百度攻略&#xff1a;https://gl.baidu.com在这里向大家介绍一种比较简单的魔方六面还原方法。这种方…

通俗易懂告诉你CPU/GPU是什么?

通俗易懂告诉你CPU/GPU是什么&#xff1f; CPU CPU( Central Processing Unit, 中央处理器)就是机器的“大脑”&#xff0c;也是布局谋略、发号施令、控制行动的“总司令官”。 CPU的结构主要包括运算器&#xff08;ALU, Arithmetic and Logic Unit&#xff09;、控制单元&a…

mysql正在加载_mysql 数据库基本操作

CREATE TABLE classes(id INT PRIMARY KEY AUTO_INCREMENT COMMENT班级表id,name VARCHAR(20) COMMENT班级名称);运行DESCRIBE classes;--------------------------------------------------------| Field | Type | Null | Key | Default | Extra |---------------------------…

CPU和GPU的区别是什么?

CPU是一种微处理器&#xff0c;用于执行程序根据操作(如算术、逻辑、控制和输入-输出)给出的指令。相反&#xff0c;GPU最初设计用于在电脑游戏中渲染图像。CPU强调低延迟&#xff0c;而GPU则强调高吞吐量。 CPU Vs GPU 内容 比较表格定义区别关键不同结论 1. 比较表格 从上…

乌班图配置mysql Java_Ubuntu准备+MySQL+Java

Linux服务器准备1 . 安装Ubuntu系统2 . 修改root用户密码sudo passwd root #修改root账户密码logout # 退出当前账号并重新登录#如果需要关机使用 halt 命令3 . 更新所有Linux的开发包apt-get update4 . 配置相关的编译包apt-get install gcc libpcre3 libpcrecpp* libpcre3-de…

java截取指定字符串中的某段字符

利用字符串的substring函数来进行截取。 其中&#xff0c;substring函数有两个参数&#xff1a; 1、第一个参数是开始截取的字符位置。&#xff08;从0开始&#xff09; 2、第二个参数是结束字符的位置1。&#xff08;从0开始&#xff09; indexof函数的作用是查找该字符串中…

JSON中的JSON.parseArray()、JSON.parseObject()、JSON.tojsonString()

1、JSON.parseObject和JSON.toJSONString JSON.parseObject&#xff0c;是将Json字符串转化为相应的对象&#xff1b;JSON.toJSONString则是将对象转化为Json字符串。在前后台的传输过程中&#xff0c;JSON字符串是相当常用的&#xff0c;这里就不多介绍其功能了&#xff0c;直…

mysql是gplv3,Affero-GPL和GPLv3之间的区别

解决方案Assume the following:You are developing a server side application in GPL. Now this application serves HTML and not an executable which is directly executed on your machine. That means that another guy could take the GPL code, adapt it and does not …

mysql cluster proxy_GitHub - freedaxin/maya: a mysql cluster proxy powered by node.js

maya安装node.js依赖node v0.8最新版&#xff0c;暂不支持更高的node版本&#xff0c;此处以0.8.7版本为例。root安装(官方要求python2.5.2以上)tar -zxf node-v0.8.7.tar.gzcd node-v0.8.7./configure --prefix/usr/local/sinasrv2/makemake install在root环境变量中增加如下两…

常见HTTP状态码(200、301、302、500等)解说

对网站管理工作者来说有个词不陌生&#xff0c;HTTP状态码&#xff0c;它是用以表示网页服务器HTTP响应状态的3位数字代码。状态码的第一个数字代表了响应的五种状态之一。 1XX系列&#xff1a;指定客户端应相应的某些动作&#xff0c;代表请求已被接受&#xff0c;需要继续处…

linux c语言编写聊天室mysql_Linux平台上用C语言实现与MySQL数据库的连接

测试代码如下&#xff1a;//查询操作#include #include #include #define HOST "localhost"#define USERNAME "用户名"#define PASSWORD "密码"#define DATABASE "PublicResourcesDB"int main(void){MYSQL mysql;MYSQL_ROW row;MYSQL_…

java开发安装mysql_从零开始搭建Java开发环境第二篇:如何在windows10里安装MySQL

1 下载安装包1.1 压缩包[外链图片转存失败(img-oesO8K09-1566652568838)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw "点击并拖拽以移动")]1.2 安装包使用安装包安装则无需后续步骤[外链图片转存失败(img-Y3x59iO4-15666525…

java获取json中某个字段

import com.alibaba.fastjson.JSONObject; public class JsonTest {public static void main(String[] args) {// json串(以自己的为准)String str "{"id":"75","shoppingCartItemList":[{"id":"407","num"…