| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | <template>	<view @touchstart="touchstart" @touchmove.stop="touchmove" @touchend.stop="touchend">		<slot></slot>	</view></template><script>export default{		props:{		datas:{type:Array, default:function(){return [];}}	},	data() {		return {			toucheTimer  : 0,			fingerRes    : [],			distance     : 0		}	},	methods:{		toInt : function(arr){			var res = [];			arr.forEach((item)=>{				item.pageX = parseInt(item.pageX);				item.pageY = parseInt(item.pageY);				res.push(item);			});			return res;		},		touchstart : function(e){			this.fingerRes    = this.toInt(e.touches);			if(this.fingerRes.length > 2){return ;}			this.toucheTimer  = new Date().getTime();			var moves = [], i = 0;			this.fingerRes.forEach((finger)=>{				var xTouch = finger.pageX;				var yTouch = finger.pageY;				moves.push([xTouch, yTouch]);				i++;			});			this.$emit('thStart', moves, this.datas);		},		touchmove : function(e){			var touches = this.toInt(e.touches);			if(touches.length > 2){return ;}			if(touches.length == 1){				var i = 0, moves = [];				touches.forEach((finger)=>{					var xTouch = finger.pageX - this.fingerRes[i].pageX;					var yTouch = finger.pageY - this.fingerRes[i].pageY;					moves.push([xTouch, yTouch]);					i++;				});				this.$emit('thMove', moves, this.datas);			}			else if(touches.length == 2){				if(this.distance == 0){					this.distance = parseInt(this.getDistance(touches[0].pageX,touches[0].pageY, touches[1].pageX, touches[1].pageY));				}else{					var distance1 = parseInt(this.getDistance(touches[0].pageX,touches[0].pageY, touches[1].pageX, touches[1].pageY));					var scale = distance1 / this.distance;					scale = Math.floor(scale * 100) / 100;					this.$emit('scale', scale, this.datas);				}			}		},		touchend : function (e){			var touches   = this.toInt(e.changedTouches);			this.distance = 0;			if(touches.length == 1){				var i = 0, moves = [];				touches.forEach((finger)=>{					var xTouch = finger.pageX - this.fingerRes[i].pageX;					var yTouch = finger.pageY - this.fingerRes[i].pageY;					moves.push([xTouch, yTouch]);					i++;				});				var timer = new Date().getTime() - this.toucheTimer;				moves.push(timer);				this.$emit('thEnd', moves, this.datas);				// 根据时间及距离决定滑动时间				if(timer < 300){					var mx = Math.abs(moves[0][0]);					var my = Math.abs(moves[0][1]);					if(mx > my){						if(mx >= 50){							if(moves[0][0] > 0){								this.$emit('swipe', 'right', this.datas);							}else{								this.$emit('swipe', 'left', this.datas);							}						}					}else{						if(my >= 50){							if(moves[0][1] > 0){								this.$emit('swipe', 'down', this.datas);							}else{								this.$emit('swipe', 'up', this.datas);							}						}					}				}			}		},		getDistance : function (lat1,  lng1,  lat2,  lng2){			var radLat1  = lat1*Math.PI / 180.0;			var radLat2  = lat2*Math.PI / 180.0;			var a        = radLat1 - radLat2;			var b        = lng1*Math.PI / 180.0 - lng2*Math.PI / 180.0;			var s        = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));			s            = s * 6378.137;			return Math.round(s * 10000) / 10000;		}	}}</script><style>	</style>
 |