我将如何在 Titanium 中为 Android 实现两指缩放?
我是在 Titanium 中为 iPhone 做的,因为在 Titanium for iPhone 中有一个pinch
事件和zoomScal
属性可用scroolView
:) 但这些不适用于 Android。:(
Appcelerator 档案中提供了针对 iPhone 相同问题的解决方案。
我将如何在 Titanium 中为 Android 实现两指缩放?
我是在 Titanium 中为 iPhone 做的,因为在 Titanium for iPhone 中有一个pinch
事件和zoomScal
属性可用scroolView
:) 但这些不适用于 Android。:(
Appcelerator 档案中提供了针对 iPhone 相同问题的解决方案。
这是一篇旧帖子,但这个模块Titan-android-pinchview可能对某人有用
您必须包装touchstart
、touchmove
和touchend
事件以在 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();
});
这不是一个完整的、健壮的或经过错误测试的实现,但我不能为您编写所有代码,请以此为起点进行试验。祝你好运!