在自定义活动中绘制 TextView?

Posted

技术标签:

【中文标题】在自定义活动中绘制 TextView?【英文标题】:Draw a TextView inside a custom activity? 【发布时间】:2011-05-20 11:20:44 【问题描述】:

我正在实现一个自定义View,我需要在其中绘制一些文本。文本必须适合一个盒子(所以我必须把它分解并使它适合)。因此,我认为我可以使用TextView 并将其绘制在我的自定义View 中。这是我尝试过的:

canvas.drawRoundRect(rect, eventRadius, eventRadius, eventBg);

canvas.save();
canvas.clipRect(rect);
TextView tv = new TextView(getContext());
tv.setText(e.getSummary());
tv.setTextColor(Color.BLACK);
tv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
tv.layout(0, 0, (int) (rect.right - rect.left), (int) (rect.bottom - rect.top));
tv.draw(canvas);
canvas.restore();

但是,什么都没有出现。我知道rect 可以,因为第一个drawRoundRect 工作正常。我错过了什么?有没有更好的办法?也许我应该扩展ViewGroup?我不确定这会如何工作。

【问题讨论】:

【参考方案1】:

不包装:

canvas.drawText(yourText, xCoord,YCoord, YourPaint);

用包装来做

protected void onDraw(Canvas canvas) 

        TextPaint tp=new TextPaint();
        tp.setARGB(255, 255, 0, 0);
        tp.setTextSize(12);
        StaticLayout sl=new StaticLayout("THIS IS SOME LONGER TEXT",tp,60,Layout.Alignment.ALIGN_NORMAL,1f,0f,true);
        sl.draw(canvas);
        

http://developer.android.com/reference/android/text/StaticLayout.html

【讨论】:

因为如果需要换行,它不会换行。 您可以使用paint.getTextBounds(char[].int,int,Rect) 自行包装它来确定它是否适合,如果不适合则包装它或更改大小。 已编辑:看看我的第二个例子。 StaticLayout 将换行,您可以设置宽度(在本例中我将其设置为 60) 我实际上最终采用了手动方法(使用TextPaint.breakText),但您的解决方案效果最好,因此我将其标记为已接受。 感谢StaticLayout 的提示!正在寻找它,但不知道它存在【参考方案2】:

我目前的解决方案是这样的:

TextView textView = new TextView(getContext());
int width = (int) (rect.right - rect.left);
int height = (int) (rect.bottom - rect.top);
textView.layout(0, 0, width, height);
textView.setText(e.getSummary());
Bitmap bitmapText = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvasText = new Canvas(bitmapText);
textView.draw(canvasText);

canvas.drawBitmap(bitmapText, rect.left, rect.top, null);

感觉很脏(而且有点不理想),但它确实有效。如果有人没有提出更好的解决方案,我将在几天内将其标记为已接受。

【讨论】:

以上是关于在自定义活动中绘制 TextView?的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义地图上绘制地理编码位置?

合并/转换textview与/到drawable

有关Android自定义TextView基准线问题

无法在自定义适配器中将 EditText 转换为 TextView

强制在自定义 WPF 控件中重新绘制自定义绘制的 UIElement

在自定义视图中绘制描边形状