2018-03-20 10:36:39 +08:00

129 lines
3.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Hilo
* Copyright 2015 alibaba.com
* Licensed under the MIT License
*/
/**
* <iframe src='../../../examples/drag.html?noHeader' width = '550' height = '250' scrolling='no'></iframe>
* <br/>
* example:
* <pre>
* var bmp = new Bitmap({image:img});
* Hilo.util.copy(bmp, Hilo.drag);
* bmp.startDrag([0, 0, 550, 400]);
* </pre>
* @class drag A mixin that contains drag method.You can mix drag method to the visual target by use Class.mix(target, drag) or Hilo.util.copy(target, drag).
* @mixin
* @static
* @module hilo/util/drag
* @requires hilo/core/Hilo
*/
var drag = {
_isDragStart:false,
/**
* 是否需要 transform父元素有 transform 时需要设置为true
* @default false
* @type {Boolean}
*/
dragNeedTransform:false,
/**
* start drag.
* @param {Array} bounds The bounds area that the view can move, relative to the coordinates of the view's parent, [x, y, width, height] default is no limit.
*/
startDrag:function(bounds){
var that = this;
if(that._isDragStart){
that.stopDrag();
}
that._isDragStart = true;
var stage;
bounds = bounds||[-Infinity, -Infinity, Infinity, Infinity];
var mouse = {
x:0,
y:0,
preX:0,
preY:0
};
var minX = bounds[0];
var minY = bounds[1];
var maxX = bounds[2] == Infinity?Infinity:minX + bounds[2];
var maxY = bounds[3] == Infinity?Infinity:minY + bounds[3];
var worldPoint = {
x:0,
y:0
};
function onStart(e){
e.stopPropagation();
updateMouse(e);
that.off(Hilo.event.POINTER_START, onStart);
worldPoint.x = that.x;
worldPoint.y = that.y;
if(that.dragNeedTransform && that.parent){
that.parent.getConcatenatedMatrix().transformPoint(worldPoint);
}
that.__dragX = worldPoint.x - mouse.x;
that.__dragY = worldPoint.y - mouse.y;
if(!stage){
stage = that.getStage();
}
stage.on(Hilo.event.POINTER_MOVE, onMove);
document.addEventListener(Hilo.event.POINTER_END, onStop);
that.fire("dragStart", mouse);
}
function onStop(e){
document.removeEventListener(Hilo.event.POINTER_END, onStop);
stage && stage.off(Hilo.event.POINTER_MOVE, onMove);
that.on(Hilo.event.POINTER_START, onStart);
that.fire("dragEnd", mouse);
}
function onMove(e){
updateMouse(e);
worldPoint.x = mouse.x + that.__dragX;
worldPoint.y = mouse.y + that.__dragY;
if(that.dragNeedTransform && that.parent){
that.parent.getConcatenatedMatrix().invert().transformPoint(worldPoint);
}
that.x = Math.max(minX, Math.min(maxX, worldPoint.x));
that.y = Math.max(minY, Math.min(maxY, worldPoint.y));
that.fire("dragMove", mouse);
}
function updateMouse(e){
mouse.preX = mouse.x;
mouse.preY = mouse.y;
mouse.x = e.stageX;
mouse.y = e.stageY;
}
function stopDrag(){
that._isDragStart = false;
document.removeEventListener(Hilo.event.POINTER_END, onStop);
stage && stage.off(Hilo.event.POINTER_MOVE, onMove);
that.off(Hilo.event.POINTER_START, onStart);
}
that.on(Hilo.event.POINTER_START, onStart);
that.stopDrag = stopDrag;
},
/**
* stop drag.
*/
stopDrag:function(){
this._isDragStart = false;
}
};