2012-11-02 46 views
2

我如何在Titanium中實現Android的雙指縮放?如何在Titanium中實現Android的雙指縮放

我是在Titanium中爲iPhone製作的,因爲有一個pinch事件和zoomScal屬性可用於iPhone的Titanium中的scroolView :)但這些不適用於Android。 :(

這個解決方案同樣的問題,爲iPhone提供in the Appcelerator archives

+0

,捏活動僅適用於iOS http://docs.appcelerator.com/titanium/latest/# !/api/Titanium.UI.ScrollView(展開頁面底部的捏事件箭頭) – Ronnie

回答

0

你必須包裹touchstarttouchmovetouchend事件仿效Android的這種行爲。此外,由於許多Android設備不支持多點觸摸,你需要考慮到這一點

首先,你必須設置你的滾動視圖正確,例如,由於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() 
}); 

首先,我會嘗試跟蹤視圖中的所有活動觸摸對象。然後,如果您有兩次觸摸,請獲取它們之間的距離並將其保存爲原始縮放比例,由此可以隨着用戶移動比較新的距離。這種方法將打破,如果有兩個以上的觸摸,並不是很強大,因爲它不能解釋任何邊緣情況,但它有時會工作:-)

主要問題是鈦不通過的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(); 
}); 

這是不是一個完整的,強大的,或錯誤執行測試,但我不能爲你寫的所有代碼,實驗以此爲出發點。祝你好運!

+0

** Android不支持touchStart,touchMove和touchEnd事件,請參閱:http:// docs。 appcelerator.com/titanium/2.1/#!/api/Titanium.UI.ScrollView-event-touchmove – Ankit

+0

是的。但是我意外地使用了camlcase,所以它支持'touchstart'' touchmove''' touchend''''touchStart'。我編輯了答案來反映這一點。 **我也可以用黑體字寫出。** :-) –

+0

Android不支持zoomScale http://docs.appcelerator.com/platform/latest/#!/api/Titanium.UI.ScrollView-property-zoomScale – paulguy