#javascript #canvas
#javascript #холст
Вопрос:
Я пытаюсь реализовать что-то вроде плавного масштабирования в приложении Canvas.
Я уже могу увеличить масштаб до предопределенного уровня масштабирования, используя это:
$("#zoomToView").click(function () {
paper.view.zoom=5.0;
});
Большинство примеров плавного зоммирования относятся к реализациям колесика мыши, но я хотел бы вместо этого использовать кнопку, которая увеличивает масштаб до заранее определенного уровня и обратно.
У меня сложилось впечатление, что реализация имеет какое-то отношение к циклу FOR и какой-то адаптивной задержке, которая увеличивается по мере увеличения количества циклов.
Есть идеи?
Я использую Paper.js как моя библиотека canvas, но это не должно быть фактором при поиске решения.
Ответ №1:
Вот пример использования собственного холста, но вы можете заменить paper.js при желании.
Концепция заключается в непрерывном запуске цикла анимации, который изменяет размер изображения только в том случае, если ваша кнопка нажата.
Пример кода:
<!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");
var cw=canvas.width;
var ch=canvas.height;
var iw,ih;
var img=new Image();
img.onload=start;
img.src="https://www.w3schools.com/css/img_fjords.jpg";
function start(){
iw=img.width;
ih=img.height;
$("#test").mousedown(function(){ doAnimation=true; });
$("#test").mouseup(function(){ doAnimation=false; });
$("#test").mouseout(function(){ doAnimation=false; });
requestAnimationFrame(animate);
ctx.drawImage(img,cw/2-iw/2,ch/2-ih/2);
}
var scale=1.00;
scaleDirection=0.01;
var minScale=0.50;
var maxScale=1.50;
var doAnimation=false;
function animate(){
requestAnimationFrame(animate);
if(doAnimation){
ctx.clearRect(0,0,canvas.width,canvas.height);
ctx.drawImage(img,
0,0,iw,ih,
(cw-iw*scale)/2,(ch-ih*scale)/2,iw*scale,ih*scale
);
scale =scaleDirection;
if(scale<minScale || scale>maxScale){
scaleDirection*=-1;
scale =scaleDirection;
}
}
}
}); // end $(function(){});
</script>
</head>
<body>
<button id="test">Animate</button><br>
<canvas id="canvas" width=300 height=300></canvas>
</body>
</html>
Комментарии:
1. Спасибо, Марк. Единственная реальная разница в том, что я могу увеличивать масштаб с помощью paper.view.zoom in paper.js , поэтому нет необходимости заботиться об изменении размера элементов. У вас есть время рассказать мне, что действительно нужно удалить и заменить в вашем примере, чтобы сделать это? Ваш пример работает хорошо.
2. Вместо
ctx.drawImage
используйтеscale
переменную paper.view.zoom. В качестве альтернативы вы могли бы использовать .scale для слоев или групп.