2013-10-03 86 views
0

我正在嘗試使用Android的Canvas和PathMeasure設置動畫路徑。在每一幀上,路徑應從源路徑中繪製路徑段,直到整個段完成。由此產生的效果應該類似於用鋼筆/鉛筆等書寫。但是,當我使用PathMeasure getSegment時,目標路徑似乎沒有繪製任何東西。在Android中設置動畫路徑?

以下代碼應以灰色繪製源路徑,以紅色繪製當前分段的終點,最後以黑色繪製路徑子分段,但僅繪製源路徑和終點(不是段) 。

public void initialize() { 

    // Path to animate 
    source = new Path(); 
    source.moveTo(0f, 10f); 
    source.quadTo(100, 10, 100, 100); 

    // temp path to store drawing segments 
    segment = new Path(); 

    pm = new PathMeasure(source, false); 

    frames = 10; 
    increment = pm.getLength()/(float)frames; 
    Log.d(TAG, "increment " + increment); 

    Paint paint = new Paint(); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setAntiAlias(true); 
    paint.setStrokeWidth(5f); 

    black = new Paint(paint); 
    black.setColor(Color.BLACK); 

    gray = new Paint(paint); 
    gray.setColor(Color.GRAY); 

    red = new Paint(paint); 
    red.setColor(Color.RED); 
} 

@Override 
public void onDraw(Canvas c) { 
    super.onDraw(c); 

    // draw the source path 
    c.drawPath(source, gray); 

    // draw the segment 
    segment.reset(); 
    pm.getSegment(0, d, segment, true); 
    c.drawPath(segment, black); 

    //RectF bounds = new RectF(); 
    //segment.computeBounds(bounds, true); 
    //Log.d(TAG, "bounds: " + bounds.toString()); 

    // draw the termination point on the segment 
    float[] pos = new float[2]; 
    float[] tan = new float[2]; 
    pm.getPosTan(d, pos, tan); 
    c.drawPoints(pos, red); 

    // update the frame index 
    frameIndex = (frameIndex + 1) % frames; 
    d = (float)frameIndex * increment; 
    Log.d(TAG, "d = " + d); 

} 
+0

只是爲了好玩,我們可以看到logcat輸出嗎? – Dave

+0

我之前沒有使用'Path'或'PathMeasure',但我的直覺是整個二次曲線被認爲是一個「段」,所以如果你的距離沒有封裝整個事物,它不會被返回。 getSegment調用的返回值是什麼? – Dave

+0

logcat輸出如您所料。 'd'根據段的長度遞增,如果取消註釋邊界代碼,則會得到正確路徑的邊界。 getSegment的返回值爲true。事實上,只要起始和結束距離參數不反轉(0 <= d),並且介於0和pm.getLength()之間,它總是正確的。您可以檢查SKIA庫中的SkPathMeasure.cpp以確認這一點。 我相信我試過用getLength做getSegment並且仍然收到一條「隱形」路徑。 – Rhomel

回答

0

嘗試增加rlineto(0,0)的分割路徑,然後使用paint.Documentation建議繪製的路徑這與Android的版本相比較小,如果你的目標SDK是4.3.This解決方案將只適用於使用小於或等於4.3。