当前位置: 首页 > news >正文

Android经典实战之SurfaceView原理和实践

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

SurfaceView 是一个非常强大但也相对复杂的 UI 组件,特别适用于对性能要求较高的绘制任务,如视频播放、游戏等。

1. SurfaceView 原理

SurfaceView 是一种特殊的 View,它提供了一个独立的绘制表面。与普通的 View 不同,它把绘制内容和图层的生成放在一个独立的 Surface 上。SurfaceView 的主要特点是:

  • 提供一个独立的 Surface,避免与主 UI 线程的冲突。
  • 通过独立的 Surface,可以在独立的线程进行绘制,极大地提高了绘制的效率和性能。

2. Surface 类

Surface 是一个图形接口,用于在不同的线程间传递图形缓冲区。Surface 类常与 SurfaceView、SurfaceHolder 以及 SurfaceTexture 一起使用。

  • Surface:代表一个基础的绘图表面。
  • SurfaceHolder:用于访问和控制 SurfaceView 的 Surface。
  • SurfaceTexture:用于管理基于 GPU 的纹理绘制。

3. SurfaceView 与 View 树的关系

SurfaceView 在布局上存在于 View 树中,但其内容实际上是在独立的 Surface 上进行绘制的。这使得它与普通的 View 有很大的不同:

  • 普通 View 的绘制一般是在 UI 线程上进行的,而 SurfaceView 的绘制可以在独立的线程上进行。
  • SurfaceView 在渲染时,实际的绘制表面位于自己的独立层上,这层与 View 树的其他部分是分离的。
  • SurfaceView 可能会出现与其他 View 层次关系相关的问题,如SurfaceView 总是出现在所有 View 的最上方。

4. SurfaceView 使用举例

下面是一个简单的使用 SurfaceView 绘制一个移动矩形的例子,使用 Kotlin 代码展示:

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.view.SurfaceHolder
import android.view.SurfaceViewclass CustomSurfaceView(context: Context, attrs: AttributeSet? = null) : SurfaceView(context, attrs), SurfaceHolder.Callback {private var drawingThread: Thread? = nullprivate var isRunning = falseprivate val paint = Paint().apply {color = Color.REDstyle = Paint.Style.FILL}private var positionX = 0private val speedX = 5init {holder.addCallback(this)}override fun surfaceCreated(holder: SurfaceHolder) {isRunning = truedrawingThread = Thread {while (isRunning) {val canvas: Canvas? = holder.lockCanvas()if (canvas != null) {synchronized(holder) {drawSomething(canvas)}holder.unlockCanvasAndPost(canvas)}}}drawingThread?.start()}private fun drawSomething(canvas: Canvas) {canvas.drawColor(Color.WHITE)canvas.drawRect(positionX.toFloat(), 100f, (positionX + 100).toFloat(), 200f, paint)positionX += speedXif (positionX > width) positionX = 0}override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {// Handle surface changes if needed}override fun surfaceDestroyed(holder: SurfaceHolder) {isRunning = falsedrawingThread?.join()}
}

在这个示例中,我们创建了一个 CustomSurfaceView,它继承了 SurfaceView 并实现了 SurfaceHolder.Callback 接口。在 surfaceCreated() 方法中启动了一个线程,该线程在独立的表面上绘制一个移动的矩形。

5. 需要注意的问题

使用 SurfaceView 时需要注意几个问题:

  • 线程安全:确保绘图线程能够正常停止,防止内存泄漏或异常。
  • 双重缓冲:如果需要实现平滑动画,建议使用双缓冲技术。
  • 生命周期:记得正确处理 SurfaceView 的生命周期方法,避免绘图线程在 Surface 销毁后仍然运行。
  • 与普通 View 叠加问题:由于 SurfaceView 总是处在所有 View 的最上方,可能需要特殊处理才能正确显示多层 View 的叠加效果。
  • 性能优化:在高性能场景中,注意优化绘制代码,避免在绘制方法中执行耗时操作。

总结

SurfaceView 是一个非常适用于高性能绘制任务的组件,通过理解其原理、Surface 类的作用以及与 View 树的关系,可以更好地在实际项目中加以应用。在使用过程中注意线程安全、生命周期管理以及性能优化,以确保应用的稳定性和流畅性。


欢迎关注我的公众号AntDream查看更多精彩文章!

AntDream

相关文章:

Android经典实战之SurfaceView原理和实践

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 SurfaceView 是一个非常强大但也相对复杂的 UI 组件,特别适用于对性能要求较高的绘制任务,如视频播放、游戏等。 1. Su…...

蜜罐的识别

蜜罐技术本质上是对网络攻击方欺骗的一项技术,通过在服务上布置一些仿真的系统、网络服务、或是模拟一些物联网设备来诱惑攻击方对其实施攻击从而捕获攻击行为,分析攻击手段与方式,或是收集一些攻击者的个人信息来进行分析画像达到精准溯源的…...

传感与检测技术

感知技术 传感器基本特性 静态特性 动态特性 传感器分类 电阻式传感器 通常情况下,电阻应变传感器的灵敏系数为常数 根据测量对象不同可分为...

监控平台之nodejs模拟后端接口

github:可以下载进行实验 https://github.com/Mr-Shi-root/sdk-platform/tree/master 1.配置node环境,安装express cors body-parser babel/cors body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。cookie-parse…...

TCP 协议详解

目录 一.定义 二.TCP 协议报文格式 三.确认应答(ACK)机制 四.捎带应答 五.连接管理机制 六.滑动窗口 七.快重传 八.拥塞控制 九.延时应答 十.面向字节流 十一.粘包问题 十二.异常情况 十三.TCP 小结 一.定义 传输控制协议(TCP,Transmissio…...

【转载】golang内存分配

Go 的分配采用了类似 tcmalloc 的结构.特点: 使用一小块一小块的连续内存页, 进行分配某个范围大小的内存需求. 比如某个连续 8KB 专门用于分配 17-24 字节,以此减少内存碎片. 线程拥有一定的 cache, 可用于无锁分配. 同时 Go 对于 GC 后回收的内存页, 并不是马上归还给操作系…...

TPM管理培训:学以致用,才是硬道理

全面生产维护(TotalProductiveMaintenance,TPM)作为一种先进的管理体系,正被越来越多的企业所采用,以期通过全员参与、全系统改善的方式,实现设备综合效率的最大化。然而,理论学习与实践应用之间往往存在鸿…...

2024年六月英语四级真题及解析PDF共9页

2024年六月英语四级真题及解析PDF共9页,真题就是最好的复习资料,希望对大家有所帮助。...

自闭症儿童语言干预

自闭症儿童的语言发展往往面临独特挑战,这不仅影响了他们的日常交流能力,也制约了其社交与认知的全面发展。因此,实施科学有效的语言干预对于促进自闭症儿童的语言能力至关重要。 语言干预应基于个性化原则,充分考虑每个孩子的兴…...

webpack基本使用(基础配置)

文章目录 概要理解 一、使用示例1.引入库2.创建config/webpack.dev.js 测试环境3.创建config/webpack.prod.js 正式环境3.创建eslintrc.js4.创建babel.config.js5.package.json5.main.js 总结 概要理解 vue或者react 通常用webpack作为打包工具,打包成浏览器识别的…...

在js渲染的dom中的事件中传递对象

在某些情况下&#xff0c;可能需要将整个对象或部分对象嵌入到 HTML 元素的属性中&#xff0c;可以将对象数据序列化为 JSON 字符串&#xff0c;存储在 data-* 自定义属性中。这样可以在事件中取出并解析对象数据&#xff1a; <!DOCTYPE html> <html lang"en&qu…...

服务器加速器如何应对大规模并行计算需求

服务器加速器&#xff0c;如GPU(图形处理单元)、FPGA(现场可编程门阵列)和TPU(张量处理单元)&#xff0c;在大规模并行计算需求中发挥着重要作用。它们通过提供高效的并行处理能力&#xff0c;大幅提升了计算性能&#xff0c;满足了许多领域对大规模并行计算的需求。下面详细介…...

C++/Qt 多媒体(续四)

一、前言 前边讲述到了Qt的两项独特的模块编程支持的另一项内容——多媒体编程,上篇文章具体讲述的包括采集和播放原始音频相关类的概述,而本章开始主要概述多媒体编程实现的功能中的最后两项:播放视频文件和通过摄像头拍照和录像。 对于上篇内容的示例全部代码,可…...

怎样把flv转换成mp4格式?8种可以推荐的视频转换方法

怎样把flv转换成mp4格式&#xff1f;MP4格式因其广泛的兼容性&#xff0c;几乎可以在所有设备和媒体播放器上顺畅播放&#xff0c;这极大地方便了用户的观看体验。与flv文件相比&#xff0c;MP4通常能更有效地压缩视频文件&#xff0c;既能保持较高的画质&#xff0c;又能显著减…...

【2024数学建模国赛赛题解析已出】原创免费分享

2024数模国赛赛题已正式发布 数模加油站初步分析评估了此次竞赛题目&#xff1a; A题&#xff1a;偏数学仿真建模&#xff0c;难度偏难&#xff0c;适合数学专业背景的同学 B题&#xff1a;评价决策类&#xff0c;自由度大&#xff0c;容易水&#xff0c;适合基础不太好的同…...

Windows安装使用Docker

配置Dorker环境 启用或关闭windows功能 安装wsl 以管理员身份打开windows PowerShell&#xff0c;安装相关配置 下载docker应用程序 Releases tech-shrimp/docker_installer (github.com) 安装Docker 指定安装位置 默认双击程序就开始安装了&#xff0c;要安装在指定位置…...

【wsl2】从C盘迁移到G盘

参考大神 C盘的ubuntu22.04 非常大&#xff0c;高达30g 迁移后就只有几百M了&#xff1a; 右键有一个move没有敢尝试 迁移过程 Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved.Install the latest PowerShell for new features and improveme…...

低代码技术新趋势——逆向工程

低代码的下一个趋势&#xff0c;应该是“逆向工程”&#xff0c;用户可以通过 可视化界面&#xff0c;逆向输出全栈工程代码。而标准的工程代码同样可以编译为支持可视化分析、编辑、调整的“无代码”程序。前一个是解释性语言向编译性语言的逆向工程。后者则是一个理论实践应用…...

HTTP 二、进阶

四、安全 1、TLS是什么 &#xff08;1&#xff09;为什么要有HTTPS ​ 简单的回答是“因为 HTTP 不安全”。由于 HTTP 天生“明文”的特点&#xff0c;整个传输过程完全透明&#xff0c;任何人都能够在链路中截获、修改或者伪造请求 / 响应报文&#xff0c;数据不具有可…...

【Hot100】LeetCode—35. 搜索插入位置

目录 1- 思路二分 2- 实现⭐35. 搜索插入位置——题解思路 3- ACM 实现 题目连接&#xff1a;35. 搜索插入位置 1- 思路 二分 二分左区间的三种情况。由于目标值不一定在数组中&#xff0c;因此二分的过程中有三种情况判断 2- 实现 ⭐35. 搜索插入位置——题解思路 class So…...

从Bash迁移到Zsh:Oh My Zsh实战避坑指南(含性能对比)

从Bash迁移到Zsh&#xff1a;Oh My Zsh实战避坑指南&#xff08;含性能对比&#xff09; 如果你长期使用Bash&#xff0c;可能会对Zsh的流畅补全和主题系统产生好奇。但迁移不只是换个Shell那么简单——环境变量继承、脚本兼容性和性能差异都可能成为隐形陷阱。本文将用实测数据…...

Qwen3-VL-4B Pro惊艳案例:模糊/低光照图片的高置信度语义还原

Qwen3-VL-4B Pro惊艳案例&#xff1a;模糊/低光照图片的高置信度语义还原 1. 项目简介 Qwen3-VL-4B Pro是基于阿里通义千问Qwen/Qwen3-VL-4B-Instruct模型构建的高性能视觉语言交互服务。相比轻量版的2B模型&#xff0c;这个4B版本在视觉语义理解和逻辑推理能力方面有了显著提…...

塑胶产品结构设计查询软件

塑胶产品结构设计核心要点速查指南&#xff08;基于“紫垣商驿 v3.2”软件内容整理&#xff09;本指南提炼了塑胶产品结构设计中关于胶厚、加强筋、孔的三个最关键模块的设计规范&#xff0c;旨在帮助工程师快速掌握核心原则&#xff0c;避免常见缺陷。第一章&#xff1a;胶厚&…...

Zabbix简介及部署

目录 一、Zabbix 核心介绍 1. 核心特性 2.核心组件&#xff08;架构&#xff09; 二、Zabbix 部署 步骤 1&#xff1a;系统初始化 步骤 2&#xff1a;服务器上部署zabbix-server 步骤 3&#xff1a;系统安装中文语言包 步骤 4&#xff1a;Web 界面初始化 步骤 5&#…...

全自动铺布机选购指南:核心指标与品牌实力评估

投资一台全自动铺布机是企业的重要决策。如何在海量品牌中做出最优选择&#xff1f;关键在于穿透营销宣传&#xff0c;从“硬指标”和“软实力”两个维度进行综合评估。核心性能指标张力控制精度&#xff1a;这是衡量铺布机性能的核心指标。直接决定能否处理针织、弹力、真丝等…...

推荐一些可以用于论文降重的软件(硕博防挂科必看指南)

引言&#xff1a;2026年的“学术大清洗”&#xff0c;你还在用落后时代的工具“自杀”吗&#xff1f; 前天深夜&#xff0c;我收到了一位某C9高校博士在读铁粉的求救私信&#xff1a;“学长&#xff0c;我真的要疯了&#xff01;为了盲审不出意外&#xff0c;我花钱用降重软件…...

【Verilog】从零开始:Verilog基础语法全解析

1. Verilog基础语法概述 第一次接触Verilog时&#xff0c;我盯着代码看了半天——这玩意儿既像C语言又像电路图说明书。作为硬件描述语言(HDL)&#xff0c;Verilog确实和我们熟悉的软件编程语言不太一样。它最神奇的地方在于&#xff1a;你写的每一行代码最终都会变成真实的电路…...

2026年软件测试十大趋势预测:AI将重塑一切?

站在质效革命的十字路口当软件从静态工具进化为驱动社会运转的智能神经中枢&#xff0c;其复杂性与不确定性呈指数级增长。传统质量保障体系正经历系统性重构&#xff0c;AI的深度渗透、开发范式的升维以及业务对极致体验的追求&#xff0c;共同推动软件测试迈入“质效革命”新…...

计算机毕业设计:Python天气数据爬虫可视化分析系统 Django框架 线性回归 数据分析 大数据 机器学习 大模型 气象数据(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝50W&#xff0c;前互联网大厂软件研发、集结硕博英豪成立软件开发工作室&#xff0c;专注于计算机相关专业项目实战6年之久&#xff0c;累计开发项目作品上万套。凭借丰富的经验与专业实力&#xff0c;已帮助成千上万的学生顺利毕业&#xff0c;…...

德州农机大学联合多所高校:AI从几张无序照片“脑补“出完整3D模型

这项由德州农机大学(Texas A&M University)联合澳门科技大学、西安电子科技大学、上海科技大学、香港科技大学、加州大学欧文分校等多所知名学府共同完成的研究发表于2026年4月的《ACM计算机图形学汇刊》(ACM Transactions on Graphics)第1卷第1期。这个名为UniRecGen的突破…...