视图的高效“屏幕截图”?

2024-04-19

TL;DR:自从getDrawingCache()似乎触发了一个完整的重绘View当启用硬件加速时,是否有其他方法获得Bitmap(或类似的东西)可以避免这种情况,也许是通过读取填充到(硬件,软件)层的数据View最后被抽到了?


一些背景:

自 Android 3.0 起,Android 就能够镜像屏幕,例如连接到 HDMI 显示器。这可以用于演示,但这意味着观众看到的内容与演示者相同,这并不总是理想的。

新增安卓4.2Presentation,允许应用程序在“第二屏幕”(例如 HDMI 连接的显示器)上放置任意内容。在这种情况下,有时显示第二个屏幕会很有用part主平板电脑显示屏上的内容。如果您想到 Microsoft PowerPoint、LibreOffice Impress 等演示软件,在典型的双屏设置中,观众会看到当前的演示幻灯片,而演示者会看到当前的幻灯片以及计时器和演讲者注释……

对于非交互式内容,例如代表幻灯片的 PNG,这只是在两个屏幕上显示相同图像(以及主屏幕上的其他内容)的问题。

但是,对于交互式内容,例如WebView,有时很难进行这种镜像。例如,我们没有很好的方法来知道什么时候WebView可能会改变,因为它可能纯粹基于WebView它本身(例如,AJAX 调用的完成),而不是我们单独执行的操作。而且,即使我们did知道什么时候的内容WebView改变了,我们没有好办法得到其他的WebView呈现相同的内容。

所以我想我会尝试建立一个MirroringFrameLayout,这将使用getDrawingCache()检索一个Bitmap容器内容并将其交付给可以将其呈现在屏幕上的人员(例如,ImageView显示在一个Presentation).

然而,在启用硬件加速的情况下,setDrawingCacheEnabled(true) 有点无操作 http://developer.android.com/reference/android/view/View.html#setDrawingCacheEnabled%28boolean%29:

启用绘图缓存与关闭硬件加速时设置图层类似。当硬件加速打开时,启用绘图缓存对渲染没有影响,因为系统使用不同的加速机制来忽略该标志。

Calling getDrawingCache()在这些情况下强制完全draw() of the View到位图支持的Canvas,而不是实际使用缓存。自从draw()可能很昂贵,做draw()经常(例如,通过触发postOnAnimation())导致卡顿。

因此,我试图确定除此之外是否还有其他“绘图缓存”getDrawingCache(),我们可以在启用硬件加速的情况下使用它,它可以用于设置此镜像,而且效率更高。据我所知,不存在这样的缓存,因为从 SDK 应用程序的角度来看,层实际上是只写的。但是,我希望也许我缺少一些解决方案。

提前致谢!


您可以使用setLayerType(View.LAYER_TYPE_SOFTWARE, null)但它会产生副作用,使视图每次更新时重绘速度变慢。创建自定义的会更有效ViewGroup在两个画布上绘制视图(每个屏幕一个)。您也可以简单地使用ViewTreeObserver并在每次绘制回调时强制您的视图在第二个屏幕上渲染。我真的建议您不要尝试在此类用例中滥用绘图缓存/图层类型。

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

视图的高效“屏幕截图”? 的相关文章

  • 在应用程序简历中隐藏软键盘

    我有一个 Android 应用程序 使用 Xamarin 用 C 编写 我已将应用程序简化为包含 TextView 和用于横幅广告的 Google admod AdView 的 LinearLayout 我不希望软键盘出现在应用程序中 这不
  • 检测到设备正在振动?

    我使用下面的代码来振动设备 public void vibrator try Vibrator vibrator Vibrator getSystemService Context VIBRATOR SERVICE vibrator vib
  • Android第一次动画不流畅

    我正在尝试一个动画将 imageView 从屏幕底部滑动到屏幕中心 但是当我第一次执行此动画时 它不平滑 但当第二次执行动画时 它是正常且平滑的 我几乎尝试了所有方法 但无法解决我的问题 这是我的动画文件
  • 与 Admob 广告单元 ID 混淆

    我跟着tutorial https developers google com admob android quick start在我的应用程序中创建广告横幅 到目前为止 这有效 我可以看到测试广告 但是 本教程指示我在两个不同的位置使用两
  • 如何更新 Firebase 中的节点密钥?

    如何重命名14 04 2017 node 没有用于重命名节点的 API 您必须获取节点的值 使用新名称将其保存到数据库并删除旧节点
  • 在 Google Analytics 中跟踪应用程序版本

    我正在使用谷歌分析模块 https marketplace appcelerator com apps 5081 2014113336 https marketplace appcelerator com apps 5081 2014113
  • 在我的Android中,当其他应用程序想要录制音频时如何停止录音?

    在我的应用程序中 服务通过 AudioRecord 持续录制音频 当我的应用程序运行时 其他与音频记录相关的应用程序 例如 Google 搜索 无法工作 如何知道何时有其他应用想要录制音频 以便我可以停止录制以释放资源 答案是MediaRe
  • 更新到材质 1.2.0 后,材质按钮上缺少圆角半径属性

    这是我的材质按钮代码
  • 带有自定义阵列适配器的微调器不允许选择项目

    我使用自定义阵列适配器作为微调器 但是 当在下拉列表中选择一个项目时 下拉列表保留在那里 并且微调器不会更新 这是错误行为 与使用带有字符串的通用数组适配器相比 这是自定义类 我错过了什么吗 谢谢 public class Calendar
  • Flutter 深度链接

    据Flutter官方介绍深层链接页面 https flutter dev docs development ui navigation deep linking 我们不需要任何插件或本机 Android iOS 代码来处理深层链接 但它并没
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 使用 Matrix.setPolyToPoly 选择位图上具有 4 个点的区域

    我正在 Android 上使用位图 在使用 4 个点选择位图上的区域时遇到问题 并非所有 4 点组都适合我 在某些情况下 结果只是一个空白位图 而不是裁剪后的位图 如图所示 并且 logcat 中没有任何错误 甚至是内存错误 这是我用来进行
  • Android Webview 图像未加载

    我制作了一个简单的应用程序WebView 但有些图片无法加载 正确 在我的电脑上 错误 在模拟器中 Correct 错误 没有横幅 于是我用Chrome debug进行调试 发现我的代码被改变了 我不添加像noscript or style
  • 如何将设备连接到Eclipse?

    我无法解决这个简单的问题 我正在尝试通过 USB 电缆将我的设备连接到 Eclipse 在我的 PC 上 我已经安装了 Eclipse 和 Android SDK 并且在模拟器上运行该程序运行良好 我已在我的电脑上下载并安装了 Samsun
  • Android中webview的截图方法

    我在 webview 中的 html5 canvas 上画了一些线 并尝试使用下面的代码截取 webview 的屏幕截图 WebView webView WebView findViewById R id webview webView s
  • 使用 Espresso 检查 EditText 的字体大小、高度和宽度

    如何使用 Espresso 检查 EditText 的字体大小 高度和宽度 目前要分割我使用的文本 onView withId R id editText1 perform clearText typeText Amr 并阅读文本 onVi
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 无法运行我的应用程序,要求选择 Android SDK

    今天我已经安装了Android Studio 金丝雀 1 现在我无法运行我的应用程序 将出现以下对话框 我已经通过 文件 gt 项目结构 gt Android SDK 位置 设置了正确的 SDK 位置 期待您的帮助来解决这个问题 警告对话框
  • 找到 Android 浏览器中使用的 webkit 版本?

    有没有办法知道某些特定手机上的 Android 浏览器使用的是哪个版本的 webkit 软件 如果有一个您可以浏览以获取该信息的 URL 那就太好了 但任何其他方式也很好 如果你知道 webkit 版本 你就知道 html5 支持多少 至少

随机推荐

  • Kubernetes - 容器启动后执行就绪探针

    有没有办法在容器成功启动后阻止执行就绪探针 我认为活性探针应该足以监控容器的健康状况 就绪探针和活性探针的用途略有不同 就绪探针控制 Pod IP 是否包含在服务的端点列表中 以及通过外部 URL 公开时是否作为路由的目标 liveness
  • Telegram 机器人 API 键盘

    我对 Telegram Bot Api 和 ReplyKeyboard 有问题 我正在使用 Python 2 7 并发送发布请求 TelegramAPI post TELEGRAM URL sendMessage data dict cha
  • JScrollPane 中的 JTextArea 包裹单词但缺少字母

    我想做一个JOptionPane showOptionDialog和一些JTextArea and JLabel 问题是对话框太小 我没有找到任何解决方案 所以我决定将我的内容放在JScrollPane 我看到我必须把我所有的JTextAr
  • 删除 Google App Engine 中某种类型的所有数据

    我想清除 Google App Engine 中特定类型的所有数据 是什么 最好的方法来做到这一点 我写了一个删除脚本 hack 但是由于数据太多 几百条记录后超时 我目前正在通过密钥删除实体 而且似乎更快 from google appe
  • 有没有办法使用 GPU 调整图像大小?

    有没有办法使用可通过 NET 应用程序使用的 GPU 图形卡 调整图像大小 我正在寻找一种极其高效的方法来调整图像大小 并且听说 GPU 可以比 CPU 更快地完成此操作 使用 C 的 GDI 是否有已知的实现或示例代码使用 GPU 来调整
  • 无法安装 VS 2015 Update 3 [重复]

    这个问题在这里已经有答案了 所以我尝试安装 VS 2015 Update 3 顺便说一句 我有专业版 但我不断收到此屏幕 当然 现在 Update 2 已经安装 但它无法识别这一点 我需要做什么 Go to control panel gt
  • 使用 OpenCV 进行图像捕获 - 选择超时错误

    我想保存从连接 BeagleBone Black 的网络摄像头捕获的图像 但是当我运行以下代码时 出现错误 选择超时 include
  • JavaScript 不断返回 0

  • 单击时更改 TextView 的背景颜色

    我需要更改 TextView 的背景颜色 使用 ColorStateList 我可以更改字体颜色 但背景颜色不接受 ColorStateList lblEtiqueta setTextColor new ColorStateList new
  • 使用 HTTPS 回传 Paypal IPN 验证

    根据新的安全要求 2016 年 2017 年和 2018 年 在 IPN 期间 服务器和 Paypal 之间的交换似乎需要 HTTPS 这个问题与这个主题相关 https civicrm stackexchange com a 6374并且
  • wcf 错误:传入消息使用的令牌进行签名,该令牌与用于加密正文的令牌不同。这是没有预料到的

    我正在尝试使用 verisign 测试 x 509 证书调用第三方服务 当我收到响应消息时 它会生成以下错误 传入消息使用令牌进行签名 该令牌与用于加密正文的令牌不同 这是没有预料到的 我没有预料到会出现此错误 因为我只向服务提供了一个 x
  • 我们需要为每个子例程创建一个错误处理程序吗?

    我从SO中复制了一段代码作为示例 该子例程包含一个错误处理程序 是否应该为所有 Sub 制定一个错误处理程序 Public Sub SubA On Error Goto ProcError Connection Open Open File
  • 更新两个表的 SQL 触发器

    我是 SQL 新手 有人可以帮我修复下面的触发器吗 我有这 2 个表 评论和报价 我想更新评论表插入 更新和删除 从报价表中获取数据 如果更新成功 我想使用 ReviewId 和 ReviewDate 更新报价表 我使用的是Azure提供的
  • JQuery Ajax 火狐错误

    下面的代码在 Chrome 和 IE 中都可以正常工作 get ajax BTBookAppointment aspx dsl telNumberBox value date requiredDate value timeslot ddTi
  • 从连接到计算机并在成像设备中列出的相机捕获图像

    我有一台佳能 EOS 1000D 当我将其连接到计算机时 它列在 控制面板 gt 成像设备 下 我想以编程方式拍照 我猜想成像设备中列出的所有设备都具有相同的接口 可能是 TWAIN 并且具有向它们发送命令的标准方法 TWAIN可以做到吗
  • Rails 6 中是否必须手动将 ApplicationHelper 包含在 ApplicationController 中?

    控制器 class FooController lt ApplicationController def index bar method 应用程序助手 module ApplicationHelper def bar method 查看索
  • 如何禁止在Python中创建新的类属性?

    这可能看起来是一个非常基本的问题 但我在 SO 或其他地方找不到任何有用的东西 如果您参加内置课程 例如int or list 没有办法为它们创建额外的类属性 这显然是一个理想的行为 gt gt gt int x 0 Traceback m
  • 在 Django REST 框架中序列化内部方法字段

    例如 我有两个模型 Model1 and Model2 它们在模型级别上不通过任何关键字段直接相互关联 对于这两种模型 我都有序列化器 我正在寻找拥有的方式Model2查询集在Model1序列化器 例如 GET api model1 01
  • 无法在运行 apache 服务器上访问 http://localhost:80

    在 ubuntu 14 04 中运行 apache 服务器时我得到 This webpage is not available 在浏览器中或 curl 7 Failed to connect to localhost port 80 Con
  • 视图的高效“屏幕截图”?

    TL DR 自从getDrawingCache 似乎触发了一个完整的重绘View当启用硬件加速时 是否有其他方法获得Bitmap 或类似的东西 可以避免这种情况 也许是通过读取填充到 硬件 软件 层的数据View最后被抽到了 一些背景 自