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

WMS:SurfaceView绘制显示

WMS:SurfaceView绘制显示

  • 1、SurfaceView控件使用
    • 1.1 Choreographer接受VSync信号
    • 1.2 自定义SurfaceView
    • 1.3 结果
  • 2、SurfaceView获取画布并显示
    • 2.1 SurfaceHolder.lockCanvas()
    • 2.2 SurfaceHolder.unlockCanvasAndPost(Canvas canvas)


1、SurfaceView控件使用

1.1 Choreographer接受VSync信号

Choreographer是Android提供的一个获取VSync信号的通道。这里SurfaceView控件是主动上屏绘制,而一般应用如
WMS中Choreographer 配合 VSYNC 中断信号 中添加界面时从 ViewRootImpl 的 scheduleTraversals 方法开始,其内部通过 Choreographer 的 postCallback 将绘制任务添加到 Chorographer。

Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {@Overridepublic void doFrame(long frameTimeNanos) {//当vsync信号来时会调用到这里mHandler.sendEmptyMessage(MyHandler.TAG_UPDATE_TEXT);Choreographer.getInstance().removeFrameCallback(this);Choreographer.getInstance().postFrameCallback(this);}});

1.2 自定义SurfaceView

  • MySurfaceView构造函数中获取mSurfaceHolder = this.getHolder(),并设置SurfaceHolder.Callback
  • 继承RunnableThread中运行,并Global.syncCondition.await(); 在这里等待vsync到来的通知消息
  • 线程并发处理LockCondition
public class Global {public static ReentrantLock lock = new ReentrantLock();public static Condition syncCondition = lock.newCondition();private Global() {}
}
  • Choreographer#doFrameGlobal.syncCondition.signal();通知另一条线程更新画面

com/xhbruce/ui/MySurfaceView.java

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {private static String TAG = "MySurfaceView";private SurfaceHolder mSurfaceHolder;private int autoNum = 0;private Paint mPaint = new Paint();public MySurfaceView(Context context) {this(context, null);}public MySurfaceView(Context context, AttributeSet attrs) {this(context, attrs , 0);}public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mSurfaceHolder = this.getHolder();mSurfaceHolder.addCallback(this);Log.d(TAG, "MySurfaceView(3) holder=" + mSurfaceHolder.toString());}public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);mSurfaceHolder = this.getHolder();mSurfaceHolder.addCallback(this);Log.d(TAG, "MySurfaceView(4) holder=" + mSurfaceHolder.toString());}@Overridepublic void surfaceCreated(@NonNull SurfaceHolder holder) {Log.d(TAG, "surfaceCreated() holder=" + holder.toString());new Thread(this).start();
//        draw();//画蓝色或绿色}@Overridepublic void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(@NonNull SurfaceHolder holder) {}@Overridepublic void run() {while (true) {Log.d(TAG, "run() autoNum=" + autoNum);Global.lock.lock();try {Global.syncCondition.await();//在这里等待vsync到来的通知消息} catch (InterruptedException e) {e.printStackTrace();} finally {Global.lock.unlock();}draw();//画蓝色或绿色}}private void draw() {Canvas mCanvas = null;try {mCanvas = mSurfaceHolder.lockCanvas();if (autoNum % 2 == 0) {mPaint.setColor(Color.BLUE);//如果为双数则画面画成蓝色} else {mPaint.setColor(Color.GREEN);//如果为单数则画面画成绿色}mCanvas.drawRect(0, 0, getRight(), getBottom(), mPaint);} catch (Exception e) {e.printStackTrace();} finally {if (mCanvas != null) {mSurfaceHolder.unlockCanvasAndPost(mCanvas);}}Log.d(TAG, "draw() autoNum=" + autoNum);autoNum++;//数字加1}
}

对应Activity和xml布局文件:
com/xhbruce/surfaceviewtest/MySurfaceViewTest.java

public class MySurfaceViewTest extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_my_surface_view_test);Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {@Overridepublic void doFrame(long frameTimeNanos) {//当vsync信号来时会调用到这里Global.lock.lock();try {Global.syncCondition.signal();//通知另一条线程更新画面} catch (Exception e) {e.printStackTrace();} finally {Global.lock.unlock();}Choreographer.getInstance().removeFrameCallback(this);Choreographer.getInstance().postFrameCallback(this);}});}
}

layout/activity_my_surface_view_test.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MySurfaceViewTest"><com.xhbruce.ui.MySurfaceViewandroid:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout>

1.3 结果

SurfaceView Demo

2、SurfaceView获取画布并显示

  • SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布
  • SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。

2.1 SurfaceHolder.lockCanvas()

Surface的lock方法最终调用到GraphicBufferProducerdequeueBuffer函数获取一个Slot,如果Slot没有分配GraphicBuffer会在这时给它分配GraphicBuffer, 然后会返回一个带有BUFFER_NEEDS_REALLOCATION标记的flag, 应用侧看到这个flag后会通过requestBuffer和importBuffer接口把GraphicBuffer映射到自已的进程空间。

在这里插入图片描述

2.2 SurfaceHolder.unlockCanvasAndPost(Canvas canvas)

SurfaceView在更新视图时用到了两张Canvas,一张frontCanvas和一张backCanvas,每次实际显示的是frontCanvas,backCanvas存储的是上一次更改前的视图,当使用lockCanvas()获取画布时,得到的实际上是backCanvas而不是正在显示的frontCanvas,之后你在获取到的backCanvas上绘制新视图,再unlockCanvasAndPost(Canvas canvas)此视图,那么上传的这张canvas将替换原来的frontCanvas作为新的frontCanvas,原来的frontCanvas将切换到后台作为backCanvas。

在这里插入图片描述

相关文章:

WMS:SurfaceView绘制显示

WMS:SurfaceView绘制显示 1、SurfaceView控件使用1.1 Choreographer接受VSync信号1.2 自定义SurfaceView1.3 结果 2、SurfaceView获取画布并显示2.1 SurfaceHolder.lockCanvas()2.2 SurfaceHolder.unlockCanvasAndPost(Canvas canvas) 1、SurfaceView控件使用 1.1 Choreograph…...

【Spring系列篇--关于IOC的详解】

目录 面试经典题目&#xff1a; 1. 什么是spring&#xff1f;你对Spring的理解&#xff1f;简单来说&#xff0c;Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 2.什么是IoC&#xff1f;你对IoC的理解&#xff1f;IoC的重要性?将实例化对象的权利从程序员…...

__ob__: Observer 后缀的数组的取值方式

开发中&#xff0c;经常从接口、父组件中&#xff0c;拿到数组然后给新的数组使用&#xff0c; 但是&#xff0c;有时候会发现带有 __ob__: Observer 后缀的数组&#xff0c;对这种数组来说&#xff0c;你是无法取到这个数组的值的&#xff0c; 而且&#xff0c;离谱的是consol…...

时序预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计学习总结参考资料 预测效果 基本介绍 时序预测 | MATLAB实现…...

Java基础知识点

Java是一种高级计算机语言&#xff0c;是可以编写跨平台应用软件、完全面向对象的程序设计语言。 2、Java划分为三个技术平台&#xff1a;Java SE、Java EE、Java ME Java SE是桌面应用&#xff0c;Java EE是web应用&#xff0c;平台企业版&#xff0c;Java ME是手机应用&#…...

攻防世界-web-fileclude

1. 题目描述 打开链接&#xff0c;可以看到如下代码&#xff1a; 代码意思很简单&#xff0c;让我们传递两个参数&#xff0c;一个file1&#xff0c;一个file2&#xff0c;如果file2的内容为hello ctf&#xff0c;那么就可以在代码中include file1 2. 思路分析 这道题显然是…...

【100天精通python】Day36:GUI界面编程_高级功能操作和示例

专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12375510.html 一、GUI 高级功能 1 自定义主题和样式 自定义主题和样式可以让你的GUI应用程序在外观方面更加出色。在使用Tkinter时&#xff0c;你可以使用ttkthemes库来应用不同的主题和样式。…...

无涯教程-Perl - sub函数

描述 此函数定义一个新的子例程。上面显示的参数遵循以下规则- NAME是子例程的名称。可以在有或没有原型规范的情况下预先声明命名的子例程(没有关联的代码块)。 匿名子例程必须具有定义。 PROTO定义了函数的原型,调用该函数以验证提供的参数时将使用该原型。 ATTRS为解析…...

wpf控件上移下移,调整子集控件显示顺序

页面代码: <!-- 导出A2,自定义导出设置列,添加时间:2023-8-9 14:14:18,作者:whl; --><Window x:Class="WpfSnqkGasAnalysis.WindowGasExportA2"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http:/…...

cesium学习记录08-鼠标绘制多边形

上一篇学习了实体的一些基础知识&#xff0c;这一篇来学习鼠标绘制实体多边形的实现 一、方法一&#xff1a; 1&#xff0c;结果显示 贴地&#xff1a; 不贴地&#xff1a; 2&#xff0c;方法全部代码&#xff1a; 主方法&#xff1a; /*** 绘制多边形* param {Object} op…...

rocketMq启动broker报错找不到或无法加载主类 Files\Java\jdk1.8.0_171\lib\dt.jar;C:\Program]

假如弹出提示框提示‘错误: 找不到或无法加载主类 xxxxxx’。 1.打开runbroker.cmd 将"%CLASSPATH%"加上英文双引号&#xff0c;切勿别加中文双引号 2.打开runserver.cmd 同理 将"%CLASSPATH%"加上英文双引号&#xff0c;切勿别加中文双引号 3.正常执行即…...

Linux touch 命令指南大全

1. 概述 在本教程中,我们将学习touch命令。简而言之,这个命令允许我们更新文件或目录的最后修改时间和最后访问时间。 因此,我们将重点关注如何使用该命令及其各种选项。 请注意,我们使用 Bash 测试了此处显示的所有命令;但是,它们应该与任何兼容 POSIX 的 shell 一起使…...

华为网络篇 RIPv2的基础配置-25

难度 1复杂度1 目录 一、实验原理 1.1 RIP的版本 1.2 RIP的路由更新方式 1.3 RIP的计时器 1.4 RIP的防环机制 二、实验拓扑 三、实验步骤 四、实验过程 总结 一、实验原理 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;&am…...

fastadmin 下拉多级分类

要实现下图效果 一、先创建数据表 二、在目标的controll中引入use fast\Tree; public function _initialize() {parent::_initialize();$this->model new \app\admin\model\zxdc\Categorys;$tree Tree::instance();$tree->init(collection($this->model->order(…...

时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 MATLAB实现基…...

RabbitMQ工作流程详解

1 生产者发送消息的流程 (1)生产者连接RabbitMQ&#xff0c;建立TCP连接(Connection)&#xff0c;开启信道(Channel) (2)生产者声明一个Exchange (交换器)&#xff0c;并设置相关属性&#xff0c;比如交换器类型、是否持久化等 (3)生产者声明一个队列井设置相关属性&#xf…...

LabVIEW使用图像处理进行交通控制性能分析

LabVIEW使用图像处理进行交通控制性能分析 采用普雷维特、拉普拉斯、索贝尔和任意的空间域方法对存储的图像进行边缘检测&#xff0c;并获取实时图像。然而&#xff0c;对四种不同空间域边缘检测方法的核的性能分析。 以前&#xff0c;空路图像存储在数据库中&#xff0c;道路…...

CentOS 7 下 Keepalived + Nginx 实现双机高可用

CentOS 7 下 Keepalived Nginx 实现双机高可用 文章目录 CentOS 7 下 Keepalived Nginx 实现双机高可用服务器准备服务信息服务架构 服务安装nginxKeepalived 服务配置nginxKeepalived 启动服务nginxkeepalived 服务验证查看 VIP 状态CURL 命令访问浏览器访问 高可用验证停止…...

【Linux】IO多路转接——select接口

目录 I/O多路转接之select select初识 select函数 socket就绪条件 select基本工作流程 select服务器 select的优点 select的缺点 select的适用场景 I/O多路转接之select select初识 select是系统提供的一个多路转接接口。 select系统调用可以让我们的程序同时监视多…...

error_Network Error

此页面为订单列表&#xff0c;是混合开发(页面嵌入在客户端中) 此页面为订单列表&#xff0c;此需求在开发时后端先将代码发布在测试环境&#xff0c;我在本地调试时调用的后端接口进行联调没有任何问题。 此后我将代码发布在测试环境&#xff0c;在app中打开页面&#xff0c…...

保姆级教程:在ROS2 Humble上,用Orbbec Astra Pro深度相机搞定单目标定(附常见镜像问题解决)

保姆级教程&#xff1a;ROS2 Humble与Orbbec Astra Pro深度相机单目标定实战指南 深度相机在机器人视觉、三维重建等领域扮演着关键角色&#xff0c;而精确的相机标定则是确保数据可靠性的第一步。本文将手把手带你完成Orbbec Astra Pro在ROS2 Humble环境下的单目标定全流程&am…...

集团化全员学习企业在线学习平台选型指南|政企专属解决方案

在数字化人才培养浪潮下&#xff0c;集团化全员学习已成为央企、国企、大型上市公司的核心战略&#xff0c;而一款稳定、可管控、高合规的企业在线学习平台&#xff0c;是支撑万人级培训的核心底座。传统分散式培训存在管理混乱、标准不统一、效果不可追溯等痛点&#xff0c;本…...

5015系列圆形连接器选型避坑指南

【导语】 在做工业设备或者车载系统时&#xff0c;连接器看似一个小零件&#xff0c;却往往是整个系统失效的重灾区。最近在复盘几个项目故障案例时发现&#xff0c;很多工控设备在振动和潮湿环境下宕机&#xff0c;根源都出在连接器选型不当上。今天我们就来深扒一下业内经典的…...

论文重复率过低该怎么办?

很多人第一次看到“论文重复率过低”会慌&#xff0c;觉得是不是“太低反而有问题”。先说结论&#xff1a;单纯“重复率低”本身通常不是问题&#xff0c;关键看你低到什么程度&#xff0c;以及你的论文内容是否合理。常见情况分这几种&#xff1a;1. 10%以下&#xff1a;很正…...

Langchain自定义LLM实战:我把一个简单的Python函数变成了AI模型接口

LangChain自定义LLM实战&#xff1a;从Python函数到智能接口的魔法变形记 在AI应用开发的世界里&#xff0c;大型语言模型(LLM)正以前所未有的速度改变着技术格局。但你是否想过&#xff0c;那些看似神秘的AI接口背后&#xff0c;其实隐藏着一个惊人的简单本质&#xff1f;今天…...

数据挖掘与多层神经网络:极简学习路径,神经网络核心机制精要

核心理念&#xff1a;神经网络 可学习的多层次特征提取器 模式匹配器。它通过数据自动学习从输入到输出的复杂映射规则。一、 基础奠基&#xff08;必须知道的概念&#xff09;数学基础&#xff1a;线性代数&#xff08;计算骨架&#xff09;&#xff1a;数据是向量/矩阵&…...

3个核心功能让Notepad++成为你的Markdown高效编辑器

3个核心功能让Notepad成为你的Markdown高效编辑器 【免费下载链接】MarkdownViewerPlusPlus A Notepad Plugin to view a Markdown file rendered on-the-fly 项目地址: https://gitcode.com/gh_mirrors/ma/MarkdownViewerPlusPlus 你是否曾经在Notepad中编写Markdown文…...

5.20 明天见!拿好这份参会指南|AIGC2026峰会

组委会 发自 凹非寺量子位&#xff5c;公众号 QbitAI明天5月20日&#xff0c;09:30&#xff0c;中国AIGC产业峰会准时开场。提前查好路况&#xff0c;定好闹钟&#xff0c;我们现场见。所有人&#xff0c;马上AI起来。明天聊什么&#xff1f;议程帮你划重点上午场&#xff1a;A…...

从无人机飞控到机械臂轨迹规划:Slerp(球面线性插值)在机器人领域的硬核应用

从无人机飞控到机械臂轨迹规划&#xff1a;Slerp在机器人领域的硬核应用 当无人机在强风中需要稳定转向&#xff0c;或是机械臂执行精密装配任务时&#xff0c;传统欧拉角插值常因万向节锁问题导致姿态突变。而**Slerp&#xff08;球面线性插值&#xff09;**通过在四元数空间…...

从PME消息到唤醒中断:图解Linux内核处理PCIe设备唤醒的完整链条与潜在陷阱

从PME消息到唤醒中断&#xff1a;图解Linux内核处理PCIe设备唤醒的完整链条与潜在陷阱 当一块NVMe SSD在深夜的服务器机柜中突然闪烁起状态灯&#xff0c;或是数据中心网卡因流量激增从节能模式苏醒时&#xff0c;PCIe总线上正上演着一场精密的电子芭蕾。这场唤醒仪式的核心角色…...