Java 在Android中设置路径动画?

Java 在Android中设置路径动画?,java,android,android-canvas,Java,Android,Android Canvas,我正在尝试使用Android的画布和PathMeasure设置路径动画。在每个帧上,路径应从源路径绘制一个路径段,直到整个段完成。产生的效果应该类似于使用钢笔/铅笔/等进行书写。但是,当我使用PathMeasure getSegment时,目标路径似乎不会绘制任何内容 以下代码应以灰色绘制源路径,以红色绘制当前段的终止点,最后以黑色绘制路径子段,但仅绘制源路径和终止点(未绘制段) 尝试将rlineto(0,0)添加到分段路径,然后使用画图绘制路径。文档建议在低于4.3的android版本中使用此

我正在尝试使用Android的画布和PathMeasure设置路径动画。在每个帧上,路径应从源路径绘制一个路径段,直到整个段完成。产生的效果应该类似于使用钢笔/铅笔/等进行书写。但是,当我使用PathMeasure getSegment时,目标路径似乎不会绘制任何内容

以下代码应以灰色绘制源路径,以红色绘制当前段的终止点,最后以黑色绘制路径子段,但仅绘制源路径和终止点(未绘制段)


尝试将rlineto(0,0)添加到分段路径,然后使用画图绘制路径。文档建议在低于4.3的android版本中使用此方法。此解决方案仅适用于目标sdk小于或等于4.3的情况。

只是为了好玩,我们可以看到logcat输出吗?我以前没有使用过
Path
PathMeasure
,但我的直觉是,整个二次曲线被视为一个“段”,因此如果距离没有封装整个曲线,它就不会返回。
getSegment
调用的返回值是多少?logcat输出与您预期的一样d'根据段的长度递增,如果取消对边界代码的注释,则会得到正确的路径边界。getSegment的返回值为true。事实上,只要“开始”和“结束距离”参数不反转(0),则始终为真
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);

}