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
Sie müssen die drawText-Methode der Canvas-Klasse verwenden.
Paint paint = new Paint();
canvas.drawPaint(paint);
paint.setColor(Color.BLACK);
paint.setTextSize(16);
canvas.drawText("My Text", x, y, paint);
Hier ist die entsprechende Dokumentation über sie:
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.
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
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.