canvas 圆角矩形填充_一篇文章让你学会你最“害怕”的Canvas,太有意思了

Canvas画布
基本用法

<canvas id='canvas' width="150" height="150"></canvas> 

<canvas>看起来跟img标签有点像,唯一不同的是它没有src属性和alt属性。实际上,canvas标签只有两个属性:widthheight
如果没有设置宽度和高度,默认的canvas会初始化width:300px,height:150px

渲染上下文对象

canvas标签创造了一个固定大小的画布,它有一个或者多个渲染上下文对象,用它可以绘制和处理要展示的内容。接下来我们把注意力放在2D渲染上下文中。
canvas起初是空白的。为了展示,首先脚本需要找到渲染上下文,然后在它的上面绘制。canvas元素有一个叫做 getContext()的方法,这个方法是用来获得渲染上下文和它的绘画功能。getContext()只有一个参数,上下文的格式。

var canvas = document.getElementById('myCanvas');//获取绘画上下文对象
var ctx = canvas.getContext('2d'); 

打印结果:

4bbebcc4c0ed9157d9ab292c59d1d3b7.png


绘制形状

在这里你将学会如何绘制矩形、三角形、直线、圆弧和曲线。如果想绘制比较复杂的图形,我们需要掌握路径。

栅格(了解)

861247b6483808bb7f87a3dbe16a9e11.png

绘制矩形常用API

绘制一个填充的矩形

fillRect(x,y,width,height);

绘制一个矩形的边框

strokeRect(x, y, width, height) 

清除指定矩形区域,让清除部分完全透明。

 clearRect(x, y, width, height) 

上面提供的方法之中每个都包含了相同的参数。x和y指定了canvas画布上所绘制的矩形的左上角(相对于原点)的坐标。width和height设置矩形的尺寸。

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="myCanvas" width="300" height="300" style="border:1px solid #666;"></canvas><script type="text/javascript">var canvas = document.getElementById('myCanvas');var ctx = canvas.getContext('2d');ctx.fillRect(25, 25, 100, 100);ctx.clearRect(45, 45, 60, 60);ctx.strokeRect(50, 50, 50, 50);</script></body>
</html>

效果显示:

0efc09feb0c20a7860bab211e68c332c.png

填充颜色和描边颜色设置

var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
ctx.fillStyle = 'red';//填充颜色
ctx.strokeStyle = 'green';//描边颜色

使用路径绘制图形
图形的基本元素是路径。路径是通过不同颜色和宽度的线段或曲线相连形成的不同形状的点的集合。一个路径,甚至一个子路径,都是闭合的。使用路径绘制图形我们需要做以下几步。

  1. 创建路径起始点
  2. 使用画布的各种方法划出路径
  3. 然后把路径封闭
  4. 一旦路径生成,你就能通过描边或填充路径区域来渲染图形

绘制路径常用api
beginPath()

新建一条路径,生成之后,图形绘制api被指向到路径上生成路径。无参数

closePath()

闭合路径之后图形绘制api又重新指向了上下文中

stroke()

 通过线条来绘制图形轮廓

fill()

通过填充路径的内容区域生成实心的图形

moveTo(x,y)

:将画笔移动到指定的坐标x以及y上

当canvas初始化或者beginPath()调用后,你通常会使用moveTo()函数设置起点。我们也能够使用moveTo()绘制一些不连续的路径

lineTo(x,y)

:绘制直线,绘制一条从当前位置到指定x以及y位置的直线

该方法有两个参数:x以及y ,代表坐标系中直线结束的点。开始点和之前的绘制路径有关,之前路径的结束点就是接下来的开始点,等等。。。开始点也可以通过moveTo()函数改变。

看个例子:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="myCanvas" width="300" height="300" style="border:1px solid #666;"></canvas><script type="text/javascript">var canvas = document.getElementById('myCanvas');var ctx = canvas.getContext('2d');// 填充三角形ctx.beginPath();ctx.moveTo(25, 25);ctx.lineTo(105, 25);ctx.lineTo(25, 105);ctx.fill();// 描边三角形ctx.beginPath();ctx.moveTo(125, 125);ctx.lineTo(125, 45);ctx.lineTo(45, 125);ctx.closePath();ctx.stroke();</script></body>
</html>

效果展示:

2b8c79b2518b4b9d23f970340c298228.png

arc()

绘制圆弧或者圆

arc(x,y,radius,startAngle,endAngle,anticlockwise);

圆心在 (x, y) 位置,半径为 radius ,根据anticlockwise (默认为顺时针)指定的方向从 startAngle 开始绘制,到 endAngle 结束。
anticlockwise:可选的,布尔值,如果为true,逆时针绘制圆弧,反之,顺时针绘制笑脸例子

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="myCanvas" width="300" height="300" style="border:1px solid #666;"></canvas><script type="text/javascript">var canvas = document.getElementById('myCanvas');var ctx = canvas.getContext('2d');ctx.beginPath();ctx.arc(75, 75, 50, 0, Math.PI * 2, true); // 绘制ctx.moveTo(110, 75);ctx.arc(75, 75, 35, 0, Math.PI, false); // 口(顺时针)ctx.moveTo(65, 65);ctx.arc(60, 65, 5, 0, Math.PI * 2, true); // 左眼ctx.moveTo(95, 65);ctx.arc(90, 65, 5, 0, Math.PI * 2, true); // 右眼ctx.stroke();</script></body>
</html>

效果展示:

b3182455a838b17b240c0507afb1c37d.png

quadraticCurveTo(cp1x,cp1y,x,y)

绘制二次贝塞尔曲线,cp1x,cp1y为一个控制点,x,y为结束点

bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

绘制三次贝塞尔曲线,cp1x,cp1y为控制点一,cp2x,cp2y为控制点二,x,y为结束点。

看图:

a2eb46a6e24ae2f4edf89c4cc277ebe4.png

参数x、y在两个方法中都是结束点坐标。cp1x,cp1y为坐标的第一个控制点(上图中的红色点),cp2x,cp2y为坐标中的第二个控制点

二次贝赛尔曲线绘制对话气泡

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="myCanvas" width="300" height="300" style="border:1px solid #666;"></canvas><script type="text/javascript">var canvas = document.getElementById('myCanvas');var ctx = canvas.getContext('2d');ctx.beginPath();ctx.moveTo(75, 25);ctx.quadraticCurveTo(25, 25, 25, 62.5);ctx.quadraticCurveTo(25, 100, 50, 100);ctx.quadraticCurveTo(50, 120, 30, 125);ctx.quadraticCurveTo(60, 120, 65, 100);ctx.quadraticCurveTo(125, 100, 125, 62.5);ctx.quadraticCurveTo(125, 25, 75, 25);ctx.stroke();</script></body>
</html>

三次贝塞尔曲线绘制

//三次贝塞尔曲线 
ctx.beginPath(); 
ctx.moveTo(75,40); 
ctx.bezierCurveTo(75,37,70,25,50,25); 
ctx.bezierCurveTo(20,25,20,62.5,20,62.5); ctx.bezierCurveTo(20,80,40,102,75,120); ctx.bezierCurveTo(110,102,130,80,130,62.5); ctx.bezierCurveTo(130,62.5,130,25,100,25); 
ctx.bezierCurveTo(85,25,75,37,75,40); ctx.fill();

效果展示:

9ec02364afd7e580f871a418ddeece79.png

rect(x,y,width,height)

绘制矩形
注意:当你调用fill()函数时,所有没有闭合的形状都会自动闭合,所以你需要调用closePath()函数。但是调用stroke()时不会自动闭包

样式和颜色

  • fillStyle = color:设置图形的填充颜色
  • strokeStyle = color: 设置图形边框的颜色
  • globalAlpha :设置透明度值,取值范围为0~1之间的数值
  • lineWidth = value:设置线条宽度,数值无单位
  • lineCap = type 设置线段末端的样式
    • type:butt 默认值,方形
    • type:round 圆形
    • type:square 以方形结束,但是增加一个宽度和线段相同,宽度是线段宽度一半的矩形区域
  • lineJoin = type:设定线条和线条连接的样式
    • type:round 通过填充一个额外的,圆心在相连部分末端的扇形,绘制拐角的形状。 圆角的半径是线段的宽度。
    • type:bevel 在相连部分的末端填充一个额外的以三角形为底的区域, 每个部分都有各自独立的矩形拐角。
    • type: miter 通过延伸相连部分的外边缘,使其相交于一点,形成一个额外的菱形区域

绘制文本
canvas提供了两种方法来渲染文本

filleText(text,x,y,[,maxWidth])

在指定的(x,y)位置填充指定的文本,绘制的最大宽度是可选的strokeText(text,x,y,[,maxWidth])

在指定的(x,y)位置绘制文本边框,绘制的最大宽度是可选的

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="canvas" width="500" height="200" style="border: 1px solid #666;"></canvas><script type="text/javascript">var canvas = document.getElementById('canvas');var ctx = canvas.getContext('2d');// 设置字体大小和字体ctx.font = '30px 微软雅黑';ctx.fillText('hello world',50,50);ctx.strokeText('hello world',50,80);</script></body>
</html>

效果:

b1cda19aa197663a6c060e9be0a33644.png

有样式的文本

  • font = value

当前我们用来绘制文本的样式. 这个字符串使用和 CSS font属性相同的语法. 默认的字体是 10px sans-serif

  • textAlign = value

文本对齐选项. 可选的值包括:start, end, left, right or center. 默认值是 start

  • textBaseline = value

基线对齐选项. 可选的值包括:top, hanging, middle, alphabetic, ideographic, bottom。默认值是 alphabetic。

  • direction = value

文本方向。可能的值包括:ltr, rtl, inherit。默认值是 inherit。

使用图片
canvas更有意思的一项特性就是图像操作能力。可以用于动态的图像合成或者作为图形的背景,以及游戏界面(Sprites)等等。浏览器支持的任意格式的外部图片都可以使用,比如PNG、GIF或者JPEG。 你甚至可以将同一个页面中其他canvas元素生成的图片作为图片源。
引入图像到canvas里需要以下两步基本操作:

  1. 获得一个指向HTMLImageElement的对象或者另一个canvas元素的引用作为源,也可以通过提供一个URL的方式来使用图片
  2. 使用drawImage()函数将图片绘制到画布上

核心方法

drawImage(imgObj,x,y,width,height,dx,dy,dWith,dHeight)
其中imgObj是image或者canvas对象,x和y是在canvas里的起始坐标。后面两个参数是可选的,默认是当前画布设置的大小。这两个参数用来控制当前canvas缩放的大小。
如果是8个参数,用来控制做切片显示,前四个参数是定义图像源后的切片位置和大小,后四个参数是定义切片的目标显示的位置和大小

eeda387e24c5fb62bec6262cac8257f9.png

例子:一个简单的线图

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="canvas" width="500" height="500"></canvas><script type="text/javascript">var ctx = document.getElementById('canvas').getContext('2d');var img = new Image();img.onload = function() {ctx.drawImage(img, 0, 0);ctx.beginPath();ctx.moveTo(123, 400);ctx.lineTo(198, 350);ctx.lineTo(300, 200);ctx.lineTo(500, 150);ctx.stroke();}img.src = 'image-20190703114102416.png';</script></body>
</html>

效果展示:

99d00a6de686700742c673e02a211077.png

状态的保存和恢复

save()

保存画布的所有状态

restore()

save和restore方法是用来保存和恢复canvas状态的。都没有参数。

栗子:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="canvas" width="200" height="200"></canvas><script type="text/javascript">function draw(){var ctx = document.getElementById('canvas').getContext('2d');ctx.fillRect(0,0,150,150);//默认绘制一个矩形ctx.save();//保存当前状态ctx.fillStyle = 'red'; //在原有配置基础上对颜色发生改变ctx.fillRect(15,15,120,120);ctx.save();//保存当前状态ctx.fillStyle = 'green'; //再次改变颜色ctx.globalAlpha = 0.5; //改变透明度ctx.fillRect(30,30,90,90);//使用新的配置绘制一个矩形ctx.restore(); //重载之前的颜色状态 (红色)ctx.fillRect(45,45,60,60); //使用上一次的配置绘制一个矩形ctx.restore(); //加载默认的颜色配置ctx.fillRect(60,60,30,30); //使用默认配置绘制矩形}draw();</script></body>
</html>

效果展示:

e0d50a393936339c823baab2836d7e07.png

移动translate

translate(x,y)

translate方法接收两个参数。x是左右偏移量,y是上下偏移量。在做变形之前先保存状态是良好的一个习惯

栗子

function draw() {var ctx = document.getElementById('canvas').getContext('2d');for (var i = 0; i < 3; i++) {for (var j = 0; j < 3; j++) {ctx.save();ctx.fillStyle = 'rgb(' + (51 * i) + ', ' + (255 - 51 * i) + ', 255)';ctx.translate(10 + j * 50, 10 + i * 50);ctx.fillRect(0, 0, 25, 25);ctx.restore();}}
}

效果:

3864506a94c5b067a3459d13b223ae42.png


旋转rotate(angle)
只接受一个参数:选装的角度。顺时针方向
基本动画
如何通过canvas来制作动画呢?
步骤:

  1. 清空canvas
    通过clearReact()来清空canvas,保证自己的画布是干净的
  2. 保存canvas状态
  3. 绘制动画图形
  4. 恢复canvas状态

操控动画的方法setInterval(functuon,delay)
在设定好间隔时间后,function会定期执行setTimeout(function,delay)
在设定好的时间之后执行函数requestAnimationFrame(callback)
此方法一般每秒钟回到函数执行60次。告诉浏览器你希望执行一个动画,并在重绘之前,请求浏览器执行一个特定的函数来更新动画。做三个案例效果1.太阳系动画

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="canva" width="500" height="500"></canvas><script type="text/javascript">window.onload = function() {var sun = new Image();var moon = new Image();var earth = new Image();/* 初始化方法 */function init() {sun.src = "sun.png";moon.src = "moon.png";earth.src = "earth.png";window.requestAnimationFrame(draw);}function draw() {// 1.获取上下文var ctx = document.getElementById('canva').getContext('2d');ctx.globalCompositeOperation = 'destination-over';// 2.清空canvasctx.clearRect(0, 0, 500, 500);// 3.设置背景填充色和边框色ctx.fillStyle = "rgba(0,0,0,0.4)";ctx.strokeStyle = "rgba(0,153,255,0.4)";// 4.保存状态ctx.save();// 5.设置位移ctx.translate(150, 150);// 6.地球var time = new Date();// 6.1 地球选装ctx.rotate(((2 * Math.PI) / 60) * time.getSeconds() + ((2 * Math.PI) / 60000) * time.getMilliseconds());// 6.2 地球位移ctx.translate(105, 0);// 6.3 填充图形ctx.fillRect(0, -12, 50, 24); // Shadowctx.drawImage(earth, -12, -12);// Moonctx.save();ctx.rotate(((2 * Math.PI) / 6) * time.getSeconds() + ((2 * Math.PI) / 6000) * time.getMilliseconds());ctx.translate(0, 28.5);ctx.drawImage(moon,-2.5,-2.5);ctx.restore();ctx.restore();//恢复到初始的状态// 开始画圆ctx.beginPath();// 画圆ctx.arc(150, 150, 105, 0, Math.PI * 2, false); // Earth orbit// 描边ctx.stroke();ctx.drawImage(sun, 0, 0, 300, 300);window.requestAnimationFrame(draw);}init();}</script></body>
</html>

效果展示:

16b1fd4ca8669635017196864e43c478.png

高级动画

制作高级动画小球

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="canvas" width="600" height="300" style="border: 1px solid #000000;"></canvas><script type="text/javascript">var canvas = document.getElementById('canvas');var ctx = canvas.getContext('2d');var raf;var running = false;var ball = {x: 100, //x坐标y: 100, //y坐标vx: 5, //x轴方向步伐vy: 2, //y轴方向步伐radius: 25, //半径color: 'blue', //颜色drawBall: drawBall // 画的动作}// 画球的方法function drawBall() {ctx.beginPath();ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2, true);ctx.closePath();ctx.fillStyle = this.color;ctx.fill();}function clear() {ctx.fillStyle = 'rgb(255,255,255,0.3)';ctx.fillRect(0, 0, canvas.width, canvas.height);}function draw() {clear();// 之前用clearReact()方法来清除前一帧动画,换成filleReact()方法来实现长尾效果// ctx.clearRect(0, 0, canvas.width, canvas.height);ball.drawBall();ball.x += ball.vx;ball.y += ball.vy;// 处理边界if (ball.y + ball.vy > canvas.height || ball.y + ball.vy < 0) {ball.vy = -ball.vy;}if (ball.x + ball.vx > canvas.width || ball.x + ball.vx < 0) {ball.vx = -ball.vx;}raf = window.requestAnimationFrame(draw);}// canvas.addEventListener('mouseover', function() {//     raf = window.requestAnimationFrame(draw);// });canvas.addEventListener('mousemove', function(e) {if(!running){clear();ball.x = e.clientX;ball.y = e.clientY;ball.drawBall();}});canvas.addEventListener('click', function() {if(!running){window.requestAnimationFrame(draw);running = true;}});canvas.addEventListener('mouseout', function() {window.cancelAnimationFrame(raf);running = false;});ball.drawBall();</script></body>
</html>

效果显示:

e537d0e077216648d6b59ab5f4d45aab.png

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  1. 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  2. 私信后台回复【前端】有惊喜!
  3. 同时可以期待后续文章ing

我这里有前端进阶架构vip学习资料,包含内容有:HTML、css3、JavaScript、Vue,移动端web开发,Ajax、jQuery、canvas、等多个知识点。需要获取这些内容的朋友可以私信回复我“前端”两个字领取

e28416ff19b848cc4dcb961d3de109de.png

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

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

相关文章

abaqus单位_ANSYS和ABAQUS哪个好,一个例子告诉你

分别用ANSYS和ABAQUS来分析同一个题目并考察其异同点。【问题】一根悬臂梁&#xff0c;长200mm,截面是30mm*20mm的矩形(高度方向是20mm)。该梁左端固定&#xff0c;在其上面施加向下的分布力系&#xff0c;载荷集度是0.6Mpa.已知材料使用低碳钢&#xff0c;弹性模量是200GPA&am…

模型微调入门介绍一

备注&#xff1a;模型微调系列的博客部分内容来源于极客时间大模型微调训练营素材&#xff0c;撰写模型微调一系列博客&#xff0c;主要是期望把训练营的内容内化成自己的知识&#xff0c;我自己写的这一系列博客除了采纳部分训练营的内容外&#xff0c;还会扩展细化某些具体细…

npp夜光数据介绍 viirs_科研成果快报第177期:中国地区长时序AVHRR气溶胶数据的主要问题: 气溶胶反演频次与重污染天气...

中国地区长时序AVHRR气溶胶数据的主要问题&#xff1a;气溶胶反演频次与重污染天气A critical view of long-term AVHRR aerosol data record in China: Retrieval frequency and heavy pollution成果信息Minghui Tao, Rong Li, Lili Wang et al. (2020)A critical view of lon…

使用Eclipse创建一个Android程序方法

要编写Android程序&#xff0c;需要安装JDK、Eclipse和Android SDK。 Android SDK的安装路径不要在program file或program file(x86)下&#xff0c;否则在debug时会碰很奇怪的问题。最好直接放在C:\Android下。&#xff08;如果非要放在Program files下也可以&#xff0c;在ecl…

如何使用Hibernate批处理DELETE语句

介绍 在我以前的文章中 &#xff0c;我解释了批处理INSERT和UPDATE语句所需的Hibernate配置。 这篇文章将继续本主题的DELETE语句批处理。 领域模型实体 我们将从以下实体模型开始&#xff1a; Post实体与Comment具有一对多关联&#xff0c;并且与PostDetails实体具有一对一…

蓝点linux_新闻速读 gt; Windows 10 的 Linux 内核将像驱动程序一样由微软更新服务进行更新 | Linux 中国...

本文字数&#xff1a;3252&#xff0c;阅读时长大约&#xff1a;4 分钟导读&#xff1a;• Ubuntu 发行商 Canonical 将参加微软欧洲虚拟开源峰会 • 树莓派支持 Vulkan 最新进展&#xff1a;通过 70000 项测试 • 谷歌浏览器开始隐藏 URL 详细路径&#xff0c;未来地址栏将只显…

struts2-通配符和动态方法调用

通配符举例--BookAction 1 public class BookAction extends ActionSupport {2 3 public String execute() throws Exception {4 System.out.println("BookAction ********** execute()");5 return null;6 }7 /*8 * 显示图书添加页…

JavaFX技巧18:路径剪切

我最近注意到&#xff0c;我致力于ControlsFX项目的PopOver控件无法正确剪切其内容。 当我为FlexCalendarFX框架开发手风琴弹出窗口时&#xff0c;这一点变得显而易见。 每当最后一个标题窗格扩展时&#xff0c;其底角不再是圆角而是正方形。 在将红色矩形作为内容放置到标题窗…

关于erlang的套接字编程

套接字编程即熟悉的Socket编程&#xff0c;根据传输层协议&#xff0c;可分为&#xff1a;UDP协议和TCP协议.下面写一个简单的例子&#xff0c;再重新认识下它&#xff1a; 1.在同一主机节点下启动两个Erlang节点. a).在第一个Erlang节点下&#xff0c;打开端口为1234的UDP套接…

kotlin 添加第一个 集合_Flutter开发必学Dart语法篇之集合操作符函数与源码分析...

简述:在上一篇文章中&#xff0c;我们全面地分析了常用集合的使用以及集合部分源码的分析。那么这一节讲点更实用的内容&#xff0c;绝对可以提高你的Flutter开发效率的函数&#xff0c;那就是集合中常用的操作符函数。这次说的内容的比较简单就是怎么用&#xff0c;以及源码内…

在Java中确定文件类型

以编程方式确定文件的类型可能非常棘手&#xff0c;并且已经提出并实现了许多基于内容的文件标识方法。 Java中有几种可用于检测文件类型的实现&#xff0c;其中大多数很大程度上或完全基于文件的扩展名。 这篇文章介绍了Java中最常见的文件类型检测实现。 本文介绍了几种在Ja…

程序员编程艺术第十一章:最长公共子序列(LCS)问题

程序员编程艺术第十一章&#xff1a;最长公共子序列(LCS)问题 0、前言 程序员编程艺术系列重新开始创作了&#xff08;前十章&#xff0c;请参考程序员编程艺术第一~十章集锦与总结&#xff09;。回顾之前的前十章&#xff0c;有些代码是值得商榷的&#xff0c;因当时的代码只顾…

gateway 过滤器执行顺序_Gateway网关源码解析—路由(1.1)之RouteDefinitionLocator一览...

一、概述本文主要对 路由定义定位器 RouteDefinitionLocator 做整体的认识。在 《Spring-Cloud-Gateway 源码解析 —— 网关初始化》 中&#xff0c;我们看到路由相关的组件 RouteDefinitionLocator / RouteLocator 的初始化。涉及到的类比较多&#xff0c;我们用下图重新梳理下…

ERP开发中应用字符串解析实现界面翻译智能化

ERP中要实现界面多语言的功能&#xff0c;则要对各种情况的字符串进行处理并作出翻译。有些字符串的翻译是有规律可行的&#xff0c;遵循相应的模板模式&#xff0c;解析字符串&#xff0c;可以实现机器翻译的效果。 请看帐套数据库表的设计ADCOMP CREATE TABLE dbo.ADCOMP(REC…

参数详解 复制进程_如何优化PostgreSQL逻辑复制

How to Optimize PostgreSQL Logical Replication逻辑复制( Logical Replication )或 Pglogical 是表级别的复制。两者都是基于 WAL 的复制机制&#xff0c;允许在两个实例之间复制指定表的WAL 。这两个看起来让人迷惑&#xff0c;到底有什么区别呢&#xff1f; Logical Replic…

Android Studio使用说明

声明: 本博客文章原创类别的均为个人原创&#xff0c;版权所有。转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http://www.wjfxgame.com。 凌晨的Google I/O大会上&#xff0c;宣布了Android Studio&#xff0c;引起了现场开发者的一片欢呼。那么&#x…

有些窗口底部被任务栏挡住了_开始使用 Tint2 吧,一款 Linux 中的开源任务栏

Tint2 是我们在开源工具系列中的第 14 个工具&#xff0c;它将在 2019 年提高你的工作效率&#xff0c;能在任何窗口管理器中提供一致的用户体验。-- Kevin Sonney每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心&#xff0c;渴望开启新的一年&#xff0c;当然&#xff…

从jHiccup开始

写完“如何在生产中检测和诊断慢速代码”一文后&#xff0c;我受到读者的鼓励&#xff0c;尝试从Azul系统尝试jHiccup 。 去年&#xff0c;我参加了jHiccup的创建者Gil Tene的演讲&#xff0c;探讨了测量延迟的正确方法&#xff0c;其中&#xff0c;他向我们介绍了jHiccup。 它…

华为内部面试题库---(6)

1.在SMP体系结构中&#xff0c;中断亲和性是指将一个或者多个中断绑定到特定CPU core上运行&#xff0c;下列说法错误的是&#xff1a;A.每个硬件设备都会在/proc/irq下有个中断号命令的目录来标志中断亲和性B.IRQ#目录下smp_affinity文件&#xff0c;通过设置CPU位掩码&#x…

基元需要走吗?

我目前正在使用JSF作为视图技术&#xff0c;使用JPA作为持久层的企业应用程序。 它可能是支持bean或服务方法中的某种东西&#xff0c;但令我震惊&#xff1a;是否有充分的理由在企业应用程序中使用原语&#xff1f; 当我开始围绕J2SE 1.2使用Java进行编程&#xff08;或者是J…