2010-10-28 4 views
26

Ich versuche, eine einfache Tortendiagramm-Klasse für Android zu entwickeln. Vorerst kann es eine Karte von Etiketten und Werten nehmen und das Tortendiagramm zeichnen. Ich muss noch die Legenden für den Kuchen hinzufügen, wo ich die Texte in der Nähe von kleinen Rechtecken auf der Bildschirmecke platzieren muss. Irgendwelche Hilfe geschätzt, da ich neu in Android Dev bin.Wie zeichne ich Text auf Leinwand?

Antwort

1

Weitere (wohl besser) Art und Weise Text auf einer Leinwand zu zeichnen ist eine StaticLayout zu verwenden. Dies behandelt bei Bedarf mehrzeiligen Text.

String text = "This is some text."; 

TextPaint textPaint = new TextPaint(); 
textPaint.setAntiAlias(true); 
textPaint.setTextSize(16 * getResources().getDisplayMetrics().density); 
textPaint.setColor(0xFF000000); 

int width = (int) textPaint.measureText(text); 
StaticLayout staticLayout = new StaticLayout(text, textPaint, (int) width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false); 
staticLayout.draw(canvas); 

Die TextPaint und StaticLayout wurden direkt instanziiert, bevor sie für Zwecke der Darstellung hier verwendet wird. In onDraw würde dies jedoch die Leistung beeinträchtigen. Here is a better example zeigt sie im Kontext einer benutzerdefinierten Ansicht, die ihren eigenen Text zeichnet.

6

Es gab hier eine andere Antwort, die gelöscht wurde, weil es nur ein Link war. Der ursprüngliche Link lautet here. Der Code ist im Grunde der gleiche, aber ich habe die Teile für die Nicht-Text-Zeichnung herausgenommen und auch die Größen vergrößert, um besser auf modernen Bildschirmdichten zu funktionieren.

Dies zeigt nur ein paar Dinge, die Sie mit Text zeichnen können. Hier

enter image description here

ist der aktualisierte Code:

public class MainActivity extends AppCompatActivity { 

    DemoView demoview; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     demoview = new DemoView(this); 
     setContentView(demoview); 
    } 

    private class DemoView extends View { 
     public DemoView(Context context){ 
      super(context); 
     } 

     @Override protected void onDraw(Canvas canvas) { 
      super.onDraw(canvas); 

      // custom drawing code here 
      // remember: y increases from top to bottom 
      // x increases from left to right 
      int x = 0; 
      int y = 0; 
      Paint paint = new Paint(); 
      paint.setStyle(Paint.Style.FILL); 

      canvas.save(); 
      canvas.translate(100, 200); 

      // make the entire canvas white 
      canvas.drawColor(Color.WHITE); 

      // draw some text using STROKE style 
      paint.setStyle(Paint.Style.STROKE); 
      paint.setStrokeWidth(1); 
      paint.setColor(Color.MAGENTA); 
      paint.setTextSize(100); 
      canvas.drawText("Style.STROKE", 0, 0, paint); 

      canvas.translate(0, 200); 

      // draw some text using FILL style 
      paint.setStyle(Paint.Style.FILL); 
      //turn antialiasing on 
      paint.setAntiAlias(true); 
      //paint.setTextSize(30); 
      canvas.drawText("Style.FILL", 0, 0, paint); 

      canvas.translate(0, 200); 

      // draw some rotated text 
      // get text width and height 
      // set desired drawing location 
      x = 75; 
      y = 185; 
      paint.setColor(Color.GRAY); 
      //paint.setTextSize(25); 
      String str2rotate = "Rotated!"; 

      // draw bounding rect before rotating text 
      Rect rect = new Rect(); 
      paint.getTextBounds(str2rotate, 0, str2rotate.length(), rect); 
      canvas.translate(x, y); 
      paint.setStyle(Paint.Style.FILL); 
      // draw unrotated text 
      canvas.drawText("!Rotated", 0, 0, paint); 
      paint.setStyle(Paint.Style.STROKE); 
      canvas.drawRect(rect, paint); 
      // undo the translate 
      canvas.translate(-x, -y); 

      // rotate the canvas on center of the text to draw 
      canvas.rotate(-45, x + rect.exactCenterX(), 
        y + rect.exactCenterY()); 
      // draw the rotated text 
      paint.setStyle(Paint.Style.FILL); 
      canvas.drawText(str2rotate, x, y, paint); 

      //undo the translation and rotation 
      canvas.restore(); 
     } 
    } 
} 

etwas anderes, das ich später drawing text along a path ist zu versuchen.

Siehe auch this fuller answer here, die das folgende Bild ergibt.

enter image description here