Android 未绘制自定义视图且 canvas 最大尺寸

Android custom views not being draw and canvas maximum size

我正在开发一个具有嵌入式聊天功能的应用程序。 为了在显示文本的地方绘制气泡*,我使用了从 FrameLayout 扩展的自定义视图,就像这里一样:

https://github.com/florent37/ShapeOfView/blob/master/shapeofview/src/main/java/com/github/florent37/shapeofview/ShapeOfView.java

或此处:

https://github.com/MasayukiSuda/BubbleLayout/blob/master/bl/src/main/java/com/daasuu/bl/BubbleLayout.java

*气泡 -> 你知道:圆角矩形,左边或右边有一个小箭头,具体取决于消息的撰写者

问题是,如果要显示的消息足够长(几千个字符,取决于 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 个项目和一个相对布局组成:

  1. 顶部的图像,一个细长的 blue/green 圆顶角矩形
  2. 底部的图像,一个细长的 blue/green 圆底角矩形
  3. 文本本身,blue/green 颜色设置为背景
  4. 位于右侧或左侧的小 blue/green 三角形,根据发送消息的人来完成聊天气泡

我没有找到任何其他解决方案,这个解决方案有效。 当然,如果您想使用图像而不是纯色或简单图案作为背景,这对您不起作用

我是最初发布该问题的人,也是我从下面提出的骇人听闻的解决方案。

我找到了解决此问题的更好和更合适的方法:canvas 大小限制仅在您打开硬件加速时成为问题;所以一旦我关闭它,我就可以渲染任何大小的气泡。

硬件加速可以通过不同的方式和不同的级别进行自定义:应用程序、Activity、Window,甚至在视图级别,但有一些限制。

有关可以做什么和不可以做什么的更多信息,请参阅有关此主题的 Goggle 文档:https://developer.android.com/guide/topics/graphics/hardware-accel