wipe – GeoGebra
タッチデバイスで、指の真下の描画を確認できるよう、ワイプ表示する実験です。
function ggbOnInit() {
insertCanvasOnlyCanvasTag();
var usicanvas = document.getElementsByClassName('usicanvas')[0];
var evt = window.ontouchstart===null?'touchmove':'mousemove';
usicanvas.addEventListener(evt, scanImage);
}
function scanImage(evt){
evt.preventDefault();
var canvas = document.getElementsByTagName('canvas')[0];
var context = canvas.getContext('2d');
var centerX = getEventData(evt)[0];
var centerY = getEventData(evt)[1];
var gv1ImageData = context.getImageData(centerX-40, centerY-40, 80, 80);
var usicanvas = document.getElementsByClassName('usicanvas')[0];
clearCanvas(usicanvas);
var usiContext = usicanvas.getContext('2d');
usiContext.putImageData(gv1ImageData, 0, 0);
usiContext.strokeStyle="blue";
usiContext.strokeRect(0, 0, 80, 80);
}
function clearCanvas(canvas){
if (canvas.getContext) {
var context = canvas.getContext('2d');
context.clearRect(0, 0, canvas.width, canvas.height);
}
}
function insertCanvasOnlyCanvasTag(){
var preCanvas = document.getElementsByTagName('canvas')[0];
var canvasWidth = preCanvas.style.width;
canvasWidth = eval( canvasWidth.slice( 0, canvasWidth.indexOf('px') ) );
var canvasHeight = preCanvas.style.height;
canvasHeight = eval( canvasHeight.slice( 0, canvasHeight.indexOf('px') ) );
preCanvas.insertAdjacentHTML('afterend','<canvas height=\"'+canvasHeight+'\" width=\"'+canvasWidth+'\" dir=\"ltr\" tabindex=\"10000\" class=\"usicanvas\" style=\"position: absolute; right: 0px; bottom: 0px;\">UsiCanvas</canvas>');
}
function getCanvasSize(){
var canvas = document.getElementsByTagName('canvas')[0];
var canvasWidth = canvas.width;
var styleWidth = canvas.style.width;
styleWidth = eval( styleWidth.slice( 0, styleWidth.indexOf('px') ) );
var canvasHeight = canvas.height;
var styleHeight = canvas.style.height;
styleHeight = eval( styleHeight.slice( 0, styleHeight.indexOf('px') ) );
return [canvasWidth, styleWidth, canvasHeight, styleHeight];
}
function getEventData(evt){
evt.preventDefault();
console.log('eventType = '+evt.type);
var result;
var canvas = document.getElementsByTagName('canvas')[0];
var deviceType = window.ontouchstart===null?'touchDevice':'mouseDevice';
var canvasWidth = canvas.width;
var styleWidth = canvas.style.width;
styleWidth = eval( styleWidth.slice( 0, styleWidth.indexOf('px') ) );
var styleHeight = canvas.style.height;
styleHeight = eval( styleHeight.slice( 0, styleHeight.indexOf('px') ) );
var ratio = canvasWidth / styleWidth;
if(deviceType == 'touchDevice'){
var touchX = evt.changedTouches[0].pageX;
var touchY = evt.changedTouches[0].pageY;
var clientRect = canvas.getBoundingClientRect();
var positionX = clientRect.left + window.pageXOffset;
var positionY = clientRect.top + window.pageYOffset;
var calcX = touchX - positionX;
var calcY = touchY - positionY;
calcX = calcX * styleWidth / clientRect.width;
calcY = calcY * styleHeight / clientRect.height;
result = [calcX, calcY];
}
if(deviceType == 'mouseDevice'){
result = [evt.offsetX, evt.offsetY];
}
console.log('roughData = '+result);
result[0] = ratio * result[0];
result[1] = ratio * result[1];
result[0] = Math.round( result[0] );
result[1] = Math.round( result[1] );
console.log('shapedData = '+result);
return result;
}