2011-03-18 79 views
6

我正在開發我的第一個「真正的」Android應用程序,一個圖形化的工作流程編輯器。繪圖是在一個自定義類中完成的,這是View的一個子類。當時我的元素是矩形,它們在畫布上繪製。爲了檢測對元素的操作,我比較座標並檢查觸摸位置上的元素。居中放大縮小自定義視圖 - 計算畫布座標

要實現縮放手勢,我試圖http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html

用4個參數canvas.scale(...)功能爲中心的縮放效果很好,但我失去了計算畫布的能力座標使用與mPosX偏移和mPosY來檢測變焦後的觸摸是否在元素上。

我試圖改變的例子在博客帖子上面居中在畫布上縮放手勢:

canvas.save(); 
canvas.translate(mPosX, mPosY); 
canvas.scale(mScaleFactor, mScaleFactor, mScalePivotX, mScalePivotY); 
//drawing .... 
canvas.restore(); 

我沒有找到關於如何可以這樣做的任何實例不失參考偏移來計算座標。有一個簡單的解決方法嗎?我嘗試用手勢中心和縮放因子計算偏移量,但失敗:/

我已經看到使用ImageView的其他示例經常使用Matrix來轉換圖像。這可以通過自定義View和Canvas完成嗎?如果是的話,我怎麼能得到x和y偏移來檢查座標?另外,如果我的觀點完全錯誤,我會很高興看到一些關於如何正確完成的例子。

THX! ;)

+0

嗨,我面臨着居中放大的問題。目前當我放大到點(0,0),我正在使用此方法canvas.scale(scaleFactor,scaleFactor);.你怎麼計算ScalePivotX和scalePivotY? 謝謝 – sajjoo 2012-01-12 09:38:55

回答

3

也許下面的代碼可以幫助你用手勢中心和縮放因子計算座標。我在代表opengl-sprite的類中使用了這個方法。

void zoom(float scale, PointF midPoint) { 
    if (zoomFactor == MAX_ZOOM_FACTOR && scale > 1) return; 
    if (zoomFactor == MIN_ZOOM_FACTOR && scale < 1) return; 

    zoomFactor *= scale; 
    x = (x - midPoint.x) * scale + midPoint.x; 
    y = (y - height + midPoint.y) * scale + height - midPoint.y; 
    if (zoomFactor >= MAX_ZOOM_FACTOR) { 
     zoomFactor = MAX_ZOOM_FACTOR; 
    } else if (zoomFactor < MIN_ZOOM_FACTOR) { 
     zoomFactor = MIN_ZOOM_FACTOR; 
     x = 0; 
     y = 0; 
    } 
} 

X和Y座標以不同的方式處理,因爲座標系(右和上)中點的座標系統(向右和向下)的OpenGL的方向之間的區別。 midPoint取自MotionEvent的座標。

我認爲所有其他操作都是可以理解的。

希望它能幫助你。

+0

對不起,我完全忘了這個問題。我最後提出了一些非常相似的東西,但是沒有代碼來用我的解決方案更新我的問題。謝謝 – m4tt 2012-04-15 16:06:21