web-dev-qa-db-fra.com

Comment dessiner du texte sur toile?

j'essaie de développer une classe de camembert simple pour Android. Pour l'instant, il peut prendre une carte d'étiquettes et de valeurs et dessiner le graphique à secteurs. Je n'ai pas encore ajouté les légendes de la tarte, c'est là que j'ai besoin de placer les textes près de petits rectangles dans le coin de l'écran. Toute aide appréciée, car je suis nouveau à Android dev.

31
Karthick

Vous devrez utiliser la méthode drawText de la classe Canvas.

Paint paint = new Paint(); 
canvas.drawPaint(Paint); 
Paint.setColor(Color.BLACK); 
Paint.setTextSize(16); 
canvas.drawText("My Text", x, y, Paint); 

Voici la documentation pertinente à ce sujet:

http://developer.Android.com/reference/Android/graphics/Canvas.html#drawText (Java.lang.String, float, float, Android.graphics.Paint)

51

Il y avait une autre réponse ici qui a été supprimée car il s'agissait uniquement d'un lien. Le lien d'origine est ici . Le code est fondamentalement le même, mais j'ai retiré les parties de dessin non textuelles et j'ai également augmenté les tailles pour mieux fonctionner sur les densités d'écran modernes.

Cela montre juste quelques choses que vous pouvez faire avec le dessin de texte.

enter image description here

Voici le code mis à jour:

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

Quelque chose d'autre que je veux essayer plus tard est dessiner du texte le long d'un chemin .

Voir aussi cette réponse plus complète ici qui donne l'image suivante.

enter image description here

8
Suragch

Une autre façon (sans doute meilleure) de dessiner du texte sur un canevas est d'utiliser un StaticLayout. Cela gère le texte multiligne si nécessaire.

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

Les TextPaint et StaticLayout ont été instanciés juste avant d'être utilisés ici à des fins d'illustration. Cela dans onDraw nuirait cependant aux performances. Voici un meilleur exemple les montrant dans le contexte d'une vue personnalisée qui dessine son propre texte.

1
Suragch