如何在自定义视图中绘制文本?

6

我创建了一个自定义视图来绘制一个自定义的聊天气泡,现在我想在这个自定义视图上放置一些文本。我使用了drawTextOnPath,但它不能正确地工作,我希望文字逐行出现。

自定义视图 - 聊天气泡

Paint paint = new Paint();

paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
paint.setStrokeWidth(2);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);      
paint.setPathEffect(new CornerPathEffect(15) );  
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setDither(true);
paint.setShader(new LinearGradient(0, 0, 0, getHeight(), Color.BLACK, Color.WHITE,
                                                           Shader.TileMode.MIRROR));
Path path = new Path();         
paint.setShadowLayer(4, 2, 2, 0x80000000);
path.moveTo(myPath[0].x, myPath[0].y);
for (int i = 1; i < myPath.length; i++){
    path.lineTo(myPath[i].x, myPath[i].y);                  
}
path.close();
canvas.clipPath(path);
canvas.drawPath(path, paint);
canvas.save();
paint = new Paint();
paint.setColor(Color.WHITE);
canvas.drawTextOnPath(MessageBody, path, 10, 10, paint);

感谢您的选择。
2个回答

4
像这样的东西吗?(注:这是对

标签的翻译)

Paint paint = new Paint();
paint.setColor(Color.WHITE);
paint.setStyle(Style.FILL);
canvas.drawPaint(paint);
...
//tell the paint of the new color
paint.setColor(android.R.color.black);
paint.setTextSize(20);
canvas.drawText("Some Text", 10, 25, paint);

编辑:

那为什么不尝试这样做:

Path path = new Path();
path.addCircle(width/2, height/2, radius, Path.Direction.CW);

Paint paint = new Paint();
paint.setColor(Color.WHITE);
paint.setTextSize(20);
canvas.drawTextOnPath("Some Text", path, 0, 0, paint);

编辑2:

为什么不添加一个矩形?

path.addRect(left, top, right, bottom, Direction.CW);

或者

path.addRect(rect, Direction.CW);

这里的rect是什么?canvas.drawTextOnPath(MessageBody, rect, 10, 10, paint); - mc_fish
这是画圆的功能,我的自定义视图类似于矩形。 - Saeed-rz
是的,这只是一个概念验证:) 你的路径可能有错误,你试过调试了吗? - mc_fish
我使用addrect但是将文本绘制在矩形的边框上,而不是矩形内部。 - Saeed-rz
那么Paint.getTextBounds()怎么办?还有一个if语句。 - mc_fish
显示剩余3条评论

1
我在对话气泡中创建了一个矩形,就像这样。
Rect rcText;
rcText = new Rect(rcBounds);//rcBounds is y speech bubble rect
canvas.save();

限制绘图区域。

canvas.cliprect(rect);

并且像这样在气泡内部绘制文本

canvas.drawtext(mytext,rect.left,rect.top,paint);
canvas.restore();

感谢 mc_fish。

如果一个解决方案对您有用,不要编写自己的答案并接受它,而是接受帮助您的答案,并在该答案上评论您所做的确切工作(如果您进行了额外的工作)。奖励帮助您的人(在这种情况下是mc_fish)。 - Emil S.
1
我不记得为什么要写新答案并接受它,但我认为你可能是对的,那时我赞同了mc_fish的答案。感谢@EmilS指出这一点。 - Saeed-rz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接