JSFiddle - React, Tailwind, and code Playground
HTML
<div class="indicator">
<img class="image" src="http://javascript.ru/forum/attachments/project/558d1288868268t-vrashhenie-s-vlozheniem-v-canvas-transform-usage_icon_electro-png" alt="" />
<img class="pointer" src="http://javascript.ru/forum/attachments/project/557d1288868261-vrashhenie-s-vlozheniem-v-canvas-transform-usage_electro_pointer-png" alt="" />
<canvas width="120" height="120" id="canvas"></canvas>
</div>
CSS
.indicator {
width:120px;
height:120px;
border:1px solid #ccc;
text-align:center;
position:relative;
}
.indicator .pointer {
visibility:hidden;
}
.indicator #canvas {
z-index:10000;
position:absolute;
top:0;
left:0;
width:100%;
height:100%;
}
JavaScript
var indicatorClass = {
rotationIncrement : 10,
initCanvas : function () {
var indicatorData = $ ('.indicator'),
pointerImage = indicatorData.find ('.pointer');
var canvasData = $ ('#canvas').get (0),
contextData = canvasData.getContext ("2d"),
rotationArrow = pointerImage.get (0);
setInterval(function () {
indicatorClass.rotationIncrement++;
indicatorClass.setTransform (contextData, indicatorData, rotationArrow);
}, 100);
},
setTransform : function (contextData, indicatorData, rotationArrow) {
var sin = Math.sin(indicatorClass.rotationIncrement * Math.PI / 6);
var cos = Math.cos(indicatorClass.rotationIncrement * Math.PI / 6);
contextData.clearRect (0, 0, contextData.canvas.width, contextData.canvas.height);
contextData.save ();
contextData.translate(indicatorData.width () / 2, indicatorData.height () / 2);
contextData.transform(cos, sin, -sin, cos, -6, 0);
contextData.drawImage(rotationArrow, -rotationArrow.width / 2, -rotationArrow.height / 1);
contextData.restore ();
},
setRotation : function (contextData, indicatorData, rotationArrow) {
contextData.clearRect (0, 0, contextData.canvas.width, contextData.canvas.height);
contextData.save ();
contextData.translate(indicatorData.width () / 2, indicatorData.height () / 2);
contextData.drawImage(rotationArrow, -rotationArrow.width / 2, -rotationArrow.height / 2);
contextData.restore ();
}
}
window.onload = function () {
indicatorClass.initCanvas ();
}