Android中BézierPath的SVG路径

时间:2013-12-04 15:10:56

标签: android android-animation

我正在研究SVG和Bézier路径。这对我来说很新鲜。我想从SVG Paths制作BézierPathAnimations。要求是为任何形状或字母设置动画,如“A”“B”“C”及其后。现在我不知道是否有可能从一些绘图工具制作SVG路径并将这些路径或文件提供给Android中的Bézier路径(转换)。 任何帮助将不胜感激

updated

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

        View v = new SVGTest(this);

        setContentView(v);

    }
}

1 个答案:

答案 0 :(得分:5)

以下方法“readPath”是 ABSOLUTE MINIMUM 将SVG的路径“d”属性转换为android 路径,它只支持M,L,C和z命令,但我仍然经常使用它创建的输出 Inkscape计划:

class SVGTest extends View {
    private Path mPath;
    private Paint mPaint;
    private Path mTransformedPath;

    public SVGTest(Context context) {
        super(context);
        mPath = new Path();
        mTransformedPath = new Path();
        String d = "M 30,11 C 30,20 20,25 15,30 C 11,24 1,19 1,11 C 1,3 13,1 15,10 C 15,1 30,3 30,11 z";
        readPath(d, mPath);
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setStyle(Style.STROKE);
        mPaint.setColor(0xff00aa00);
        mPaint.setStrokeWidth(20);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        RectF src = new RectF();
        mPath.computeBounds(src, true);
        RectF dst = new RectF(30, 30, w-30, h-30);
        Matrix matrix = new Matrix();
        matrix.setRectToRect(src, dst, ScaleToFit.FILL);
        mPath.transform(matrix, mTransformedPath);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawPath(mTransformedPath, mPaint);
    }

    private void readPath(String data, Path p) {
        try {
            String[] tokens = data.split("[ ,]");
            int i = 0;
            while (i < tokens.length) {
                String token = tokens[i++];
                if (token.equals("M")) {
                    float x = Float.valueOf(tokens[i++]);
                    float y = Float.valueOf(tokens[i++]);
                    p.moveTo(x, y);
                } else
                if (token.equals("L")) {
                    float x = Float.valueOf(tokens[i++]);
                    float y = Float.valueOf(tokens[i++]);
                    p.lineTo(x, y);
                } else
                if (token.equals("C")) {
                    float x1 = Float.valueOf(tokens[i++]);
                    float y1 = Float.valueOf(tokens[i++]);
                    float x2 = Float.valueOf(tokens[i++]);
                    float y2 = Float.valueOf(tokens[i++]);
                    float x3 = Float.valueOf(tokens[i++]);
                    float y3 = Float.valueOf(tokens[i++]);
                    p.cubicTo(x1, y1, x2, y2, x3, y3);
                } else
                if (token.equals("z")) {
                    p.close();
                } else {
                    throw new RuntimeException("unknown command [" + token + "]");
                }
            }
        } catch (IndexOutOfBoundsException e) {
            throw new RuntimeException("bad data ", e);
        }
    }
}

通过在Activity.onCreate方法中放置以下代码来测试它:

View v = new SVGTest(this);
setContentView(v);