如何在Titanium中实现Android的双指缩放

时间:2012-11-02 10:53:14

标签: titanium titanium-mobile

我如何在Titanium中实现Android的双指缩放?

我是在Titanium中为iPhone做过的,因为在Titanium for iPhone中有pinch个事件和zoomScal属性可供使用:)但这些属性不适用于Android。 :(

针对iPhone的同一问题的此解决方案可用in the Appcelerator archives

2 个答案:

答案 0 :(得分:1)

这是一个旧帖子,但此模块titanium-android-pinchview可能对某人有用

答案 1 :(得分:0)

您必须包装touchstarttouchmovetouchend事件才能在Android中模拟此行为。此外,由于许多Android设备不支持多点触控,因此您需要考虑到这一点。

首先,您必须正确设置scrollView,例如,因为Android没有zoomScale属性,您需要使用矩阵来模拟它。像这样:

var scrollView = Ti.UI.createScrollView({... Init here...});
var contentOfScrollView = Ti.UI.createView({
    width : //..bigger than scrollview,
    height : //..bigger than scrollview,
    transform : Ti.UI.create2DMatrix()
});

首先,我会尝试跟踪视图中的所有活动触摸对象。然后,如果你有两个触摸,获取它们之间的距离并将其保存为原始缩放比例,由此可以比较用户移动时的新距离。如果有两个以上的触摸并且不是非常强大,这种方法会崩溃,因为它无法解释任何边缘情况,但它有时会起作用: - )

主要问题是Titanium没有通过触摸的ID,或者允许您进行所有触摸,因此很难跟踪移除或添加触摸时触摸的触摸。

下面是一个简单的代码示例,它会受到我上面概述的内容的影响,(我不会尝试跟踪哪个触摸是哪个),你将不得不摆弄它以使其更加强大,但我相信你可以从这里拿走它:

var touches = [];
var zoomScale = 1.0;
var lastDistance = 0.0;
var wratio = contentOfScrollView.width / scrollView.width;
var hratio = contentOfScrollView.height / scrollView.height;

现在让我们添加我们的听众。

// Listeners
scrollview.addEventListener('touchstart' , function(e) {
    touches.push({x : e.x, y : e.y});
});
scrollview.addEventListener('touchmove' , function(e) {
    if(touches.length == 2 && distance > 0) {
        // Calculate distance between touches
        var dx = touches[1].x - touches[0].x;
        var dy = touches[1].y - touches[0].y;
        var distance = Math.sqrt(dx*dx+dy*dy);

        // Heres where you would do your scaling based on whatever your
        // use case is.  You could try something like this, tune it yourself though 
        scrollView.zoomScale = lastDistance - distance;

        // Now set the matrix of the content!
        contentOfScrollView.transform.scale(zoomScale*wratio, zoomScale*hratio);
        // Save for later
        lastDistance = distance;
    } else {
        // Reset everything
        lastDistance = 0.0;
    }
});
scrollview.addEventListener('touchend' , function(e) {
    touches.pop();
});
scrollview.addEventListener('touchcancel' , function(e) {
    touches.pop();
});

这不是一个完整,健壮或经过bug测试的实现,但我无法为您编写所有代码,请以此为出发点进行试验。祝你好运!