zoukankan      html  css  js  c++  java
  • ionic图片点击放大,双指缩放

    对于这个功能,也是查找了好多的资料,到现在其中的代码也需要好好研究研究,这个方法的缺点就是每次只能显示一张图片,并对其进行放大~至于多张图片,以后再研究~

    1、写好模板页(comImageBox.html)

      <ion-header-bar align-title="center" class="bar-calm deleteIcon" id="deleteIcon" style="display:none;position:relative;" ng-if="isDelete">
          <a ng-click="hideBigImage();" class="button button-clear ion ion-chevron-left">返回</a>
          <a ng-click="deleteImage({{Url}});" class="button button-large button-clear ion ion-trash-a" style="font-size:25px;right:12px;position: absolute;"></a>
      </ion-header-bar>
    <div class=LightBox ng-click=hideBigImage() style="display:none">
        <div class=ImgViewer>
            <ul class=swiper-wrapper>
                <li class=swiper-slide>
                   <img src={{Url}} ng-show="!showVideo">
                     <video style="bottom:50px;background-color:black;" poster="http://www.mjlms.net/mjlms/mobile/img/1.jpg" ng-show="showVideo" width="100%" height="85%" ng-repeat="v in arrayVideo track by $index" ng-click="openLink('{{v}}');" controls="controls" ng-src="{{v| to_trusted}}" webkit-playsinline="true">
                     </video>
                </li>
            </ul>
        </div>
    </div>

    2、 Directive(指令)

    关于directive指令的资料:http://blog.csdn.net/evankaka/article/details/51232895

      1 .directive('comImageBox', ['$state', '$rootScope', function ($state, $rootScope) {
      2     var comImageBox = {
      3         restrict: 'E',   //element name <com-my-favor-item></com-my-favor-item>
      4         templateUrl: 'templates/comImageBox.html',
      5         transclude: false,
      6         templateNamespace: 'html',
      7         scope: false,
      8         link: {
      9             pre: function preLink(scope, element, attrs, controller) {
     10                 //图片大小
     11                 var elWidth, elHeight;
     12                 //元素大小
     13                 var outWidth, outHeight;
     14                 // 当前操作模式 pinch:缩放 swipe:滑动
     15                 var mode = '';
     16 
     17                 // 双指触摸点的距离 (缩放模式)
     18                 var distance = 0;
     19                 var initialDistance = 0;
     20 
     21                 // 图片缩放参数
     22                 var scale = 1;
     23                 var relativeScale = 1;
     24                 var initialScale = 1;
     25                 var maxScale = parseInt(attrs.maxScale, 10);
     26                 if (isNaN(maxScale) || maxScale <= 1) {
     27                     maxScale = 20;
     28                 }
     29 
     30                 // position of the upper left corner of the element
     31                 var positionX = 0;
     32                 var positionY = 0;
     33 
     34                 var initialPositionX = 0;
     35                 var initialPositionY = 0;
     36 
     37                 // central origin (缩放模式)
     38                 var originX = 0;
     39                 var originY = 0;
     40 
     41                 // start coordinate and amount of movement (滑动模式)
     42                 var startX = 0;
     43                 var startY = 0;
     44                 var moveX = 0;
     45                 var moveY = 0;
     46 
     47 
     48                 outWidth = $(element[0].lastChild).width();
     49                 outHeight = $(element[0].lastChild).height();
     50 
     51 
     52                 scope.Url = "";
     53                 scope.bigImage = false;
     54 
     55                 //显示图片(此处所传参数,是根据项目需求使用,必传参数只有imggeName)
     56                 scope.showBigImage = function(type,imageName,index,id) {
     57                     scope.index=index;
     58                     scope.Url = imageName;
     59                         scope.showVideo=false;
     60                     scope.deleteId=id;
     61                     scope.type=type;
     62                     if(type=='video'||type=="selectVideo"||type=='video1'){
     63                         scope.showVideo=true;
     64                     }
     65                     if(scope.type=='selectimg'||scope.type=='selectAfterImg'||scope.type=='selectVideo'){
     66                         scope.isDelete=false;
     67                        }
     68                     scope.bigImage = true;
     69 
     70                     $(element[0].lastChild).show(10, function() {
     71                         $(".deleteIcon").css("display","block");
     72                         $(".Main .tab-nav").hide();
     73                         $(".LightBox").show();
     74                         $(this).find("img").css({"100%"});
     75                         elWidth = $(this).find("img").width();
     76                         elHeight = $(this).find("img").height();
     77                     });
     78 
     79                     //console.info(element.find("img"));
     80                     //每次点击放大图片之后需要绑定事件
     81                     element.find("img").on('touchstart', touchstartHandler);
     82                     element.find("img").on('touchmove', touchmoveHandler);
     83                     element.find("img").on('touchend', touchendHandler);
     84                 };
     85                 
     86                
     87                 //隐藏图片
     88                 scope.hideBigImage = function() {
     89                     scope.bigImage = false;
     90                     /*$("ion-header-bar").show();*/
     91                     $(".Main .tab-nav").show();
     92                     $(".LightBox").hide(5);
     93                     $(".deleteIcon").css("display","none");
     94                     $(".LightBox").hide(5);
     95 
     96                     // 当前操作模式 pinch:缩放 swipe:滑动
     97                     mode = '';
     98 
     99                     // 双指触摸点的距离 (缩放模式)
    100                     distance = 0;
    101                     initialDistance = 0;
    102 
    103                     // 图片缩放参数
    104                     scale = 1;
    105                     relativeScale = 1;
    106                     initialScale = 1;
    107                     maxScale = parseInt(attrs.maxScale, 10);
    108                     if (isNaN(maxScale) || maxScale <= 1) {
    109                         maxScale = 20;
    110                     }
    111 
    112                     // position of the upper left corner of the element
    113                     positionX = 0;
    114                     positionY = 0;
    115 
    116                     initialPositionX = 0;
    117                     initialPositionY = 0;
    118 
    119                     // central origin (缩放模式)
    120                     originX = 0;
    121                     originY = 0;
    122 
    123                     // start coordinate and amount of movement (滑动模式)
    124                     startX = 0;
    125                     startY = 0;
    126                     moveX = 0;
    127                     moveY = 0;
    128 
    129                     transformElement();
    130                 };
    131                 
    132                 
    133                 /****************************************** 图片缩放功能开始 20161104 qinxiankang 添加 ***************************/
    134 
    135                 /**
    136                  * @param {object} 点击开始,初始化
    137                  */
    138                 function touchstartHandler(evt) {
    139                     //console.info("touchstart");
    140                     var touches = evt.originalEvent ? evt.originalEvent.touches : evt.touches;
    141 
    142                     startX = touches[0].clientX;
    143                     startY = touches[0].clientY;
    144                     initialPositionX = positionX;
    145                     initialPositionY = positionY;
    146                     moveX = 0;
    147                     moveY = 0;
    148                 }
    149 
    150                 /**
    151                  * @param {object} 手指移动
    152                  */
    153                 function touchmoveHandler(evt) {
    154                     //console.info("touch move");
    155                     var touches = evt.originalEvent ? evt.originalEvent.touches : evt.touches;
    156                     
    157                     var leftX = positionX - elWidth * scale / 2 + outWidth / 2;
    158                     var rightX = outWidth - (leftX + elWidth * scale);
    159                     var topY = positionY - elHeight * scale / 2 + outHeight / 2;
    160                     var bottomY = outHeight - (topY + elHeight * scale);
    161  
    162 
    163 
    164                     if (mode === '') {
    165                         if (touches.length === 1) {
    166 
    167                             mode = 'swipe';
    168 
    169                         } else if (touches.length === 2) {
    170 
    171                             mode = 'pinch';
    172 
    173                             initialScale = scale;
    174                             initialDistance = getDistance(touches);
    175                             originX = touches[0].clientX -
    176                                 parseInt((touches[0].clientX - touches[1].clientX) / 2, 10) -
    177                                 element.find("img")[0].offsetLeft - initialPositionX;
    178                             originY = touches[0].clientY -
    179                                 parseInt((touches[0].clientY - touches[1].clientY) / 2, 10) -
    180                                 element.find("img")[0].offsetTop - initialPositionY;
    181 
    182                         }
    183                     }
    184 
    185                     if (mode === 'swipe') {
    186                         //移动
    187                         evt.preventDefault();
    188                         moveX = touches[0].clientX - startX;
    189                         moveY = touches[0].clientY - startY;
    190 
    191                         positionX = initialPositionX + moveX;
    192                         positionY = initialPositionY + moveY;
    193 
    194                         transformElement();
    195 
    196                         //左右有空余,左右间距相同,禁止上下滑动
    197                         if (leftX > 0 && rightX > 0) {
    198                             positionX = 0;
    199                             transformElement();
    200                         }
    201                         //上下都有空余,禁止左右滑动
    202                         if (topY > 0 && bottomY > 0) {
    203                             positionY = 0;
    204                             transformElement();
    205                         }
    206 
    207 
    208 
    209                     } else if (mode === 'pinch') {
    210                         //缩放
    211                         evt.preventDefault();
    212                         distance = getDistance(touches);
    213                         relativeScale = distance / initialDistance;
    214 
    215                         //
    216 
    217 
    218                         scale = relativeScale * initialScale;
    219 
    220                         positionX = originX * (1 - relativeScale) + initialPositionX + moveX;
    221                         positionY = originY * (1 - relativeScale) + initialPositionY + moveY;
    222 
    223                         transformElement();
    224                         positionX = 0;
    225                         positionY = 0;
    226                         transformElement();
    227                     }
    228 
    229 
    230 
    231                     //console.info(leftX, topY, rightX, bottomY);
    232                 }
    233 
    234                 /**
    235                  * @param {object} 点击结束
    236                  */
    237                 function touchendHandler(evt) {
    238 /*                    console.info("图片大小", elWidth, elHeight);
    239                     console.info("容器大小", outWidth, outHeight);*/
    240 
    241                     //console.info("touch end");
    242                     var touches = evt.originalEvent ? evt.originalEvent.touches : evt.touches;
    243 
    244                     if (mode === '' || touches.length > 0) {
    245                         return;
    246                     }
    247                     //缩放比例小于原比例
    248                     if (scale < 1) {
    249 
    250                         scale = 1;
    251                         positionX = 0;
    252                         positionY = 0;
    253 
    254                     } else if (scale > maxScale) {
    255                         //缩放比例过大
    256                         scale = maxScale;
    257                         relativeScale = scale / initialScale;
    258                         positionX = originX * (1 - relativeScale) + initialPositionX + moveX;
    259                         positionY = originY * (1 - relativeScale) + initialPositionY + moveY;
    260 
    261                     }
    262 
    263                     var leftX = positionX - elWidth * scale / 2 + outWidth / 2;
    264                     var rightX = outWidth - (leftX + elWidth * scale);
    265                     var topY = positionY - elHeight * scale / 2 + outHeight / 2;
    266                     var bottomY = outHeight - (topY + elHeight * scale);
    267 
    268                     if (leftX > 0 && rightX < 0) {
    269                         //leftX=0;
    270                         positionX = elWidth * scale / 2 - outWidth / 2;
    271                         transformElement();
    272                     } else if (leftX < 0 && rightX > 0) {
    273                         //rightX=0;
    274                         positionX = outWidth / 2 - elWidth * scale / 2;
    275                         transformElement();
    276                     }
    277                     if (topY < 0 && bottomY > 0) {
    278                         positionY = outHeight / 2 - elHeight * scale / 2;
    279 
    280                         transformElement();
    281                     } else if (topY > 0 && bottomY < 0) {
    282                         positionY = elHeight * scale / 2 - outHeight / 2;
    283                         transformElement();
    284                     }
    285 
    286 
    287                     leftX = positionX - elWidth * scale / 2 + outWidth / 2;
    288                     rightX = outWidth - (leftX + elWidth * scale);
    289                     topY = positionY - elHeight * scale / 2 + outHeight / 2;
    290                     bottomY = outHeight - (topY + elHeight * scale);
    291                     //console.info(leftX, rightX, topY, bottomY);
    292                     if (topY > 0 && bottomY > 0) {
    293                         //让上下边距相同,只允许左右滑动
    294                         //console.info(1);
    295                         positionY = 0;
    296                         transformElement();
    297                     }
    298                     if (leftX > 0 && rightX > 0) {
    299                         //console.info(2);
    300                         positionX = 0;
    301                         transformElement();
    302                     }
    303                     leftX = positionX - elWidth * scale / 2 + outWidth / 2;
    304                     rightX = outWidth - (leftX + elWidth * scale);
    305                     topY = positionY - elHeight * scale / 2 + outHeight / 2;
    306                     bottomY = outHeight - (topY + elHeight * scale);
    307                     //console.info(leftX, rightX,topY, bottomY);
    308                     transformElement(0.1);
    309                     mode = '';
    310 
    311                 }
    312 
    313                 /**
    314                  * @param {Array} 双指touch位置
    315                  * @return {number} 
    316                  */
    317                 function getDistance(touches) {
    318                     var d = Math.sqrt(Math.pow(touches[0].clientX - touches[1].clientX, 2) +
    319                         Math.pow(touches[0].clientY - touches[1].clientY, 2));
    320                     return parseInt(d, 10);
    321                 }
    322 
    323                 /**
    324                  * @param {number} 动画时间
    325                  */
    326                 function transformElement(duration) {
    327                     //console.info("transform");
    328                     var transition = duration ? 'all cubic-bezier(0,0,.5,1) ' + duration + 's' : '';
    329                     var matrixArray = [scale, 0, 0, scale, positionX, positionY];
    330                     var matrix = 'matrix(' + matrixArray.join(',') + ')';
    331 
    332                     element.find("img").css({
    333                         '-webkit-transition': transition,
    334                         transition: transition,
    335                         '-webkit-transform': matrix + ' translate3d(0,0,0)',
    336                         transform: matrix
    337                     });
    338                 }
    339                 /****************************************** 图片缩放功能结束****************************/
    340 
    341             },
    342 
    343             post: function postLink(scope, element, attrs, controller) {
    344             }
    345         }
    346     };
    347     return comImageBox;
    348 }]);

     3、在应用界面里使用dom元素引用

    1 <div style="clear:both;"margin:10px 10px;">
    2      <img ng-repeat="img in arrayPause track by $index" ng-src="{{img}}" width="132px;" height="173px;" ng-click="showBigImage('pauseImg',img,$index);" style="margin-left:5px;">  
    3  </div>
    4  <com-Image-Box></com-Image-Box> 

    参考资料:http://blog.csdn.net/half_open/article/details/53047252

  • 相关阅读:
    HDU2027 统计元音 一点点哈希思想
    湖南工业大学第一届ACM竞赛 数字游戏 字符串处理
    湖南工业大学第一届ACM竞赛 我素故我在 DFS
    HDU3293sort
    HDU2082 找单词 母函数
    HDU1018 Big Number 斯特林公式
    湖南工业大学第一届ACM竞赛 分糖果 位操作
    UVA 357 Let Me Count The Ways
    UVA 147 Dollars
    UVA 348 Optimal Array Multiplication Sequence
  • 原文地址:https://www.cnblogs.com/BetterMyself/p/7116796.html
Copyright © 2011-2022 走看看