SVG到Bé的路径;Android中的zier路径

SVG到Bé的路径;Android中的zier路径,android,android-animation,Android,Android Animation,我正在研究SVG和Bézier路径。这对我来说很新鲜。我想从SVG路径制作贝塞尔路径动画。要求为任何形状或字母设置动画,如“A”、“B”、“C”及以上。现在我不知道是否可以从一些绘图工具生成SVG路径,并将这些路径或文件提供给android中的Bézier路径(转换)。。 任何帮助都将不胜感激 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedIn

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

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

    }
}

下面的方法“readPath”是将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);
        }
    }
}
下面的方法“readPath”是将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);
        }
    }
}


那么您想要一些解析路径标记的“d”属性的代码吗?@pskink我只是想问,是否可以将svg路径转换为bezeir路径,或者我只能使用svg路径?因为我没有在Androidure中看到任何关于将SVG路径转换为bezeier路径的教程,所以它是可行的,但是。这取决于您需要svg提供多少功能standard@pskink谢谢你的帮助,,但还有一件事,您提供的链接包含有关如何创建SVG路径的信息。这很有帮助,但您是否有关于如何在android或任何小示例或类似的教程中将SVG路径转换为bezeir路径的任何信息?您提供了有关SVG路径创建的链接?@pskink in尝试了此示例代码,但效果并不理想你想要一些解析路径标记的“d”属性的代码吗?@pskink我只是想问,是否可以将svg路径转换为bezeir路径,或者我只能使用svg路径?因为我没有在Androidure中看到任何关于将SVG路径转换为bezeier路径的教程,所以它是可行的,但是。这取决于您需要svg提供多少功能standard@pskink谢谢你的帮助,,但还有一件事,您提供的链接包含有关如何创建SVG路径的信息。这很有帮助,但您是否有任何关于如何在android或任何小示例或类似的教程中将SVG路径转换为bezeir路径的信息?您提供了有关SVG路径创建的链接?@pskink in尝试了此示例代码,但不起作用请看上图。。您的代码还提供了一个巨大的空白。。如果我做错了,请纠正我。你的Activity onCreate方法是什么样子的?嗯,看起来不错,但试着在v2.2 avd emulator上测试它,就像我做的一样。事实上,我想要三星Note 2的这个功能,它也给了Spen功能。在2.2上尝试一下,看看它是否有效,如果有效,你以后会担心的。请看上图。。您的代码还提供了一个巨大的空白。。如果我做错了,请纠正我。你的Activity onCreate方法是什么样子的?嗯,看起来不错,但试着在v2.2 avd emulator上测试它,就像我做的那样。实际上,我想让三星Note 2具备这个功能,这也给了Spen功能。在2.2上尝试一下,看看它是否有效,如果有效,你以后会担心的