SurfaceView中lockCanvas返回值为null

【HDR学习】TextureView绘制流程分析(四) 越来越多的应用需要使用自己的绘制引擎进行复杂内容的绘制,比如需要使用 GL 绘制 3D 的内容,或者绘制复杂的文档,图表时不希望阻塞 UI 线程,或者部分内容是通过类似 Flutter 这样的第三方 UI Toolkit 进行绘制。通常这部分内容会通过 SurfaceView 或者 TextureView 呈现在 UI 界面上。 阅读详情

最近在做一个安卓项目,需要使用TextureView或者SurfaceView对相机进行预览,在预览的同时又想要在屏幕上进行绘图操作。

于是使用lockCanvas()获取Canvas对象,但是程序就会在运行时候报错:null reference,程序崩溃。检查一下lockCanvas返回的canvas的确是null。

花了很长时间查错,终于在Android开发官网上找到了原因:

http://developer.android.com/intl/zh-cn/reference/android/view/TextureView.html

在网页的最后一段:

It is important to note that only one producer can use the TextureView. For instance, if you use a TextureView to display the camera preview, you cannot use lockCanvas() to draw onto the TextureView at the same time.

也就是说,只能有一个用户使用TextureView,在提供camera preview的同时是不可以进行Canvas的绘制的,lockCanvas()的值就是null。

在StackOverFlow上也有相似的问题:

http://stackoverflow.com/questions/2933882/how-to-draw-an-overlay-on-a-surfaceview-used-by-camera-on-andrOid

问题的原因同样是TextureView给Camera做预览以后,又进行绘图。

最后采取的解决方法是,再建一个ImageView,把这个ImageView显示在TextureView的前面,然后重写ImageView的onDraw方法,最后在屏幕上看到的就是TextureView上“绘制”了ImagView,这样就是用两个图像叠加进行显示。

SurfaceView与TextureView的绘制渲染 1.SurfaceView的初始化 SurfaceView的初始化流程发生在首次绘制前。 1.1 SurfaceControl的创建 SurfaceView在初始化过程中会创建三个SurfaceControl节点:容器节点、绘制节点、背景节点。首先会在ViewRootImpl的SurfaceControl节点下创建SurfaceView的容器节点,然后在SurfaceView的容器节点下创建SurfaceView的绘制节点和SurfaceView的背景节点。 1.2 Surface的初始化 SurfaceV 阅读详情

相关推荐

嵌入式统一消息机制:模块解耦与零拷贝通信设计

在嵌入式系统开发中,模块间通信(IMC)是影响可维护性与实时性的关键环节。传统IPC方式如全局变量、信号量或Socket易导致高耦合、调试困难及跨平台适配成本高。统一消息机制通过逻辑地址抽象、标签/实体分离、路由表驱动等原理,实现控制流与数据流解耦,在裸机、RTOS及Linux用户态保持一致接口。其技术价值在于降低模块依赖复杂度、支持动态增删与分布式迁移,并通过零拷贝优化显著减少CPU与内存开销。典型应用场景涵盖工业网关、城域交换机、多核ARM边缘设备等资源受限环境,尤其适用于需长期稳定运行、快速迭代与混合

weixin_35257663的博客 271

lockCanvas为NULL的原因

lockCanvas为NULL的原因

Android4chodison 4632

matlab电容式传感器仿真,差动电容式位移传感器的仿真研究

设计了一种差动电容式位移传感器,主要对传感器的数学模型及电容检测电路进行了仿真研究。其中检测电路设计主要包括正弦激励电路、转换桥路、信号放大电路、精密整流电路和滤波电路。最后利用Matlab/SimurFnk软件对所设计的系统进行仿真,并分析了传感器性能。仿真研究表明,传感器及其检测电路具有合理性,测量范围内具有很好的线性度。0|| I≯ lat on ii{差动容尊翩’亘研发注:湖南省教育厅资...

weixin_36323601的博客 1391

Android:getHolder().lockCanvas()返回值为null原因及解决办法

Android lockCanvas()方法返回值为空解决方案

qjyws的博客 2175

WRF和WPS模型在Ubuntu系统上的安装与常见问题解决指南

本文详细介绍了在Ubuntu系统上安装WRF和WPS模型的完整教程,涵盖系统环境配置、依赖库安装、源代码编译以及常见问题的解决方案。重点解决了WPS编译中intmath.f文件的修改、环境变量设置和编译器兼容性等关键难点,帮助用户高效部署气象研究与预报模型。

weixin_29213525的博客 382

PX4从放弃到精通(二十七):固定翼姿态控制

固件版本 PX4 1.13.2欢迎交流学习,可加左侧名片。

超维空间科技的博客 6889

surfaceHolder.lockCanvas()返回null

将surfaceview的初始工作放在onCreate中,将surfaceHolder.lockCanvas()放到onCreate外,因为在onCreate中surfaceHolder画布未创建完,所以返回会为空。

man_dzy的博客 6682

Altium Designer应用技巧5: Altium Live账号的获得

为了更好的应用Altium Designer,我们需要得到一个Altium Live账号,但从其英文或者中文官方网站取得,都需要7个工作日的时间,而且对于个人用户来说,并不是100%都能够获取到。本文介绍一种,从俄罗斯Altium官方网站获取账号的方法,可以立即使用。     1、点击http://live.altium-ru.com/#Join网址进入俄罗斯Altium官方网站,Altiu

snmplink的博客 1万+

SurfaceView多线程 画图

看到很多这样的错误

kunlamp的专栏 1862

IPv6之001-IPv6是什么

技术本质:IPv6(Internet Protocol version 6)是互联网工程任务组(IETF)设计的网络层核心协议,用于替代IPv4核心使命:解决IPv4地址枯竭问题,重构互联网基础架构,支撑万物互联时代革命性特征fill:#333;color:#333;color:#333;fill:none;IPv6128位地址空间无状态自动配置原生IPsec加密协议头部精简。

老韩的Linux云计算架构师进阶之路 1394

RoCEv2 (RDMA over Converged Ethernet) 技术详细介绍

本文深入解析RDMA over Converged Ethernet (RoCEv2)技术,该技术是AI时代算力网络的核心。文章从四个维度展开:首先阐述RDMA如何通过零拷贝和内核旁路解决传统网络的数据搬运瓶颈;接着拆解RoCEv2协议栈,对比其与InfiniBand和iWARP的特性差异;然后分析其在分布式AI训练、高性能存储等场景的关键价值;最后提供实战指南,强调无损网络配置、流量隔离和精细监控的重要性。RoCEv2虽能带来微秒级延迟和极低CPU开销,但需精心设计网络环境才能发挥最大效能。

技术引领业务创新 1392

关于GLSurfaceView lockCanvas锁定画布的问题

注:由于最近一直在研究人脸识别,其中用到了GLSurfaceView,里面遇到了一个坑,一直没找到原因,现在终于找到了,权且做个备忘录。 大家都应该知道,我们可以直接通过SurfaceView来锁定画布,在画布上面画自己想要的东西,完了,通过解锁画布,把内容渲染出来。可不知道为什么,在用GLSurfaceView是,调用lockCanvas()方法,死活不成功,报如下错误: 但是我如果自己写一个S

死磕到底 4040

人工智能---什么是Transformer?

Transformer是一种强大的神经网络架构,最初由Google的研究人员在论文《Attention is All You Need》中提出,用于自然语言处理任务,特别是在机器翻译方面取得了巨大成功。Transformer的核心思想是完全基于自注意力机制(self-attention mechanism)来实现序列到序列(sequence-to-sequence)的学习。它在自然语言处理(NLP)和其他序列到序列任务中表现出色,逐渐成为该领域的主流模型。近些年也逐渐在自动驾驶领域有所应用。

智能汽车人的博客 3955

SurfaceView

SurfaceView View的绘图机制存在如下缺陷: View缺乏双缓冲机制View每次重绘的时候都会绘制所有组件新线程无法直接更新UI组件 由于上述的几个缺陷,通过自定义的View来绘图性能底下,Android提供了一个SurfaceView来替代View,在游戏绘图方面表现的更加出色。 由于View的绘图必须在当前UI下(这也是使用Handler更新View的原

rabbit_in_android的博客 660

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

SurfaceView的LockCanvas(Rect rect)的方法总结

在刚开始学习SurfaceView的时候,关注它的原因其中一个也是因为能够按区域刷新,不用像View一样整个屏幕全部重画。但当时在测试后的时候发现了问题。发现LockCanvas(Rect rect)无效。但多点击几次后,发现又是有用的。 最初查源码,找资料,也可能跟刚开始学,没有实际的去应用,理解的不深。最近自己再开发另一个小游戏时候,选择了使用SurfaceView,再使用一段时间,...

hyshucom 193

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TextureView硬件加速lockCanvas

最近在做Android视频通话部分的需求,有一个需求是在视屏界面上显示红色的方框, 经过一段时间的纠结我发现Android4.0以上有一个控件TextureView,做视频界面的话刚好合适, 它既可以想SurfaceView那样渲染视频,又可以想View一样对它进行大小,位置,透明度处理, 就和普通的View一样。TextureView必须在硬件加速的窗口中。 看到这里,我

黑化肥发挥会挥发 6910

Android中的surfaceHolder.lockCanvas(null)返回为null详解

对于新手学习SurfaceView的时候获取lockCanvas的时候总是返回null的问题很是纠结 canvas = surfaceHolder.lockCanvas(new Rect(0, 0, 300,getWindowManager().getDefaultDisplay().getHeight())); 原因是surfaceView里面调用draw()的时候,获取的控件的...

weixin_30493321的博客 950

Android Canvas类

1. Canvas类 Canvas主要用于2D绘图,它提供了很多相应的drawXxx()方法,Canvas的获取方式有三种 重写View的onDraw(Canvas)方法 @Override protected void onDraw(Canvas canvas) { } SurfaceView通过lockCanvas()方法获取Canvas @Override ...

假装你是大灰狼的专栏 2062

Android硬件渲染之LockCanvas()

在实际开发中或许你有下面的经历: 尽管已经设置了硬件加速,通过TextureView.lockCanvas()或者通过SurfaceView.getHolder().lockCanvas()得到的Canvas通过打印Canvas.isHardwareAccelerated()会返回false。而TextureView.isHardwareAccelerated()或者SurfaceView.isH

寒江蓑笠的专栏 5127

textureView.getSurfaceTexture() == null解决办法

textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) { playVideo();//该方法里有textureView.getSurface

max12133的博客 3055
上一篇: 练手项目的小问题
下一篇: RSA算法的实现
tinyzhao
博客等级 码龄10年 184粉丝 43原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值