简体   繁体   English

Hammerjs v2.0.2捏以缩放图像

[英]Hammerjs v2.0.2 pinch to zoom image

I'm trying to create a pinch to zoom action in a Web app developed with Cordova for iOS and Android. 我试图在用Cordova开发的适用于iOS和Android的Web应用程序中创建缩放动作的功能。

I've tried this script with Hammerjs 1.1.3, and in a first moment i think that was the version of Hammerjs to create this problem, so i'have "translated" the script to working with Hammerjs 2.0.2 but i have the same result either way. 我已经使用Hammerjs 1.1.3尝试了脚本,并且在第一刻,我认为这是Hammerjs的版本,因此会产生此问题,因此我将脚本“翻译”为与Hammerjs 2.0.2一起使用,但是我拥有两种方法的结果相同。

In iOS (at the moment i'm using the Xcode emulator on my Mac) i'm able to zoom the image but after the first drag event the image is cut, and after this i can't drag the image. 在iOS中(目前在Mac上使用Xcode模拟器),我可以缩放图像,但是在第一个拖动事件之后,图像被剪切了,此后,我将无法拖动图像。

I think this issue is caused by the css transform3d animation, have you ever had the same problem or something similar in iOS? 我认为此问题是由CSS transform3d动画引起的,您在iOS中遇到过相同的问题或类似的问题吗?

The HTML structure: HTML结构:

<div id="pinchzoom">
        <img id="rect" src="..." width="2835" height="4289" alt="" />
</div>

This is the script in Hammerjs 2.0.2. 这是Hammerjs 2.0.2中的脚本。

   var elem = document.getElementById('pinchzoom');   
            var mc = Hammer(elem,{touchAction: 'manipulation'});

            mc.get('pinch').set({enable: true});

            var rect = document.getElementById('img_hover');

            var posX=0, posY=0,
                scale=1, last_scale,
                last_posX=0, last_posY=0,
                max_pos_x=0, max_pos_y=0;

            mc.on('pan pinchout pinchin panend', function(ev){
                        switch(ev.type)
                        {

                                case 'pan':
                                    if(scale != 1){
                                                posX = last_posX + ev.deltaX;
                                                posY = last_posY + ev.deltaY;
                                                if(posX > max_pos_x){
                                                    posX = max_pos_x;
                                                }
                                                if(posX < -max_pos_x){
                                                    posX = -max_pos_x;
                                                }
                                                if(posY > max_pos_y){
                                                    posY = max_pos_y;
                                                }
                                                if(posY < -max_pos_y){
                                                    posY = -max_pos_y;
                                                }
                                        }else{
                                            posX = 0;
                                            posY = 0;
                                            saved_posX = 0;
                                            saved_posY = 0;
                                        }

                                break;

                                 case 'pinchin':
                                 case 'pinchout':
                                    last_scale = scale;
                                    scale = Math.max(1, Math.min(last_scale * ev.scale, 10));

                                    max_pos_x = Math.ceil((scale - 1) * rect.clientWidth / 2);
                                    max_pos_y = Math.ceil((scale - 1) * rect.clientHeight / 2);

                                    if(posX > max_pos_x){
                                        posX = max_pos_x;
                                    }
                                    if(posX < -max_pos_x){
                                        posX = -max_pos_x;
                                    }
                                    if(posY > max_pos_y){
                                        posY = max_pos_y;
                                    }
                                    if(posY < -max_pos_y){
                                        posY = -max_pos_y;
                                    }

                                break;

                                case 'panend':
                                    last_posX = posX < max_pos_x ? posX: max_pos_x;
                                    last_posY = posY < max_pos_y ? posY: max_pos_y;

                                break;

                        }

                        // transform!
                        var transform =
                                "translate3d(0, 0, 0) " +
                                "scale3d(1, 1, 0) "; 
                        if(scale != 1){
                            transform =
                                "translate3d("+posX+"px,"+posY+"px, 0) " +
                                "scale3d("+scale+","+scale+", 0) ";
                        }

                        rect.style.transform = transform;
                        rect.style.oTransform = transform;
                        rect.style.msTransform = transform;
                        rect.style.mozTransform = transform;
                        rect.style.webkitTransform = transform;

                    });

I Have Used jr-crop Plugin With Cordova Camera Plugin in Android & iOS. 我在Android和iOS中使用了带有Cordova相机插件的jr-crop插件。

Pinch To Zoom functionality Available in these plugin. 缩小缩放功能在这些插件中可用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM