在Jetpack Compose中使用SurfaceView

news2024/10/6 20:25:20

在 Android 开发中,SurfaceView 是一种特殊的视图,它拥有自己的专用绘图表面,可以在后台线程中更新,非常适合需要频繁和快速绘制的地方,如游戏和视频播放。然而,在Jetpack Compose(Google的新的 UI 工具包)中,并没有内置的 SurfaceView Composable。但这并不意味着我们无法在 Compose 中使用它。通过使用 AndroidView,我们可以在 Compose 中包装并使用传统的 Android View,包括 SurfaceView。在本文中,我将指导你如何在Jetpack Compose中使用 SurfaceView


创建 SurfaceView Composable

首先,我们需要创建一个 SurfaceView composable。和 WebView 类似,我们可以使用 AndroidView 来包装 SurfaceView

@Composable
fun ComposableSurfaceView(modifier: Modifier= Modifier){
    AndroidView(factory = {context ->
        SurfaceView(context).apply {
            layoutParams = ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT
            )
            holder.addCallback(MySurfaceCallback())//添加回调
        }

    }, modifier = modifier)
}

@Preview
@Composable
fun MainSurfaceView(){
    ComposableSurfaceView()
}

class MySurfaceCallback:SurfaceHolder.Callback {
    private var _canvas:Canvas?= null
    override fun surfaceCreated(p0: SurfaceHolder) {
        _canvas=p0.lockCanvas()
        _canvas?.drawColor(Color.WHITE)//设置背景颜色
        _canvas?.drawCircle(100f,100f,50f, Paint().apply { color=Color.RED })//绘制一个红色的图像
        p0.unlockCanvasAndPost(_canvas)
    }

    override fun surfaceChanged(p0: SurfaceHolder, p1: Int, p2: Int, p3: Int) {
        // 在这里处理Surface尺寸改变
    }

    override fun surfaceDestroyed(p0: SurfaceHolder) {
        // 在这里处理Surface销毁
    }
}

 

在这个例子中,ComposableSurfaceView 接收一个 Modifier 参数,并将其传递给 AndroidView,使得我们可以更灵活地布局和样式化我们的 SurfaceView

AndroidView 需要一个 factory 函数,该函数接受一个 Context 并返回一个 Android View。我们在这个函数中创建一个 SurfaceView 实例,并设置其布局参数。

在应用中使用 SurfaceView Composable

现在我们已经有了我们的 SurfaceView composable,我们可以在我们的应用中使用它。例如,我们可以在 MainActivity 中的 setContent 函数中使用 ComposableSurfaceView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ComposableSurfaceView()
        }
    }
}

运行应用后,你将在 MainActivity 中看到一个带有圆形的 SurfaceView

结论

虽然 Jetpack Compose 没有内置的 SurfaceView composable,但我们可以使用 AndroidView 来包装和显示传统的 Android View。这使得我们可以在 Compose 中使用 SurfaceView 和其他没有对应 Composable 的 Android View。

记住,这只是一个基础的实现。在实际的应用中,你可能需要处理更多的 SurfaceView 功能,如渲染、动画和输入事件等。

Jetpack Compose 提供了一种新的、更简洁的方式来构建 UI,而且它和传统的 Android View 可以无缝集成。这使得我们在享受 Compose 带来的好处的同时,也不会失去传统 Android View 的功能。

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

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

相关文章

dxf文件怎么转成dwg格式?分享几种简单的转换方法

将DXF文件转成DWG格式可以提高CAD文件的兼容性和功能性,使其更易于在不同的CAD软件之间传输和共享。如果我们需要与其他人共享CAD图纸,或者想要更好地利用CAD编辑软件的各种功能和工具,将文件转换为DWG格式会更好一些,那么怎么进行…

佳明手表APP开发系列02——汉字和图标的标准显示

前言 使用点阵字库的方式来汉化或者增强佳明App的显示是一种传统的方法,操作繁琐,效果也一般。笔者通过进一步的学习,发现佳明的MonkeyC支持一种新的方式,即 BmpFont文件的显示,可以像使用普通字符一样对包括汉字在内…

东芝光电耦合器TLP152(TPL,E的工作原理以及应用

东芝深力科TLP152(TPL,E是SO6封装中的光电耦合器,由GaA组成ℓ作为红外发光二极管(LED)光学耦合到集成的高增益、高速光电探测器IC芯片。光电探测器IC芯片具有内部屏蔽,提供20kV的高共模瞬态抗扰度/s,从而在输入和输出引…

MySQL-分库分表详解(二)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

港联证券|利好刺激创新药板块迎久违拉升 估值处历史低位

昨日,国家医保局就《谈判药品续约规则》及《非独家药品竞价规则》公开征求意见。在此利好消息影响下,创新药板块集体拉升。截至收盘,创新药指数涨幅近1%,实现四连阳。港股创新药指数收盘涨超3%。 机构认为政策利好创新药发展 《非…

Impala3.4源码阅读笔记(一)data-cache功能

前言 本文为笔者个人阅读Apache Impala源码时的笔记,仅代表我个人对代码的理解,个人水平有限,文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解,欢迎指正。 基本信息 data-cache是impala在本地的数据缓…

解决github无法打开问题

第一步,去如下目录复制hosts文件副本到桌面【切记,要复制到其他文件夹下,不要直接改原文件】。 C:\Windows\System32\drivers\etc 第二步,以文本文档形式打开复制的副本文件,添加如下语句保存后【替换】掉原有hosts文件…

Ubuntu 16.04 安装Arduino ESP32开发环境记录

文章目录 安装arduino开发环境:安装ESP32开发环境编译上传 安装arduino开发环境: Arduino IDE 2.x好像对于ubuntu16.04不太支持,尝试了一下执行不了。这里 我们可以下载早期的1.8.x版本。 根据自己的电脑类型在红框中选择对应的版本进行下载…

CHI 控制信号说明

(部分描述采用了他人的文章,待后续补充出处,此处为草稿) Address PA/VA 位宽之间的对应关系; Non-secure bit 该bit指示了secure和non-secure空间,对于snoopable的trans, 即使地址相同,secure和…

阿里首次公布 Java10W 字面试复盘笔记,面面俱到、太全了

Java 面试 “金三银四,金九银十”这个字眼对于程序员应该是再熟悉不过的了,每年的金三银、金九银十都会有很多程序员找工作、跳槽等一系列的安排。说实话,面试中 7 分靠能力,3 分靠技能;在刚开始的时候介绍项目都是技…

代码行数统计插件(Intellij IDEA 代码统计插件 Statistic 详细使用教程)

代码行数统计插件(Intellij IDEA 代码统计插件 Statistic 详细使用教程) 在项目的开发过程中,你有没有遇到以下的一些场景: 想统计一下整个项目的代码量有多少,比如有多少源代码文件,总体有多少行代码&…

多元分类预测 | Matlab基于灰狼优化深度置信网络(GWO-DBN)的分类预测,多特征输入模型,GWO-DBN分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab基于灰狼优化深度置信网络(GWO-DBN)的分类预测,多特征输入模型,GWO-DBN分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可…

基于深度强化学习的人岗匹配算法研究

一.需求分析 面向HR的人岗匹配功能,帮助HR高效挑选简历。模型能够根据给出的不同岗位需求,在简历库中挑选出与岗位需求最匹配的几个简历推荐给HR。岗位的常见需求包括:年龄、学历、工作年限三方面。简历也具有以下几个特征:应聘人…

第一章 SSD综述

SSD(Solid State Drive),即固态硬盘,以半导体存储数据,用纯电子电路实现,没有任何机械设备。 HDD(Hard DiskDrive),即传统机械硬盘。 一、SSD与HDD 1.1 两者的异同 1…

50从零开始学Java之万类之王Object是怎么回事?

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前面的文章中,壹哥跟大家说过,Java是面向对象的编程语言,而在面…

Ymodem协议应知应会

1.优势 在嵌入式环境中,一旦需要和设备之间通过某种协议传输文件,Ymodem协议因为具备如下特征: 基本的流控基本的握手支持多文件传输支持校验协议精简,代码量少用众多既有客户端软件可以供测试,免写上位机程序。 因…

C++11:右值引用

文章目录 1. C左值和右值2. C右值引用 右值引用是一种新的 C 语法,基于右值引用引申出了 2 种 C 编程技巧,分别为移动语义和完美转发。本文主要介绍什么是右值引用以及它的基本用法。 1. C左值和右值 右值引用可以从字面意思上理解,指的是以…

【springboot+云计算】B/S医院信息管理系统源码(云HIS)

一、基于云计算技术的B/S架构的医院管理系统(简称云HIS) 采用前后端分离架构,前端由Angular框架、JavaScript语言开发;后端使用Java语言开发。系统遵循服务化、模块化原则开发,具有强大的可扩展性,二次开发方便快捷。为医疗机构提…

2023最新ChatGPT商业运营网站源码+支持ChatGPT4.0+新增GPT联网功能+支持ai绘画+实时语音识别输入+用户会员套餐+免费更新版本

2023最新ChatGPT商业运营网站源码支持ChatGPT4.0新增GPT联网功能支持ai绘画实时语音识别输入用户会员套餐免费更新版本 一、AI创作系统二、系统程序下载三、系统介绍四、安装教程五、主要功能展示六、更新日志 一、AI创作系统 提问:程序已经支持GPT3.5、GPT4.0接口…

Python之全-新-深-细详解

文章目录 第一章 Python环境搭建1.1. 计算机基础1.1.1. 什么是编程1.1.2. 什么是进制1.1.2.1. 进制的简介1.1.2.2. 进制的分类1.1.2.3. 进制的表示1.1.2.4. 进制的转换1.1.2.5. 原反补(了解)数据的转换负数的表示补码的引入 1.2. Python的介绍1.3. Python的安装与使用1.3.1. Py…