html 5ジェスチャー操作と多指操作パッケージとCanvas画像裁断実戦
7849 ワード
現在の状況では,移動端の開発割合はますます高くなり,単指のドラッグタッチなどの操作が従来の必要である.特殊な多指操作とジェスチャー操作は別途処理する必要があり、互換性の問題にも関連している.
*まずジェスチャー操作のパラメータ説明
*Mathを使用する関数:Math.atan2(y, x)
x軸と点(x,y)と(0,0)の連線が反時計回り方向に形成される挟み角
*パッケージは次のとおりです.
スケールカートン、スムーズでない解決方法:
ジェスチャー操作を行うたびに、ズーム値を1に再設定します.
画像カット実戦:
必要な知識点:
1. getContext('2d')
canvas 2 dキャンバスコンテキストの取得
2. canvas drawImg(imgDom, x, y, width, height)
この方法は、キャンバスにパラメータ対応のピクチャを描画するためにimgロードが完了するまで使用する必要があります.
3. getImageData(x, y, width, height)
パラメータ対応領域の画像情報を取得します(サーバ環境で使用する必要があり、ドメインをまたぐことはできません).
4.putimageData(ImageDataObj, x, y)
APIを参照できるオプションのパラメータも多数あります
canvasの以上の4つの知識点にパッケージされたgestureイベントを加えると、ピクチャカット機能が完了します.
// IOS ,
// gesturestart
// gesturechange
// gestureend
*まずジェスチャー操作のパラメータ説明
init:{
el: ,
start: (gesturestart),
change: (gesturechange)function(e){
e.scale// change , start
e.rotation// change start
},
end: (gestureend)
}
*Mathを使用する関数:Math.atan2(y, x)
x軸と点(x,y)と(0,0)の連線が反時計回り方向に形成される挟み角
*パッケージは次のとおりです.
function gesture(init){
var isGesture = false;
var el = init.el;
var startDis = 0;
var startDeg = 0;
//console.log(getDeg({pageX:0,pageY:0},{pageX:-100,pageY:100}));
el.addEventListener('touchstart', function(e) {
var touch = e.touches;//
if(touch.length >= 2){//
isGesture = true;
startDis = getDis(touch[0],touch[1]);//start
startDeg = getDeg(touch[0],touch[1]);//start , x
init.start&&init.start.call(el,e);
//this.innerHTML = startDis;
}
});
el.addEventListener('touchmove', function(e) {
var touch = e.touches;//
if(touch.length >= 2&&isGesture){//
var nowDis = getDis(touch[0],touch[1]);// move
var nowDeg = getDeg(touch[0],touch[1]);//move ,
e.scale = nowDis/startDis;
e.rotation = nowDeg - startDeg;
init.change&&init.change.call(el,e);
}
});
el.addEventListener('touchend', function(e) {
if(isGesture){
init.end&&init.end.call(el,e);
}
isGesture = false;
});
function getDis(point,point2){
var x = point2.pageX - point.pageX;
var y = point2.pageY - point.pageY;
return Math.sqrt(x*x + y*y);
}
function getDeg(point,point2){
var x = point2.pageX - point.pageX;
var y = point2.pageY - point.pageY;
return Math.atan2(y,x)*180/Math.PI;
}
}
スケールカートン、スムーズでない解決方法:
ジェスチャー操作を行うたびに、ズーム値を1に再設定します.
var box = document.querySelector('#box');
var startScale = 1;
css(box,"scale",1);
gesture({
el:box,
start: function(){
startScale = css(box,"scale");
this.style.background = "blue";
},
change: function(e){
// this.innerHTML = "scale:" + e.scale;
// this.innerHTML += "
rotate:" + e.rotation;
css(this,"scale",e.scale*startScale);
},
end: function(){
this.style.background = "red";
}
});
画像カット実戦:
必要な知識点:
1. getContext('2d')
canvas 2 dキャンバスコンテキストの取得
2. canvas drawImg(imgDom, x, y, width, height)
この方法は、キャンバスにパラメータ対応のピクチャを描画するためにimgロードが完了するまで使用する必要があります.
3. getImageData(x, y, width, height)
パラメータ対応領域の画像情報を取得します(サーバ環境で使用する必要があり、ドメインをまたぐことはできません).
4.putimageData(ImageDataObj, x, y)
APIを参照できるオプションのパラメータも多数あります
canvasの以上の4つの知識点にパッケージされたgestureイベントを加えると、ピクチャカット機能が完了します.