我如何在Titanium中实现Android的双指缩放?
我是在Titanium中为iPhone做过的,因为在Titanium for iPhone中有pinch
个事件和zoomScal
属性可供使用:)但这些属性不适用于Android。 :(
针对iPhone的同一问题的此解决方案可用in the Appcelerator archives。
答案 0 :(得分:1)
这是一个旧帖子,但此模块titanium-android-pinchview可能对某人有用
答案 1 :(得分:0)
您必须包装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();
});
这不是一个完整,健壮或经过bug测试的实现,但我无法为您编写所有代码,请以此为出发点进行试验。祝你好运!