2011-07-20 39 views
10

我正在定製視圖(extends View)和onDraw方法工作旋轉路徑。繪製在特定點

我已經作出的箭頭的路徑:

ARROW_PATH = new Path(); 
    ARROW_PATH.setLastPoint(20, 37); 
    ARROW_PATH.lineTo(14, 25); 
    ARROW_PATH.lineTo(18, 26); 
    ARROW_PATH.lineTo(17, 4); 
    ARROW_PATH.lineTo(23, 4); 
    ARROW_PATH.lineTo(22, 26); 
    ARROW_PATH.lineTo(26, 25); 
    ARROW_PATH.close(); 

在它需要被旋轉以描繪一定的角度不同的情況,我需要在特定繪製它協調在視圖中。座標也會根據場景而變化。

我已經試過玩弄但是Canvas.rotate,它看起來像路徑方面是歪斜當pxpy值不相等(箭頭變得更窄和更當py > px

我也有試圖Canvas.rotate(angle, 0, 0);然後ARROW_PATH.moveTo(x, y);,但它看起來像COORDS通過任意角度旋轉,因而很難計算所需的座標。

理想情況下,我想旋轉的路徑,而不是畫布,但我不認爲這個操作是由API支持的。

有人能提出這個問題的一個更好的辦法?

感謝頁。

回答

9

我發現使其工作的一種方式。

首先我修改了Path,使其被集中

ARROW_PATH = new Path(); 
ARROW_PATH.setLastPoint(0, 17); 
ARROW_PATH.lineTo(-6, 5); 
ARROW_PATH.lineTo(-2, 6); 
ARROW_PATH.lineTo(-3, -16); 
ARROW_PATH.lineTo(3, -16); 
ARROW_PATH.lineTo(2, 6); 
ARROW_PATH.lineTo(6, 5); 
ARROW_PATH.close(); 

,然後一個額外的呼叫翻譯幫助查找圖紙:

canvas.save(); 
canvas.rotate(angle, x, y); 
canvas.save(); 
canvas.translate(x, y); 
canvas.drawPath(ARROW_PATH, paint); 
canvas.restore(); 
canvas.restore(); 
+0

爲什麼要節省國家兩次?看起來多餘。 –

+0

在不進行雙重保存/雙重恢復的情況下進行測試......它不起作用。如果你有更好的解決方案(你已經測試過),發佈它。 – pstanton

23

這是永久旋轉的路徑的正確方法(它會保持這樣的狀態直到矩陣的下一次應用):

Matrix mMatrix = new Matrix(); 
RectF bounds = new RectF(); 
mPath.computeBounds(bounds, true); 
mMatrix.postRotate(myAngle, bounds.centerX(), bounds.centerY()); 
mPath.transform(mMatrix); 
+0

它幫助,問題的方式要求在Android畫布上圍繞其中心旋轉Path實例。 – Master

+0

Thnaks人拯救了我的一天!我不能使用_canvas.rotate(mRotation,mWidth/2,mHeight/2); _因爲我使用LayerDrawable –