如何在canvas上绘制文字?

我正在尝试为android开发一个简单的饼图类。 现在,它可以采取标签和值的地图,并绘制饼图。 我还没有添加馅饼的传说,这是我需要将文本放在屏幕angular落的小矩形附近。 任何帮助表示赞赏,因为我是Android开发新手。

  • 如何在canvas上设置animation - android
  • Android自定义视图在调用invalidate后显示为纯黑色
  • Android,绘制位图到canvas的最快方法
  • MediaStore.Images.Media.insertImage尝试保存图像时返回null
  • Android Staticlayout字体大小
  • Android 4.1.1上的HTML5canvas问题
  • 在android中创build一个可绘制和可缩放的图像视图
  • 在Android中横向绘制圆形
  • 你将不得不使用Canvas类的drawText方法。

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

    这是关于它的相关文件:

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

    这里曾经有另一个答案被删除,因为它只是一个链接。 原来的链接在这里 。 代码基本上是相同的,但是我拿出了非文本的绘图部分,并且也扩大了尺寸以更好地处理现代屏幕密度。

    这只是显示了一些可以使用文本绘图的方法。

    在这里输入图像说明

    这里是更新的代码:

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

    我想稍后尝试的其他东西是沿着path绘制文本 。

    这里也可以看到这个更完整的答案 ,下面的图片。

    在这里输入图像说明

    在canvas上绘制文本的另一种(可以说更好的方法)是使用StaticLayout 。 这需要时处理多行文本。

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

    TextPaintStaticLayout在为了说明而被使用之前被实例化。 但是,在onDraw这样做会损害性能。 下面是一个更好的示例 ,在自定义视图的上下文中显示它们,并绘制它自己的文本。