2011-02-03 17 views
8

Geçerli çeviri konumunu bir Canvas'dan nasıl alabilirim? Koordinatların göreceli (birbirine) ve mutlak (tuvale) bir karışımı olduğu şeyler çizmeye çalışıyorum.Geçerli çeviri pozisyonu Canvas'da nasıl bulunur?

private static Point getCurrentTranslate(Canvas canvas) { 
    float [] pos = new float [2]; 
    canvas.getMatrix().mapPoints(pos); 
    return new Point((int)pos[0], (int)pos[1]); 
} 
... 
Point p = getCurrentTranslate(canvas); 
canvas.drawSomething(-p.x, -p.y); 

tuval bir getMatrix yöntemi vardır, bir setTranslate ama hiçbir getTranslate vardır:

Bu işler ancak kirli ben

canvas.translate(x1, y1); 
canvas.drawSomething(0, 0); // will show up at (x1, y1), all good 
// now i want to draw a point at x2,y2 
canvas.translate(x2, y2); 
canvas.drawSomething(0, 0); // will show up at (x1+x2, y1+y2) 
// i could do 
canvas.drawSomething(-x1, -y1); 
// but i don't always know those coords 

yapmak istiyorsunuz diyelim. canvas.save() ve canvas.restore()'u kullanmak istemiyorum, çünkü çizim yaptığım şey biraz zor (ve muhtemelen dağınık ...)

Geçerli koordinatları almak için daha temiz bir yol var mı?

cevap

0

Önce dönüştürme matrisini sıfırlamanız gerekir. Ben bir android geliştirici değilim, android canvas docs bakarak, sıfırlama matrisi yok, ancak bir setMatrix (android.graphics.Matrix) var. Verilen matrisin boş olup olmadığını, mevcut matrisi kimlik matrisine göre ayarlayacağınızı söyler. Bu yüzden birlikte konumunu sıfırlamak (ve ölçek ve çarpık) düşünüyorum:

canvas.setMatrix(null); 

Ayrıca getMatrix üzerinden akım çevirisini elde etmek mümkün olacaktır. matrices için kullanabileceğiniz bir mapVectors() yöntemi, [0,0] noktasının nereye eşlendiğini görmek içindir, bu sizin çeviriniz olacaktır. Ama senin durumunda matrisin sıfırlanması en iyisi.