在自定义活动中绘制 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?的主要内容,如果未能解决你的问题,请参考以下文章
无法在自定义适配器中将 EditText 转换为 TextView