0

Android の Canvas と PathMeasure を使用してパスをアニメーション化しようとしています。各フレームで、パスは、セグメント全体が完了するまで、ソース パスからパス セグメントを描画する必要があります。結果の効果は、ペン/鉛筆/その他で書くのと似ているはずです。ただし、PathMeasure getSegment を使用すると、宛先パスは何も描画されないようです。

次のコードは、ソース パスを灰色で、現在のセグメントの終点を赤で、最後にパス サブセグメントを黒で描画する必要がありますが、ソース パスと終点のみが描画されます (セグメントは描画されません)。

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);

}
4

1 に答える 1

0

セグメント化されたパスに rlineto(0,0) を追加してから、ペイントを使用してパスを描画してみてください。ドキュメントでは、これを 4.3 未満の Android バージョンで使用することをお勧めします。このソリューションは、ターゲット SDK が 4.3 以下の場合にのみ適用されます。

于 2015-04-27T07:25:08.113 に答える