Android自定义视图和画布的最大大小

时间:2019-07-15 14:39:41

标签: java android xamarin

我正在开发一个带有嵌入式聊天功能的应用程序。 为了在显示文本的地方绘制气泡*,我使用了从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

*气泡->您知道:圆角矩形,在左侧或右侧带有一个小箭头,具体取决于谁编写了邮件

问题是,如果要显示的消息足够长(当然,取决于手机,则成千上万个字符),背景可绘制对象将不再显示。

我发现这是可以预期的,因为在这些情况下,我超出了画布大小(在这种情况下为最大高度)

我知道android中的canvas最大大小取决于您要对其进行测量的手机。 例如,这是旧手机(Moto G 1st gen)的限制:

enter image description here

这是拥有更多内存的新型手机的限制:

enter image description here

问题:您能想到另一种方法来定义具有任意形状的视图作为背景,从而克服此限制吗?

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建议的背景的结果 当然,我得到的结果是相同的,因为它正是我在做的,但是仍然必须对其进行测试,以防万一,您知道这是怎么回事...:)

enter image description here

顶部和底部带有圆角的细矩形以及右侧的小三角形(全部为蓝色)是我当前解决方案的一部分(一个并不能令我满意,但可以起作用:我正在“绘制”通过使用这3个局部图像进行合成并将文本的背景设置为相同的颜色来产生气泡)。文字为白色,这就是为什么您看不到太多内容的原因。在当前代码中,我将背景设置为蓝色(不是图像,因为无法再次绘制:)-仅是纯色;就像您在“气泡”的其他部分看到的一样)

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背景,在其中添加了很长的文本,但是形状仍然存在。

更新:

enter image description here

答案 1 :(得分:0)

万一有人在为这个问题苦苦挣扎:没有解决方案,并且如果您想像这样显示背景,则不能更改或超过最大画布大小。

解决方法,对于我的特殊情况: 每个气泡由4个项目和一个相对布局组成:

  1. 顶部是图像,顶部是圆角的蓝色/绿色矩形
  2. 底部的图像,底部是圆角的蓝色/绿色细矩形
  3. 文本本身,设置的蓝色/绿色与背景颜色相同
  4. 根据谁发送消息来完成聊天气泡,位于右侧或左侧的蓝色/绿色小三角形

我没有找到其他解决方案,并且该解决方案正在工作。 当然,如果您要使用图像而不是纯色或简单图案作为背景色,这将对您不起作用

答案 2 :(得分:0)

我是最初发布该问题的人,而这个问题从下面就暗示了这种棘手和丑陋的解决方案。

我找到了一个更好,更适当的解决方案:画布大小限制仅在打开硬件加速时才是问题;所以一旦关闭它,我就可以渲染任何大小的气泡。

可以以不同的方式在不同的级别上自定义硬件加速:应用程序,活动,窗口,甚至在视图级别,但有一些限制。

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