我正在研究SVG和Bézier路径。这对我来说很新鲜。我想从SVG Paths制作BézierPathAnimations。要求是为任何形状或字母设置动画,如“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);
}
}
答案 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);