我有一个背景,假设它是绿草。在背景之上,我有一个黑色的覆盖层。我现在想要的是在覆盖层上制作一个可移动的孔,以便您可以看到如下图所示的背景。
我对画布很陌生,所以我不确定我应该寻找什么。阿尔法面具?
所以我的问题是如何才能达到上图所示的效果?
如果它是 HTML,我将有两张草的图像,一张作为背景,一张在覆盖层上方的 div 中,其边界半径可以移动并仅计算位置。
谢谢。
我有一个背景,假设它是绿草。在背景之上,我有一个黑色的覆盖层。我现在想要的是在覆盖层上制作一个可移动的孔,以便您可以看到如下图所示的背景。
我对画布很陌生,所以我不确定我应该寻找什么。阿尔法面具?
所以我的问题是如何才能达到上图所示的效果?
如果它是 HTML,我将有两张草的图像,一张作为背景,一张在覆盖层上方的 div 中,其边界半径可以移动并仅计算位置。
谢谢。
您是否正在寻找一种移动的“手电筒”效果?
如果是这样,您可以通过绘制圆形路径然后将其用作剪切区域来做到这一点: context.clip();
在 .clip() 之后绘制的任何内容都将通过剪切路径查看。
这是代码和小提琴:http: //jsfiddle.net/m1erickson/pRzxt/
<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
body{ background-color: ivory; }
canvas{border:1px solid red;}
</style>
<script>
$(function(){
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
window.requestAnimFrame = (function(callback) {
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 60);
};
})();
var radius=50;
var x=100;
var dx=10;
var y=100;
var dy=10;
var delay=10;
var img=new Image();
img.onload=function(){
var canvas1=document.getElementById("image");
var ctxImg=canvas1.getContext("2d");
ctxImg.drawImage(img,0,0,img.width,img.height,0,0,canvas.width,canvas.height);
animate();
}
img.src="http://lh3.ggpht.com/_Z-i7eF_ACGI/TRxpFywLCxI/AAAAAAAAAD8/ACsxiuO_C1g/house%20vector.png";
function animate() {
if(--delay<0){
// update
x+=dx;
if(x-radius<0 || x+radius>=canvas.width){dx=-dx;}
y+=dy;
if(y-radius<0 || y+radius>=canvas.height){dy=-dy;}
delay=10;
// draw stuff
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.save();
ctx.beginPath();
ctx.arc(x,y, radius, 0, 2 * Math.PI, false);
ctx.clip();
ctx.drawImage(img,0,0,img.width,img.height,0,0,canvas.width,canvas.height);
ctx.restore();
}
// request new frame
requestAnimFrame(function() {
animate();
});
}
}); // end $(function(){});
</script>
</head>
<body>
<p>Image clipped by moving circle</p>
<canvas id="canvas" width=300 height=200></canvas>
<br/><p>Unclipped image</p>
<canvas id="image" width=300 height=200></canvas>
</body>
</html>
我为不久前正在做的一个小画布测试做了类似的事情。您可以做的是在底层顶部创建一个带有画布元素的 div,并在该顶层画布上绘制具有透明度的径向渐变。我在这里有一个小提琴:http: //jsfiddle.net/CnEBQ/14/
特别看一下径向渐变的这段代码。上下文附加到顶部 div 画布:
var gradient = tCTX.createRadialGradient(CANVAS_SIZE.x/2, CANVAS_SIZE.y/2, 250, CANVAS_SIZE.x/2, CANVAS_SIZE.y/2, 0);
gradient.addColorStop(0, "#000");
gradient.addColorStop(1, "transparent");
tCTX.fillStyle = gradient;
tCTX.fillRect(0, 0, CANVAS_SIZE.x, CANVAS_SIZE.y);
那里可能有一些不好的代码,但它应该让你知道这是否是你想要去的地方。您可以根据需要在计时器或某些事件上重新绘制顶层“洞”以使其移动。您可以使用渐变设置来获得或多或少的“黑暗”。
我花了很长时间试图找到对我在这里使用的函数的良好参考,但是寻找这些函数的更多解释的一个不错的地方是 Mozilla Canvas API ,其中解释了渐变函数的参数。特别有用,因为它们不是立即显而易见的。