我一直在這個問題上停留了八個小時,所以我覺得是時候得到一些幫助。畫布捏縮放到點範圍內
在開始我的問題之前,我只會讓我們知道我已經瀏覽過此網站和Google,而且我找到的答案都沒有幫助。 (This是一個,another和another)
這裏的交易:我有一個擴展SurfaceView
類(姑且稱之爲MySurface
),並覆蓋在它的許多方法。通常,它會繪製幾個正方形和文本框,這很好。只要用戶開始觸摸,它就會轉換爲Bitmap
,然後繪製直到用戶釋放的每個幀。
這裏是蹭:我想實現這樣的功能,用戶可以將兩個手指放在屏幕上,捏縮放,也可以平移(但只有兩個手指向下)。
我發現捏到變焦的幾個實現,並通過以下他們適應我Canvas
對象MySurface
:
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.scale(mScaleVector.z, mScaleVector.z); // This is the scale factor as seen below
canvas.translate(mScaleVector.x, mScaleVector.y); // These are offset values from 0,0, both working fine
// Start draw code
// ...
// End draw code
canvas.restore();
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
float factor = detector.getScaleFactor();
if (Math.abs(factor - 1.0f) >= 0.0075f) {
mScaleVector.z *= factor;
mScaleVector.z = Math.max(MIN_ZOOM, Math.min(mScaleVector.z, MAX_ZOOM));
}
// ...
invalidate();
return true;
}
}
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
if (event.getPointerCount() == 2) {
if (action == MotionEvent.ACTION_POINTER_DOWN && pointerIndex == 1) {
// The various pivot coordinate codes would belong here
}
}
detector.onTouchEvent(event); // Calls the Scale Gesture Detector
return true;
}
雖然這兩個元素做工精細 - 來回捏滾動 - 縮放 - 有一個大問題。縮放到縮放時,放大到點0,0
,而不是放大到手指點。
我已經嘗試了很多辦法來解決這個問題:
- 使用
canvas.scale(mScaleVector.z, mScaleVector.z, mScaleVector.x, mScaleVector.y);
;顯然,這會產生不想要的結果,因爲mScaleVector
x和y值是0偏移量。 - 管理使用與
translate()
方法相同的偏移量的「數據透視」座標,但這會產生相同的0,0
問題,或者在觸摸視圖時跳轉。 - 許多其他的事情......我已經做了很多與上述樞軸座標,試圖將其位置基於用戶的第一次觸摸,並將其相對於觸摸每個連續的手勢。
此外,此畫布必須是有界的,所以用戶不能永久滾動。但是,當我使用.scale(sx, sy, px, py)
方法時,它會將事物推到我在.translate()
中設置的任何邊界之外。
我很...在這一點上很開放。我知道可以添加此功能,因爲它可以在Android 4.0圖庫中查看(查看單個圖像時)。我試圖追蹤處理這個問題的源代碼,但無濟於事。
我個人直接使用'onTouchEvent'處理兩個手指位置。有了這個,你可以很容易地找到中點,以及需要多大的縮放比例。 – Doomsknight
如果你已經解決了我面臨同樣問題的問題,你可以請發佈解決方案,我的客戶是...... :(或者你能告訴我你是如何解決問題的嗎?謝謝 – AkashG