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);
}
只是爲了好玩,我們可以看到logcat輸出嗎? – Dave
我之前沒有使用'Path'或'PathMeasure',但我的直覺是整個二次曲線被認爲是一個「段」,所以如果你的距離沒有封裝整個事物,它不會被返回。 getSegment調用的返回值是什麼? – Dave
logcat輸出如您所料。 'd'根據段的長度遞增,如果取消註釋邊界代碼,則會得到正確路徑的邊界。 getSegment的返回值爲true。事實上,只要起始和結束距離參數不反轉(0 <= d),並且介於0和pm.getLength()之間,它總是正確的。您可以檢查SKIA庫中的SkPathMeasure.cpp以確認這一點。 我相信我試過用getLength做getSegment並且仍然收到一條「隱形」路徑。 – Rhomel