3

我将如何在 Titanium 中为 Android 实现两指缩放?

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

Appcelerator 档案中提供了针对 iPhone 相同问题的解决方案。

4

2 回答 2

1

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

于 2013-11-26T12:09:48.590 回答
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();
});

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

于 2012-11-03T14:35:25.580 回答