TextureView 以替换 SurfaceView,TextureView

简介: q

设计者其实也想到了这个问题,因此额外提供了一个 SurfaceHolder 的 API 接口,通过该接口,开发者可以直接拿到独立绘图表面的 Canvas 对象,以及对这个画布进行绘制操作:

// /frameworks/base/core/java/android/view/SurfaceHolder.java
public interface SurfaceHolder {
// ...
public Canvas lockCanvas();

public void unlockCanvasAndPost(Canvas canvas);
//...
}
1
2
3
4
5
6
7
8
遗憾的是,即使拿到 Canvas,开发者仍然会受到限制:

// /frameworks/base/core/java/com/android/internal/view/BaseSurfaceHolder.java
public abstract class BaseSurfaceHolder implements SurfaceHolder {

private final Canvas internalLockCanvas(Rect dirty, boolean hardware) {

if (mType == SURFACE_TYPE_PUSH_BUFFERS) {
    throw new BadSurfaceTypeException("Surface type is SURFACE_TYPE_PUSH_BUFFERS");
}
// ...

}
}
1
2
3
4
5
6
7
8
9
10
这里的代码,笔者引用 罗升阳 的 这篇文章 中的一段来解释:

注意,只有在一个 SurfaceView 的绘图表面的类型不是 SURFACE_TYPE_PUSH_BUFFERS 的时候,我们才可以自由地在上面绘制 UI。我们使用 SurfaceView 来显示摄像头预览或者播放视频时,一般就是会将它的绘图表面的类型设置为 SURFACE_TYPE_PUSH_BUFFERS 。在这种情况下,SurfaceView 的绘图表面所使用的图形缓冲区是完全由摄像头服务或者视频播放服务来提供的,因此,我们就不可以随意地去访问该图形缓冲区,而是要由摄像头服务或者视频播放服务来访问,因为该图形缓冲区有可能是在专门的硬件里面分配的。

由此可见,SurfaceView 黑屏问题的原因是综合且复杂的,无论是通过 setZOrderOnTop() 等方法设置为背景透明(但是会在页面层级的最上方),亦或者调整布局参数,都会有大大小小的一些问题。

小结
综合来看,SurfaceView 这些饱受争议的问题,从设计的角度来看,都是有其自身考量的。

而为了解决这些问题,官方后续提供了 TextureView 以替换 SurfaceView,TextureView 的原理是和 View 一样绘制到当前 Activity 的窗口上,因此不存在 SurfaceView 的这些问题。

换个角度来看,由于 TextureView 渲染依赖于主线程,因此也会导致了新的问题出现。除了性能比较 SurfaceView 会有明显下降外,还会有经常掉帧的问题,有机会笔者会另起一篇进行分享。
————————————————

相关文章
|
移动开发 安全 开发工具
如何对APP进行安全加固
移动应用中存储着大量敏感数据,为了确保APP的安全性,除了定期进行安全检测外,还需要进行有效的安全加固工作,以防止二次打包、防止篡改、防止破解等各种安全威胁,并提前进行加密和加固工作,以保护开发者和用户的利益。
|
安全
/etc/security/cacerts 只读权限
/etc/security/cacerts 只读权限
584 0
|
8月前
|
测试技术 API 开发者
持续上新!Qwen2.5-Max正式发布
持续上新!Qwen2.5-Max正式发布
持续上新!Qwen2.5-Max正式发布
|
运维 Kubernetes 监控
提升运维效率:容器化技术在现代IT基础设施中的应用
本文将探讨容器化技术如何优化企业的IT基础设施,提高部署效率和资源利用率。我们将深入分析容器技术的优势、实现步骤以及在实际运维中的应用场景。通过实例展示,帮助读者更好地理解并应用这一前沿技术,助力企业实现高效运维。
|
11月前
|
供应链 搜索推荐 API
1688APP原数据API接口的开发、应用与收益(一篇文章全明白)
1688作为全球知名的B2B电商平台,通过开放的原数据API接口,为开发者提供了丰富的数据资源,涵盖商品信息、交易数据、店铺信息、物流信息和用户信息等。本文将深入探讨1688 APP原数据API接口的开发、应用及其带来的商业收益,包括提升流量、优化库存管理、增强用户体验等方面。
542 6
|
编解码 前端开发 Android开发
Android经典实战之TextureView原理和高级用法
本文介绍了 `TextureView` 的原理和特点,包括其硬件加速渲染的优势及与其他视图叠加使用的灵活性,并提供了视频播放和自定义绘制的示例代码。通过合理管理生命周期和资源,`TextureView` 可实现高效流畅的图形和视频渲染。
861 12
|
Web App开发 测试技术 持续交付
自动化测试的利器:Selenium与Python的完美结合
【9月更文挑战第21天】在软件开发的世界里,测试是确保产品质量的关键步骤。随着敏捷开发和持续集成的流行,自动化测试工具变得尤为重要。本文将介绍如何使用Selenium和Python进行高效的自动化测试,不仅提供代码示例,还深入探讨如何设计测试用例、选择正确的测试框架、以及如何整合到CI/CD流程中。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。
229 3
|
Java Linux Windows
【Java】已解决Java中的java.lang.UnsatisfiedLinkError异常
【Java】已解决Java中的java.lang.UnsatisfiedLinkError异常
2157 0
|
Android开发
Android | Fragment.setUserVisibleHint()懒加载过时问题优化
Fragment.setUserVisibleHint()懒加载过时问题优化
862 0