123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- <template>
- <view @touchstart="touchstart" @touchmove="touchmove" @touchend="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>
|