SurfaceView->SurfaceView基本概念

绘制过程

ViewSurfaceView绘制过程

在这里插入图片描述

  • PhoneWindowWindow的具体实现,在Activity中调用setContentView()方法时,一个PhoneWindow实例会对应一个ViewRootImpl实例,绘制,事件分发传递给ViewRootImpl进行
  • ViewRootImplView树绘制的根节点,自顶向下绘制
    • 普通View绘制:ViewRootImpl会调用View.draw(Canvas canvas)方法在Canvas对象上进行绘制,绘制完成后将绘制结果(一张Bitmap),最终交给SurfaceFlinger进行合成和显示
    • SurfaceView绘制:在绘制开始时,SurfaceView会通过SurfaceHolder.lockCanvas()方法来获取并锁定Canvas,然后在Canvas上进行绘制。通过SurfaceHolder.unlockCanvasAndPost()方法将绘制的内容提交到自己的Surface上,最终交给SurfaceFlinger进行合成和显示。SurfaceView是用来展示 Surface 数据的地方,用来控制整个 Surface 中绘制内容的位置和大小
  • Surface:每一个Surface 对应了一块屏幕缓冲区,包含了显示到屏幕的绘制内容

ViewSurfaceView的区别

  • 绘制线程:普通View是在主线程绘制的,而SurfaceView可以在子线程绘制。当绘制操作非常复杂,普通View可能会阻塞主线程,SurfaceView可以避免UI变得不流畅。

  • 重绘方式:普通View需要更新时,整个View树都需要重新绘制。而SurfaceView可以只更新自身的内容,而不影响到其他的View

  • Z轴顺序:SurfaceViewSurface则默认位于其所在窗口的背景之上、其他普通View之下

  • 透明度:普通View可以设置任意的透明度,而SurfaceView则只能是完全透明或者完全不透明。

  • 综上所述,View适合用于构建常规的用户界面,而SurfaceView则更适合用于需要频繁更新并且绘制操作复杂的场景,比如视频播放、游戏等

XML文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/cardview_dark_background"tools:context=".MainActivity"android:orientation="vertical"><com.example.drag.MySurfaceViewandroid:layout_width="match_parent"android:layout_height="match_parent"/>
</LinearLayout>

自定义SurfaceView代码

class MySurfaceView(context: Context) : SurfaceView(context), SurfaceHolder.Callback, Runnable {private val TIME_IN_FRAME = 30Lprivate var isDrawing = falseprivate var drawThread: Thread? = nullprivate var mCanvas: Canvas? = nullprivate var mPath = Path()private val mPaint = Paint().apply {color = Color.WHITEstrokeWidth = 5fstyle = Paint.Style.STROKE}init {holder.addCallback(this)isFocusable = true // 键盘事件获取焦点isFocusableInTouchMode = true // 触摸事件获取焦点keepScreenOn = true // 屏幕常亮}constructor(context: Context, attrs: AttributeSet) : this(context)constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : this(context)override fun onTouchEvent(event: MotionEvent): Boolean {val x = event.xval y = event.ywhen (event?.action) {MotionEvent.ACTION_DOWN -> {mPath.moveTo(x, y)}MotionEvent.ACTION_MOVE -> {mPath.lineTo(x, y)}MotionEvent.ACTION_UP -> {
//                mPath.reset() 会导致刷新闪烁}}return true}override fun surfaceCreated(holder: SurfaceHolder) {// 初始化操作,例如加载资源或设置画布isDrawing = truedrawThread = Thread(this).apply { start() }}override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {// 处理 Surface 尺寸变化的逻辑}override fun surfaceDestroyed(holder: SurfaceHolder) {// 释放资源,停止线程等清理操作isDrawing = false}private fun draw() {try {synchronized(holder) {mCanvas = holder.lockCanvas()
//                mCanvas?.drawColor(Color.BLACK) 清空画布// 获取Canvas对象开始绘制mCanvas?.drawPath(mPath, mPaint)}} catch (e: Exception) {Log.e(TAG, Log.getStackTraceString(e))} finally {if (mCanvas != null) {// 绘制内容提交给Surfaceholder.unlockCanvasAndPost(mCanvas)}}}override fun run() {while (isDrawing) {var startTime = System.currentTimeMillis()draw()var endTime = System.currentTimeMillis()while ((endTime-startTime) < TIME_IN_FRAME) {// 没有达到绘制帧间隔时间,线程等待Thread.sleep(TIME_IN_FRAME - (endTime - startTime))endTime = System.currentTimeMillis()}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/852015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

少样本学习元学习

基本概念 首先是机器学习&#xff1a; 然后&#xff0c;什么是元学习&#xff08;what is meta learning?) 之前&#xff0c;Component都是让人自己设置的。在Meta Learning中&#xff0c;我们期望它能够自己学出来。 不同的meta learning方法就是想办法去学learning algori…

Python记忆组合透明度语言模型

&#x1f3af;要点 &#x1f3af;浏览器语言推理识别神经网络 | &#x1f3af;不同语言秽语训练识别数据集 | &#x1f3af;交互式语言处理解释 Transformer 语言模型 | &#x1f3af;可视化Transformer 语言模型 | &#x1f3af;语言模型生成优质歌词 | &#x1f3af;模型不确…

安卓兼容的编程语言有哪些:探索多样化的开发选择

安卓兼容的编程语言有哪些&#xff1a;探索多样化的开发选择 在安卓应用开发的世界里&#xff0c;编程语言的选择丰富多样&#xff0c;每一种语言都有其独特的优势和适用场景。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入剖析安卓兼容的编程语言&#xf…

【JavaScript脚本宇宙】探索前端图形与图像库:从2D图形到图像懒加载

优化用户体验&#xff1a;探究图像懒加载库的选择 前言 在Web开发中&#xff0c;图形和图像库扮演着至关重要的角色&#xff0c;它们可以让我们轻松地操作和呈现各种图形、图像以及数据可视化。本文将介绍一系列前端开发中常用的图形和图像库&#xff0c;从2D图形到3D图形&am…

指定文件停止git跟踪方法

1、当你已经将一个文件提交到Git仓库&#xff0c;然后将其添加到.gitignore文件中&#xff0c;但Git仍然跟踪该文件时&#xff0c;这是因为Git已经开始跟踪这个文件的历史。要让Git停止跟踪这个文件&#xff0c;你需要从Git的索引中显式地删除它。以下是解决这个问题的步骤&…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(二)

主要内容介绍可tmux和vim的一些常用操作&#xff0c;可以当作笔记需要的时候进来查就行。 文章目录 前言 一、tmux和vim 二、Linux系统基本命令 1.tmux教程 2. vim教程 3.练习 总结 前言 主要内容介绍可tmux和vim的一些常用操作&#xff0c;可以当作笔记需要的时候进来查就行…

【Git系列】Git LFS常用命令的使用

前言 LFS是Large File Storage的缩写&#xff0c;是一个 Git 扩展&#xff0c;用于管理大型二进制文件&#xff0c;它允许将这些文件存储在单独的存储库中&#xff0c;以便更有效地处理 Git 仓库。 常用命令 LFS安装 git lfs 要求 git > 1.8.2 linux环境&#xff1a; …

javaWeb项目-ssm+vue中国风音乐推介网站功能介绍

本项目源码&#xff1a;java-ssmvue中国风音乐推介网站源码说明文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、…

主管面试问题

在一个电商网站的场景中&#xff0c;我会测试以下内容&#xff1a; a. 商品搜索功能&#xff1a;包括搜索结果的准确性、排序规则、关键字过滤等&#xff1b; b. 商品详情页面&#xff1a;包括商品信息的正确性、图片显示、库存数量等&#xff1b; c. 购物车功能&#xff1a;包…

Python网络爬虫5-实战网页爬取

1.需求背景 在上一篇Python网络爬虫4-实战爬取pdf中&#xff0c;以松下品牌说明书为例说明了网页爬取PDF的分析流程。在实际的应用中&#xff0c;具体代码需要根据不同的网址情况和需求进行更改。 明确要求&#xff1a; 此次&#xff0c;想要爬取苏泊尔品牌下的说明书pdf&…

开源大模型与闭源大模型浅析

引言 技术发展背景 早期语言模型 预训练与微调的范式 开源与闭源模型的兴起 当前的技术前沿 未来发展趋势 开源大模型的特点与优势 技术共享与创新加速 成本效益 社区驱动的发展 透明度和可审计性 促进教育与人才培养 灵活性和自定义 闭源大模型的特点与优势 商…

线性表-链表

前言 内存空间是所有程序的公共资源&#xff0c;在一个复杂的系统运行环境下&#xff0c;空闲的内存空间可能散落在内存各处。我们知道&#xff0c;存储数组的内存空间必须是连续的&#xff0c;而当数组非常大时&#xff0c;内存可能无法提供如此大的连续空间。此时链表的灵活…

【第5章】Vue之API风格

文章目录 前言一、选项式 API&#xff08;Options API&#xff09;1. 代码2. 效果 二、组合式 API&#xff08;Composition API&#xff09;1. 代码2. 效果 三、两者之间的区别总结 前言 Vue.js 提供了两种主要的 API 风格来组织组件的代码&#xff1a;选项式 API&#xff08;…

ios描述文件.mobileprovision 如何查看包含的设备 udid|IPA查看是否包含设备 UDID|轻松签查看证书是否包含自己设备 UDID

前言 之前蒲公英支持上传证书查看证书有效期和包含设备 【干货】IOS苹果P12证书有效性检测 及查看证书是否包含自己的设备 【干货】IOS苹果P12证书有效性检测 及查看证书是否包含自己的设备 - 路灯IT技术博客 - 后厂村路灯 如今蒲公英下架了该功能&#xff0c;已经没有证书检…

新等保2.0防护体系方案

等保2.0防护体系 吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 最近在写一些咨询相关的材料&…

计算机网络(6) TCP协议

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是互联网协议套件中一种核心协议。它提供面向连接的、可靠的字节流传输服务&#xff0c;确保数据从一端正确无误地传输到另一端。TCP的主要特点包括&#xff1a; 可靠性&#xff1a;TCP使用…

返回值返回引用返回指针之间的区别

一、返回值 当函数返回一个值时&#xff0c;实际返回的是一个变量的拷贝。 优点&#xff1a; 简单易用&#xff1b;安全&#xff0c;不会导致悬挂指针或悬挂引用&#xff1b; 缺点&#xff1a; 当返回值是一个较大的对象时会产生拷贝开销&#xff0c;影响程序性能&#xf…

PHP聚合通多平台支付平台源码

源码介绍 php聚合通多平台支付平台源码&#xff0c;源码搭建了一下&#xff0c;这个源码不复杂&#xff0c;修改一下数据库账号密码然后导入数据库就可以&#xff0c;和网站恢复备份一样简单&#xff01; 源码截图 源码下载 PHP聚合通多平台支付平台源码

Android 调用系统相册、系统相机拍照

Android 调用系统相册、系统相机拍照工具类 第一步(准备工作)&#xff1a;设置文件共享 1.1、指定 FileProvider 新建FileProvider类&#xff0c;名字随意&#xff0c;继承自FileProvider public class MainFileProvider extends FileProvider { }1.2 、清单中添加FileProv…

【小白专用 已验证24.6.7】C# MySQL数据库访问操作封装类

一、底层库介绍 本文主要介绍数据库访问操作类&#xff0c;包含&#xff1a;SQL插入脚本、SQL查询脚本、数据库表是否存在判断、带参脚本执行、包含事务回滚脚本执行、存储过程脚本等等。 特殊说明 在使用之前&#xff0c;先安装 MySql.Data 插件 二、底层库源码 2.1 程序源…