Android 未绘制自定义视图且 canvas 最大尺寸
Android custom views not being draw and canvas maximum size
我正在开发一个具有嵌入式聊天功能的应用程序。
为了在显示文本的地方绘制气泡*,我使用了从 FrameLayout 扩展的自定义视图,就像这里一样:
或此处:
*气泡 -> 你知道:圆角矩形,左边或右边有一个小箭头,具体取决于消息的撰写者
问题是,如果要显示的消息足够长(几千个字符,取决于 phone 的内存),背景可绘制对象将不再显示。
我发现这是预期的,因为我超过了最大 canvas 尺寸(在本例中为最大高度)
我知道 android 中的 canvas 最大尺寸取决于您测量它的 phone。
例如,这是旧 phone(第一代 Moto G)的限制:
这是更新的 phone 内存更多的限制:
问:有没有其他办法,定义一个任意形状的视图作为背景,克服这个限制?
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建议的背景的结果
当然,我得到了相同的结果,因为这正是我所做的,但我仍然必须对其进行测试,以防万一,你知道这是怎么回事......:)
顶部和底部带有圆角的细长方形和右侧的小三角形(全部为蓝色)是我当前解决方案的一部分(一个不让我开心但有效的解决方案:我是 "drawing" 使用这 3 个部分图像组合气泡并将文本的背景设置为相同的颜色)。文字是白色的,这就是为什么你不能真正看到它的原因。在当前代码中,我将背景设置为蓝色(不是图像,因为它不能被再次绘制 :) -,只有纯色;与您在 "bubble")
的其他部分中看到的相同
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的背景,我在里面加了很长的文字,但是形状还是存在的。
更新:
万一有人遇到这个问题:没有解决方案,如果您想像本例一样显示背景,则不能更改或超过最大 canvas 大小。
解决方案,针对我的特殊情况:
每个气泡由 4 个项目和一个相对布局组成:
- 顶部的图像,一个细长的 blue/green 圆顶角矩形
- 底部的图像,一个细长的 blue/green 圆底角矩形
- 文本本身,blue/green 颜色设置为背景
- 位于右侧或左侧的小 blue/green 三角形,根据发送消息的人来完成聊天气泡
我没有找到任何其他解决方案,这个解决方案有效。
当然,如果您想使用图像而不是纯色或简单图案作为背景,这对您不起作用
我是最初发布该问题的人,也是我从下面提出的骇人听闻的解决方案。
我找到了解决此问题的更好和更合适的方法:canvas 大小限制仅在您打开硬件加速时成为问题;所以一旦我关闭它,我就可以渲染任何大小的气泡。
硬件加速可以通过不同的方式和不同的级别进行自定义:应用程序、Activity、Window,甚至在视图级别,但有一些限制。
有关可以做什么和不可以做什么的更多信息,请参阅有关此主题的 Goggle 文档:https://developer.android.com/guide/topics/graphics/hardware-accel
我正在开发一个具有嵌入式聊天功能的应用程序。 为了在显示文本的地方绘制气泡*,我使用了从 FrameLayout 扩展的自定义视图,就像这里一样:
或此处:
*气泡 -> 你知道:圆角矩形,左边或右边有一个小箭头,具体取决于消息的撰写者
问题是,如果要显示的消息足够长(几千个字符,取决于 phone 的内存),背景可绘制对象将不再显示。
我发现这是预期的,因为我超过了最大 canvas 尺寸(在本例中为最大高度)
我知道 android 中的 canvas 最大尺寸取决于您测量它的 phone。 例如,这是旧 phone(第一代 Moto G)的限制:
这是更新的 phone 内存更多的限制:
问:有没有其他办法,定义一个任意形状的视图作为背景,克服这个限制?
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建议的背景的结果 当然,我得到了相同的结果,因为这正是我所做的,但我仍然必须对其进行测试,以防万一,你知道这是怎么回事......:)
顶部和底部带有圆角的细长方形和右侧的小三角形(全部为蓝色)是我当前解决方案的一部分(一个不让我开心但有效的解决方案:我是 "drawing" 使用这 3 个部分图像组合气泡并将文本的背景设置为相同的颜色)。文字是白色的,这就是为什么你不能真正看到它的原因。在当前代码中,我将背景设置为蓝色(不是图像,因为它不能被再次绘制 :) -,只有纯色;与您在 "bubble")
的其他部分中看到的相同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的背景,我在里面加了很长的文字,但是形状还是存在的。
更新:
万一有人遇到这个问题:没有解决方案,如果您想像本例一样显示背景,则不能更改或超过最大 canvas 大小。
解决方案,针对我的特殊情况: 每个气泡由 4 个项目和一个相对布局组成:
- 顶部的图像,一个细长的 blue/green 圆顶角矩形
- 底部的图像,一个细长的 blue/green 圆底角矩形
- 文本本身,blue/green 颜色设置为背景
- 位于右侧或左侧的小 blue/green 三角形,根据发送消息的人来完成聊天气泡
我没有找到任何其他解决方案,这个解决方案有效。 当然,如果您想使用图像而不是纯色或简单图案作为背景,这对您不起作用
我是最初发布该问题的人,也是我从下面提出的骇人听闻的解决方案。
我找到了解决此问题的更好和更合适的方法:canvas 大小限制仅在您打开硬件加速时成为问题;所以一旦我关闭它,我就可以渲染任何大小的气泡。
硬件加速可以通过不同的方式和不同的级别进行自定义:应用程序、Activity、Window,甚至在视图级别,但有一些限制。
有关可以做什么和不可以做什么的更多信息,请参阅有关此主题的 Goggle 文档:https://developer.android.com/guide/topics/graphics/hardware-accel