我正在开发一个带有嵌入式聊天功能的应用程序。 为了在显示文本的地方绘制气泡*,我使用了从FrameLayout扩展的自定义视图,就像在这里一样:
或此处:
*气泡->您知道:圆角矩形,在左侧或右侧带有一个小箭头,具体取决于谁编写了邮件
问题是,如果要显示的消息足够长(当然,取决于手机,则成千上万个字符),背景可绘制对象将不再显示。
我发现这是可以预期的,因为在这些情况下,我超出了画布大小(在这种情况下为最大高度)
我知道android中的canvas最大大小取决于您要对其进行测量的手机。 例如,这是旧手机(Moto G 1st gen)的限制:
这是拥有更多内存的新型手机的限制:
问题:您能想到另一种方法来定义具有任意形状的视图作为背景,从而克服此限制吗?
PD:是的,代码看起来很奇怪,因为我正在使用xamarin进行开发,但是问题是普遍存在的,而且我不关心解决方案的语言,如果确实存在:)
更新 添加了示例代码来重现此问题。
您只需要在xml中创建任何背景,假设我们将其称为“ bubble_background.xml”:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
然后将其用作TextView的背景,例如:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bubble"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/cell_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:autoLink="all"
android:linksClickable="true"
android:textSize="@dimen/atlas_text_size_message_item"
android:layout_marginRight="8dp"
android:layout_marginLeft="8dp"
android:background="@drawable/bubble_background" />
</LinearLayout>
现在,如果您的文本足够长,则背景将不可见(将TextView包装在ScrollView中是一个好主意...)
更新 这是测试@cherryBu建议的背景的结果 当然,我得到的结果是相同的,因为它正是我在做的,但是仍然必须对其进行测试,以防万一,您知道这是怎么回事...:)
顶部和底部带有圆角的细矩形以及右侧的小三角形(全部为蓝色)是我当前解决方案的一部分(一个并不能令我满意,但可以起作用:我正在“绘制”通过使用这3个局部图像进行合成并将文本的背景设置为相同的颜色来产生气泡)。文字为白色,这就是为什么您看不到太多内容的原因。在当前代码中,我将背景设置为蓝色(不是图像,因为无法再次绘制:)-仅是纯色;就像您在“气泡”的其他部分看到的一样)
答案 0 :(得分:0)
bubble_background.xml:
<?xml version="1.0" encoding="utf-8" ?>
<!-- For all properties see: http://developer.android.com/guide/topics/resources/menu-resource.html -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:bottomLeftRadius="20dp"
android:bottomRightRadius="20dp"
android:topLeftRadius="20dp"
android:topRightRadius="20dp" />
<padding
android:bottom="50dp"
android:left="50dp"
android:right="50dp"
android:top="50dp" />
<stroke android:width="10dp" android:color="#B2F7FE"/>
<solid android:color="#ffffff" />
</shape>
我将其用作TextView背景,在其中添加了很长的文本,但是形状仍然存在。
更新:
答案 1 :(得分:0)
万一有人在为这个问题苦苦挣扎:没有解决方案,并且如果您想像这样显示背景,则不能更改或超过最大画布大小。
解决方法,对于我的特殊情况: 每个气泡由4个项目和一个相对布局组成:
我没有找到其他解决方案,并且该解决方案正在工作。 当然,如果您要使用图像而不是纯色或简单图案作为背景色,这将对您不起作用
答案 2 :(得分:0)
我是最初发布该问题的人,而这个问题从下面就暗示了这种棘手和丑陋的解决方案。
我找到了一个更好,更适当的解决方案:画布大小限制仅在打开硬件加速时才是问题;所以一旦关闭它,我就可以渲染任何大小的气泡。
可以以不同的方式在不同的级别上自定义硬件加速:应用程序,活动,窗口,甚至在视图级别,但有一些限制。
有关可以做什么和不能做什么的更多信息,请参阅Goggle关于此主题的文档:https://developer.android.com/guide/topics/graphics/hardware-accel