使用 getDrawingCache 时是否有最大位图大小?

2023-12-13

我正在尝试创建文本的位图TextView。过去我用过这样做getDrawingCache。但是,现在我需要创建一个位图TextView文本比以前长得多。这正在造成getDrawingCache抛出 NullPointerException。

虽然我说“更长的文本”,但我并不是在谈论不合理的长。如果我创建一个宽度为 600 像素、字体大小为 24 的 TextView,则在 53 行文本处会出现异常(但在 52 行时不会出现异常)。有解决方法吗?

起初我以为这个答案,其中布局将自身绘制在canvas,就是解决方案。但是,这对我不起作用,因为我正在以编程方式创建 TextView 并且宽度和高度均为 0在他们被布置之前。我从来没有真正布局过我的TextView在屏幕上。

参考代码

private Bitmap getBitmap(Context context){

    final int NUMBER_OF_LINES = 53; // 53 crashes, 52 doesn't
    final int width = 600; // width of TextView in pixels
    final int fontSize = 24;

    // create string with NUMBER_OF_LINES
    StringBuilder testString = new StringBuilder();
    for (int i = 0; i < NUMBER_OF_LINES; i++) {
        testString.append("\n");
    }

    // Create TextView
    TextView tvText = new TextView(context);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    tvText.setTextSize(fontSize);
    tvText.setWidth(width);
    tvText.setLayoutParams(params);
    tvText.setBackgroundColor(Color.WHITE); // even setting the background color affects crashing or not
    tvText.setText(testString);

    // Create bitmap
    tvText.setDrawingCacheEnabled(true);
    tvText.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    tvText.layout(0, 0, tvText.getMeasuredWidth(), tvText.getMeasuredHeight());
    tvText.buildDrawingCache(true);
    Bitmap bitmap = Bitmap.createBitmap(tvText.getDrawingCache()); // crashes here
    tvText.setDrawingCacheEnabled(false);

    // This also didn't work because width and height are 0
    /*Bitmap bitmap = Bitmap.createBitmap(tvText.getWidth(), tvText.getHeight(),
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    tvText.draw(canvas);*/

    return bitmap;
}

空指针异常

06-21 14:20:24.628    8036-8036/com.example.testsomecode E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testsomecode/com.example.testsomecode.MainActivity}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2092)
        ...
 Caused by: java.lang.NullPointerException
        at android.graphics.Bitmap.createBitmap(Bitmap.java:494)
        at com.example.testsomecode.MainActivity.getBitmap(MainActivity.java:57) // -> Bitmap bitmap = Bitmap.createBitmap(tvText.getDrawingCache());
        at com.example.testsomecode.MainActivity.onCreate(MainActivity.java:25)
        ...

Note

这不是 IllegalArgumentException 或 OutOfMemoryError (至少不是外部的,尽管这可能是内部的原因。)

  • Android 开发者控制台中神秘的堆栈跟踪(位图大小超过 32 位)
  • 将图像加载到 Bitmap 对象时出现奇怪的内存不足问题

您可以删除buildDrawingCache方法并使用canvas。由于您是以编程方式构建视图,因此您还需要调用measure() and layout()在获得位图之前。

关键行是:

    tvText.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    tvText.layout(0, 0, tvText.getMeasuredWidth(), tvText.getMeasuredHeight());
    Bitmap bitmap = Bitmap.createBitmap(tvText.getWidth(), tvText.getHeight(),
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    tvText.draw(canvas);

这是完整的示例:

private Bitmap getBitmap(Context context){

    final int NUMBER_OF_LINES = 153;
    final int width = 600;
    final int fontSize = 24;

    // create string with NUMBER_OF_LINES
    StringBuilder testString = new StringBuilder();
    for (int i = 0; i < NUMBER_OF_LINES; i++) {
        testString.append("\n");
    }

    // Create TextView
    TextView tvText = new TextView(context);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    tvText.setTextSize(fontSize);
    tvText.setWidth(width);
    tvText.setLayoutParams(params);
    tvText.setBackgroundColor(Color.WHITE); // even setting the background color affects crashing or not
    tvText.setText(testString);
    tvText.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    tvText.layout(0, 0, tvText.getMeasuredWidth(), tvText.getMeasuredHeight());


    // Create the bitmap from the view
    Bitmap bitmap = Bitmap.createBitmap(tvText.getWidth(), tvText.getHeight(),
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    tvText.draw(canvas);

    return bitmap;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 getDrawingCache 时是否有最大位图大小? 的相关文章

随机推荐

  • 在 bash 中按特定顺序打印文件

    我有包含内容的文件 文件 txt Iteration 1 RAM 456ms Cache 142ms total 417ms Iteration 2 Spec 152ms Cache 149ms total 413ms Iteration
  • 调整字体大小后 Webview 高度不改变

    在我的应用程序中 我使用 ScrollView 这个ScrollView包含了很多Webview 我更改网络视图字体大小 webView getSettings setTextSize WebSettings TextSize LARGER
  • 使用 PKCS#8 编码的私钥创建兼容的 Java“RSA”签名

    我有 pkcs8 rsa private key 文件 它是由 openssl 从 rsa private key pem 文件生成的 我需要在python中通过私钥进行签名 使用下面的java代码进行相同的签名 public static
  • 面积图中的颜色变化

    我有一个扩展 AreaChart 的 Java 类 我想实现一种方法 或多或少是这样的 public void addNewColorToData xCoordinate yCoordinate redColor greenColor bl
  • 如何在普通 Python 3 中监听原始以太网帧?

    我正在用 Python 进行一些自学的低级网络编程 我在用着乌班图18 04 and Python 3 使用此代码 我可以发送原始以太网数据包 from socket import socket as Socket AF PACKET SO
  • 查找文本节点

    是否有一个聪明的 jQuery 选择器来选择这样的文本节点 div div
  • 如何从命令行获取正确的 Windows 版本

    如何从命令行 包括 PowerShell 获取正确的 Windows 版本 正如我尝试过的所有解决方案 答案如何从 PowerShell 命令行查找 Windows 版本 但现在没有人能够给出这个 您可以从注册表中检索它 gt e g 22
  • Java持久化API中FetchType LAZY和EAGER的区别?

    有什么区别FetchType LAZY and FetchType EAGER在 Java 持久性 API 中 有时您有两个实体 并且它们之间存在关系 例如 您可能有一个名为University另一个实体称为Student一所大学可能有很多
  • 如何在 Flutter 中使用 BottomNavigationBar 维护 Webview 状态

    我正在创建一个 Flutter 应用程序 它使用 BottomNavigationBar 在页面之间进行更改 在其中一个页面中 我有一个 Webview 我正在使用plugin由 Flutter 开发团队开发 当我导航到另一个选项卡然后返回
  • 这是创建审计跟踪的最佳方法吗?

    我正在尝试创建一些功能 以保留给定用户表单中的数据如何随时间变化的审计跟踪 并在该页面的底部提供带日期的审计 例如 02 04 09 21 49 名称从 Tom 更改为 Chris 我这样做的方法是将数据以其当前格式存储在会话中 然后在保存
  • X64 指令在不同 CPU 上表现不同

    在一次采访中 我被问到是否知道 x64 指令的行为取决于所使用的 CPU 我在任何地方都找不到任何相关文档 有谁知道这些指令是什么以及为什么会出现这种情况 有一些留下一个寄存器或一些带有未定义值的标志 英特尔和AMD 在这方面可能有所不同
  • FirebaseMessaging.instance.getInitialMessage() 不适用于启动画面

    在 GetX 状态管理的帮助下 我已将 Firebase Cloud Messaging 集成到我的 Flutter 移动应用中 我还使用 Laravel 和 Firebase Admin SDK 向我的应用程序发送通知 该通知在前台状态和
  • Dialogflow 将企业版 v2 集成到 ios 和 android 应用程序中

    我之前使用的是v1版本的dialogflow 然后他们宣布将暂停它 我将云函数中的代码迁移到了v2 但我找不到将其集成到 ios 和 android 应用程序中的方法 请帮帮我 谢谢 要将代理更新到 V2 您应该创建一个 Cloud Fun
  • 如何将 DataTable 设置为 DataGridComboBoxColum 的 ItemsSource?

    我有一个包含两列的 DataTable 我将它们绑定到 DataGridComboBoxColumn 的所有组合框 其中一列将是项目的文本 其他列将是项目的值 我知道名为 DisplayMemberPath 的属性是我将列的名称指定为项目文
  • WPF 颜色插值

    我正在尝试基于调色板绘制 WPF 控件的背景 其中每种颜色都分配有值 例如 红色 0 深绿 10 绿色 20 浅绿 30 和用户选择的值 例如 25 会给出最终的颜色 我希望生成的颜色是 2 个最接近的颜色值之间的插值 例如 对于 25 的
  • v-on:点击目标不在正确的元素中?

    我正在尝试对锚标记 使用 jQuery 做一些事情 比如在单击时更改它的颜色 但我似乎无法获得正确的目标 a span entry 1 span span entry 2 span a The 事件目标in action 是第一个或第二个跨
  • 在一个窗口中打开多个链接,然后在另一个窗口中打开多个链接

    有没有办法在浏览器中打开一堆3 4个链接window以及另外一堆 3 4 个链接另一个窗口 例如 链接 A facebook com instagram com twitter com 应在浏览器窗口中打开 chrome and 链接 B
  • 加密算法在 Android 2.1 和 2.1 以上版本上给出不同的结果

    在发布这个问题之前我已经搜索了很多 早些时候 代码可以在非 android 4 2 2 1 设备上运行 然后我用谷歌搜索并介绍了以下代码行 这部分解决了这个问题 即它现在可以在 4 2 设备上运行 但不能在 Froyo 上运行 if and
  • 如何使dialogFragment宽度与父级匹配?

    我有这个dialog fragmentt 我有两个问题 1 如何使宽度与父级匹配 请提供最干净 最好的解决方案 In the dialog fragment我有一个编辑文本 当对话框片段打开时 如何使其弹出软键盘 希望大家能够帮忙 这是我的
  • 使用 getDrawingCache 时是否有最大位图大小?

    我正在尝试创建文本的位图TextView 过去我用过这样做getDrawingCache 但是 现在我需要创建一个位图TextView文本比以前长得多 这正在造成getDrawingCache抛出 NullPointerException