2013-12-04 2 views
1

Я работаю над дорожками SVG и Bézier. Это очень ново для меня. Я хочу создать анимацию Bézier Path из SVG Paths. Требование - анимировать любую форму или букву типа «A» «B» «C» и далее. Теперь я не знаю, что это можно сделать путь SVG от некоторых инструментов для рисования и дают эти пути или файлы путей Безье (конвертировать) в андроида .. Любая помощь будет оцененаПуть SVG к Bézier Path в Android

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

    } 
} 
+0

так что вы хотите какой-то код, который разбирает «d» атрибут тега пути http://www.w3.org/TR/ SVG/paths.html # PathData? – pskink

+0

@pskink Я просто прошу, чтобы можно было преобразовать пути SVG в путь bezeir или я могу использовать только пути svg? Потому что я не видел никакого учебника по преобразованию пути SVG в bezeier paths в android – User42590

+0

уверен, что это возможно, но. это зависит от того, какие функции вам нужны из стандарта svg – pskink

ответ

5

приведенный ниже метод «readPath» - это АБСОЛЮТНЫЙ МИНИМУМ, чтобы преобразовать атрибут «d» пути SVG в 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); 
+0

См. Изображение выше .. ваш код также дает огромное пустое пространство .. if я делаю неправильно, пожалуйста, поправьте меня. – User42590

+0

Какова ваша деятельность onCreate method? – pskink

+0

Пожалуйста, см. Код ниже изображения в моем вопросе – User42590