如何在sencha touch carousel中应用图像的放大和缩小功能

时间:2012-08-30 07:27:48

标签: html5 sencha-touch extjs zoom carousel

我有示例应用程序,我已经添加了一些图像到旋转木马,并试图放大和缩小图像,我面临的问题只是旋转木马中的第一个图像响应放大和缩小,我不能缩放轮播中的其余图像

示例代码:

Ext.define("PinchTest.view.Main", {
    //extend: 'Ext.List',
    extend: 'Ext.Carousel',
    xtype: 'stcrop',
    require: [
      'Ext.Img',
        'Ext.Loader'
    ],
    config: {
        layout: {
            type: 'fit',
            pack: 'center'
        },

        scrollable: false,
        image: null,
        imageWidth: 140,
        imageHeight: 180,
        imageAdded: false
    },

    initialize: function () {
        var me = this;
        me.callParent();

        //                // me.setImage(me.config.image);
        //               me.setImage("resources/images/CAK_SCA6REDVELV_RedVelvet_GEN_11_OU_SQ.jpg");
        //                me.addImage();
        var carouse = Ext.create('Ext.Carousel', {
            id: 'carose',
            scope: this
        });

        var imgArray = [];
        var images = ["resources/images/CAK_SCA6REDVELV_RedVelvet_GEN_11_OU_SQ.jpg", "resources/images/Home_Blue_Icon.png", "resources/images/twitter.png"];
        Ext.each(images, function (picture) {
            //var i = 0;
            imgArray.push({
                xtype: 'image',
                cls: 'br0',
                src: picture

            });
            console.log(picture);
            me.setImage(picture);
            me.addImage(picture);

        });
        carouse.setItems(imgArray);
        carouse.setActiveItem(0);
        this.add(carouse);

    },
    addImage: function (picture) {
        console.log(this.getImage());
        //console.log(this.getImageAdded());
        // if (!this.getImageAdded(picture)) {
        //if()
        var c = Ext.create('Ext.Container', {
            cls: 'stcrop-picture',
            width: '100%',
            height: '100%',
            cls: 'stcrop-image-container',
            style: 'margin:auto;background-size:100%;background-image:url(' + this.getImage() + ');background-position:center center;background-repeat:no-repeat;',
            draggable: {
                constraint: {
                    min: { x: 0, y: 0 },
                    max: { x: 0, y: 0 }
                },
                listeners: {
                    dragstart: {
                        fn: this.dragStart,
                        order: 'before',
                        scope: this
                    },
                    drag: this.drag,
                    dragend: this.dragEnd,
                    scope: this
                }
            }
        });

        c.element.on('tap', this.tap, this);
        c.element.on('pinchstart', function (e) {
            var xa = e.touches[0].pageX,
            xb = e.touches[1].pageX,
            ya = e.touches[0].pageY,
            yb = e.touches[1].pageY,
            x = Math.abs(xa - xb),
            y = Math.abs(ya - yb),
            h = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
            this.h = h;
        }, this);

        c.element.on('pinch', function (e) {
            var xa = e.touches[0].pageX,
            xb = e.touches[1].pageX,
            ya = e.touches[0].pageY,
            yb = e.touches[1].pageY,
            x = Math.abs(xa - xb),
            y = Math.abs(ya - yb),
            h = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));

            var p = parseInt(e.target.parentNode.style.backgroundSize);
            ((this.h - h) > 0) ? p-- : p++;
            e.target.parentNode.style.backgroundSize = p + '%';

            this.h = h;

        }, this);

        c.element.on('pinchend', function () { console.log('pinchend') });

        this.add(c);
        //this.setImageAdded(true);
        //}

        return c;
    },

    tap: function (e) {
        if (typeof this.cropper !== 'undefined') { this.cropper.destroy(); }
    },

    dragStart: function (d, e, x, y) {
        console.log(e.getTarget().className);
        var x = e.startX,
        y = e.startY;

        if (e.getTarget().className.indexOf('stcrop-image-container') === -1) { return false; }

        this.tap();

        this.cropper = Ext.create('Ext.Container', {
            height: 1,
            width: 1,
            top: y,
            left: x,
            style: 'position:absolute;z-index:10;border:1px dashed #333;background-color:rgba(0,0,0,0.3);'
        });

        Ext.Viewport.add(this.cropper);
        this.cropper.show();
    },

    drag: function (d, e, x, y) {
        var c = this.cropper,
        w = Math.max(e.startX, e.pageX) - Math.min(e.startX, e.pageX),
        h = Math.max(e.startY, e.pageY) - Math.min(e.startY, e.pageY);

        if (e.startX > e.pageX) { c.setLeft(e.startX - w); }
        if (e.startY > e.pageY) { c.setTop(e.startY - h); }

        c.setHeight(h);
        c.setWidth(w);
    },

    dragEnd: function (d, e, x, y) {
        var c = this.cropper;

        c.setHtml('<div class="stcrop-tab tab-top-left"></div>' +
    '<div class="stcrop-tab tab-top"></div>' +
    '<div class="stcrop-tab tab-top-right"></div>' +
    '<div class="stcrop-tab tab-left"></div>' +
    '<div class="stcrop-tab tab-right"></div>' +
    '<div class="stcrop-tab tab-bottom-left"></div>' +
    '<div class="stcrop-tab tab-bottom"></div>' +
    '<div class="stcrop-tab tab-bottom-right"></div>');

        c.setDraggable({
            constraint: {
                min: { x: parseInt(-c.getLeft()), y: parseInt(-(c.getTop() - this.element.dom.parentNode.offsetTop)) },
                max: { x: parseInt(this.getImageWidth() - (c.getLeft() + c.getWidth())), y: parseInt(this.getImageHeight() - (c.getTop() + c.getHeight() - this.element.dom.parentNode.offsetTop)) }
            }
        });

        console.log('top : ' + parseInt(c.getTop() - this.element.dom.parentNode.offsetTop));
        console.log('left : ' + c.getLeft());
        console.log('height : ' + c.getHeight());
        console.log('width : ' + c.getWidth());
    }
});

1 个答案:

答案 0 :(得分:1)

以下是您的问题的一些现有解决方案。我之前使用过Pinch缩放来对容器内部进行成像 - 但我不记得我是否使用过这两种中的任何一种。

  1. https://market.sencha.com/users/134/extensions/159

  2. http://www.sencha.com/forum/showthread.php?197903-Pinch-Image-with-carousel-and-working-fine