如何在canvas上绘制文字?

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

Solutions Collecting From Web of "如何在canvas上绘制文字?"

你将不得不使用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这样做会损害性能。 下面是一个更好的示例 ,在自定义视图的上下文中显示它们,并绘制它自己的文本。