本文内容与路径([js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解)是canvas中比较重要的概念。掌握理解他们是做出复杂canvas动画必要的基础之一.

再谈clip函数,这个函数在这篇文章[js高手之路] html5 canvas系列教程 - 图片操作(drawImage,clip,createPattern)已经有讲到过他的基本用法,我们来两个简单的例子复习一下:

 <meta charset='utf-8' />
<style>
#canvas,#canvas2{
border:1px dashed #aaa;
}
</style>
<script>
window.onload = function(){
var oCanvas = document.querySelector( "#canvas" ),
oGc = oCanvas.getContext( '2d' );
var oCanvas2 = document.querySelector( "#canvas2" ),
oGc2 = oCanvas2.getContext( '2d' ); oGc.beginPath();
oGc.strokeStyle = '#09f';
oGc.arc( 100, 100, 100, 0, 360 * Math.PI / 180, false );
oGc.stroke();
oGc.closePath(); oGc.clip(); oGc.beginPath();
oGc.fillStyle = 'red';
oGc.fillRect( 100, 100, 200, 100 );
oGc.closePath(); oGc2.beginPath();
oGc2.strokeStyle = '#09f';
oGc2.rect( 0, 0, 100, 100 );
oGc2.stroke();
oGc2.closePath(); oGc2.clip(); oGc2.beginPath();
oGc2.fillStyle = 'red';
oGc2.arc( 100, 100, 100, 0, 360 * Math.PI / 180, false );
oGc2.fill();
oGc2.closePath();
}
</script>
</head>
<body>
<canvas id="canvas" width="500" height="400"></canvas>
<canvas id="canvas2" width="500" height="400"></canvas>
</body>

请注意,如果用矩形作为裁剪区域,用使用rect,不能使用strokeRect和fillRect,即下面这段代码不能改成strokeRect或者fillRect

oGc2.beginPath();
oGc2.strokeStyle = '#09f';
oGc2.rect( 0, 0, 100, 100 );
oGc2.stroke();
oGc2.closePath();
如果想在已经裁剪的区域中再加载一张新的图片,怎么做?
 <meta charset='utf-8' />
<style>
#canvas{
border:1px dashed #aaa;
}
</style>
<script>
window.onload = function(){
var oCanvas = document.querySelector( "#canvas" ),
oGc = oCanvas.getContext( '2d' ),
oBtn = document.querySelector( "input" ); oGc.beginPath();
oGc.strokeStyle = '#09f';
oGc.arc( 100, 100, 100, 0, 360 * Math.PI / 180, false );
oGc.stroke();
oGc.closePath(); oGc.clip();
function loadImg( imgPath ){
var oImg = new Image();
oImg.src = imgPath;
oImg.onload = function(){
oGc.drawImage( oImg, 0, 0 );
}
}
loadImg( './img/mv.jpg' );
oBtn.onclick = function(){
loadImg( './img/mv2.jpg' );
}
}
</script>
</head>
<body>
<canvas id="canvas" width="500" height="400"></canvas>
<br/><input type="button" value="加载另一张图片">
</body>

当点击按钮的时候,加载一张新的图片,但是加载后的图片,也产生了裁剪效果.

如果,不需要保留裁剪效果怎么做呢?利用save方法保存最初的状态,再加载图片的使用,用restore来恢复

 <meta charset='utf-8' />
<style>
#canvas{
border:1px dashed #aaa;
}
</style>
<script>
window.onload = function(){
var oCanvas = document.querySelector( "#canvas" ),
oGc = oCanvas.getContext( '2d' ),
oBtn = document.querySelector( "input" ); oGc.save(); //保存画布最初的状态,即没有产生裁剪效果的
oGc.beginPath();
oGc.strokeStyle = '#09f';
oGc.arc( 100, 100, 100, 0, 360 * Math.PI / 180, false );
oGc.stroke();
oGc.closePath(); oGc.clip();
function loadImg( imgPath ){
var oImg = new Image();
oImg.src = imgPath;
oImg.onload = function(){
oGc.drawImage( oImg, 0, 0 );
}
}
loadImg( './img/mv.jpg' );
oBtn.onclick = function(){
oGc.restore(); //恢复画布最初始的状态
loadImg( './img/mv2.jpg' );
}
}
</script>
</head>
<body>
<canvas id="canvas" width="500" height="400"></canvas>
<br/><input type="button" value="加载另一张图片">
</body>

再次点击之后,就没有产生裁剪效果了

保存与恢复变形状态,如果一个形状产生多次平移效果,如果没有保存和恢复状态,那么平移相对的是他上一次变化后的状态

 <meta charset='utf-8' />
<style>
#canvas{
border:1px dashed #aaa;
}
</style>
<script>
window.onload = function(){
var oCanvas = document.querySelector( "#canvas" ),
oGc = oCanvas.getContext( '2d' ),
oBtn = document.querySelector( "input" ); // oGc.save();
oGc.beginPath();
oGc.fillStyle = '#09f';
oGc.fillRect( 50, 50, 100, 100 );
oGc.translate( 100, 100 );
oGc.fillRect( 50, 50, 100, 100 );
oGc.closePath(); oGc.beginPath();
// oGc.restore();
oGc.fillStyle = 'red';
oGc.translate( 150, 150 );
oGc.fillRect( 50, 50, 100, 100 );
oGc.closePath();
}
</script>
</head>
<body>
<canvas id="canvas" width="500" height="400"></canvas>
</body>

把save()和restore打开,红色的方块将是针对第一次绘制的蓝色方块平移,而不是针对平移后的状态平移【关于平移,后面会有文章,如果你有css3的基础。这个跟css3是一样的,就是相对原来的位置进行平移, 不过这里要注意一点,平移这个动作是写在渲染(fillRect)之前】

保存与恢复字体相关样式

 <meta charset='utf-8' />
<style>
#canvas{
border:1px dashed #aaa;
}
</style>
<script>
window.onload = function(){
var oCanvas = document.querySelector( "#canvas" ),
oGc = oCanvas.getContext( '2d' ),
oBtn = document.querySelector( "input" ),
text = '跟着ghostwu学习html5 canvas'; oGc.font = 'bold 30px 微软雅黑';
oGc.fillStyle = '#09f';
// oGc.save();
oGc.fillText( text, 12, 60 ); oGc.fillStyle = 'red';
oGc.fillText( text, 12, 160 ); // oGc.restore();
oGc.fillText( text, 12, 260 );
}
</script>
</head>
<body>
<canvas id="canvas" width="500" height="400"></canvas>
</body>

打开注释的save和restore状态之后,第三行文字就会应用到保存之前的状态(天蓝色:oGc.fillStyle = '#09f';)

[js高手之路] html5 canvas系列教程 - 状态详解(save与restore)的更多相关文章

  1. [js高手之路] html5 canvas系列教程 - 像素操作(反色,黑白,亮度,复古,蒙版,透明)

    接着上文[js高手之路] html5 canvas系列教程 - 状态详解(save与restore),相信大家都应该玩过美颜功能,而我们今天要讲的就是canvas强大的像素处理能力,通过像素处理,实现 ...

  2. [js高手之路] html5 canvas系列教程 - 掌握画直线图形的常用API

    我们接着上文[js高手之路] html5 canvase系列教程 - 认识canvas以及基本使用方法继续. 一.直线的绘制 cxt.moveTo( x1, y1 ): 将画笔移动到x1, y1这个点 ...

  3. [js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具)

    之前,我写了一个arc函数的用法:[js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形). arcTo: cxt.arcTo( cx, cy, x2, y2, ...

  4. [js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形)

    绘制曲线,经常会用到路径的知识,如果你对路径有疑问,可以参考我的这篇文章[js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解. arc:画 ...

  5. [js高手之路] html5 canvas系列教程 - 图片操作(drawImage,clip,createPattern)

    接着上文[js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)继续,本文介绍的 ...

  6. [js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)

    接着上文线条样式[js高手之路] html5 canvas系列教程 - 线条样式(lineWidth,lineCap,lineJoin,setLineDash)继续. canvas提供两种输出文本的方 ...

  7. [js高手之路] html5 canvas系列教程 - 线条样式(lineWidth,lineCap,lineJoin,setLineDash)

    上文,写完弧度与贝塞尔曲线[js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具),本文主要是关于线条的样式设置 lineWidth: 设置线条的宽 ...

  8. [js高手之路] html5 canvas系列教程 - 线形渐变,径向渐变与阴影设置

    接着上文[js高手之路] html5 canvas系列教程 - 像素操作(反色,黑白,亮度,复古,蒙版,透明)继续. 一.线形渐变 线形渐变指的是一条直线上发生的渐变. 用法: var linear ...

  9. [js高手之路] html5 canvas动画教程 - 实时获取鼠标的当前坐标

    有了前面的canvas基础之后,现在开始就精彩了,后面写的canvas教程都是属于综合应用,前面已经写了常用的canvas基础知识,参考链接如下: [js高手之路] html5 canvas系列教程 ...

随机推荐

  1. Akka(22): Stream:实时操控:动态管道连接-MergeHub,BroadcastHub and PartitionHub

    在现实中我们会经常遇到这样的场景:有一个固定的数据源Source,我们希望按照程序运行状态来接驳任意数量的下游接收方subscriber.又或者我需要在程序运行时(runtime)把多个数据流向某个固 ...

  2. python+selenium自动化软件测试(第14章):基础实战(1)

    #coding=utf- from selenium import webdriven from selenium.webdriver.common.by import By from seleniu ...

  3. web站点优化之使用tengine搭建静态资源服务器,静态资源合并加载案例剖析

    在一个项目还是单体架构的时候,所有的js,css,image都会在一个web网站上,看起来并没有什么问题,比如下面这样: 但是当web网站流量起来的时候,这个单体架构必须要进行横向扩展,而在原来的架构 ...

  4. Be the Best of Whatever You Are

    If you can't be a pine on the top of the hill, Be a scrub in the valley—but be The best little scrub ...

  5. switch case异常处理机制

    public class T3{ public static void main(String[] args) { try{ String kc=""; System.out.pr ...

  6. TC358775XBG:MIPI DSI转双路LVDS芯片简介

    TC358775XBG是一颗MIPI DSI转双路LVDS芯片,通信方式:IIC/MIPI command mode,分辨率1920*1200,封装形式:BGA64.

  7. 如何搭建Zookeeper集群

     ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的 ...

  8. 转:java获得当前文件路径

    第一种: File f = new File(this.getClass().getResource("/").getPath()); System.out.println(f); ...

  9. SNS团队Beta阶段第二次站立会议(2017.05.23)

    1.立会照片 2.每个人的工作 每个成员的分工: 成员 今天已完成的工作 明天计划完成的工作 罗于婕 完善代码规范文档 辅助完善生词本 龚晓婷 界面优化  辅助开发新功能 林仕庄 界面图标不对齐bug ...

  10. 201521123002《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...