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

android的surface

相信很多Android开发者都知道Canvas类是UI的画布(虽然这种说法并不严谨),因为我们在Canvas上完成各种图形的绘制,那么我们Activity上的各种交互控件又是如何展示并渲染到屏幕上的呢,所以在另一个层面上也有一个“画布”角色——Surface,接下来我们将一起揭开其神秘面纱。

Surface 是Android系统中真正的画布,Activity上的所有UI都是在Surface 上完成绘制的,每一个Surface 对象都在SurfaceFlinger中有对应的图层(Layer),SurfaceFlinger 负责把这些Layer按需混合处理后输出到Frame Buffer中,再由Display设备(屏幕或显示器)把Frame Buffer里的数据呈现到屏幕上。

Android 进阶——图形系统的另一种“画布” Surface 详解_android surface绘制-CSDN博客

canvas怎么来的,canvas是由surface创建的

在ViewRootImpl调用view的draw方法之前创建的

Android Canvas的由来 - 简书

   在调用draw之前会先创建Canvas对象private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int xoff, int yoff,boolean scalingRequired, Rect dirty) {final Canvas canvas;try {   //使用Surface创建一个Canvas,方法中也是调用了native方法    anvas = mSurface.lockCanvas(dirty);if (left != dirty.left || top != dirty.top || right != dirty.right|| bottom != dirty.bottom) {attachInfo.mIgnoreDirtyState = true;}canvas.setDensity(mDensity);}catch (Surface.OutOfResourcesException e) {handleOutOfResourcesException(e);return false;} catch (IllegalArgumentException e) {mLayoutRequested = true;    // ask wm for a new surface next time.return false;}....try {canvas.translate(-xoff, -yoff);if (mTranslator != null) {mTranslator.translateCanvas(canvas);}canvas.setScreenDensity(scalingRequired ? mNoncompatDensity : 0);attachInfo.mSetIgnoreDirtyState = false;//调用View的draw方法,并传入刚刚创建的Canvas对象mView.draw(canvas);drawAccessibilityFocusedDrawableIfNeeded(canvas);} finally {if (!attachInfo.mSetIgnoreDirtyState) {// Only clear the flag if it was not set during the mView.draw() callattachInfo.mIgnoreDirtyState = false;}}....}

相关文章:

  • Sui主网升级至V1.27.2版本
  • Z世代职场价值观的重塑:从“班味”心态到个人成长的追求
  • vue实现全屏screenfull-封装组件
  • 【尝鲜】SpringCloudAlibaba AI 配置使用教程
  • docker封禁对外端口映射
  • xcode报错合集,你都遇到过哪些跳不过的坑
  • 【C++ 11 新特性】lambda 表达式详解
  • 【后端】websocket学习笔记
  • LabVIEW电子类实验虚拟仿真系统
  • 《web应用技术》第十一次课后作业
  • git创建子模块
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • 格雷母线技术革新:推动斗轮堆取料机进入精准操作时代
  • 人工智能--自然语言处理NLP概述
  • GD32F4xx 移植agile_modbus软件包与电能表通信
  • @jsonView过滤属性
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Debian下无root权限使用Python访问Oracle
  • React-redux的原理以及使用
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Vue--数据传输
  • windows下使用nginx调试简介
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 从零搭建Koa2 Server
  • 第2章 网络文档
  • 构建二叉树进行数值数组的去重及优化
  • 关于extract.autodesk.io的一些说明
  • 网页视频流m3u8/ts视频下载
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #FPGA(基础知识)
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (70min)字节暑假实习二面(已挂)
  • (Git) gitignore基础使用
  • (pojstep1.1.2)2654(直叙式模拟)
  • (六)vue-router+UI组件库
  • .gitignore文件---让git自动忽略指定文件
  • .net core 管理用户机密
  • .net framework 4.8 开发windows系统服务
  • /bin/bash^M: bad interpreter: No such file or directory
  • @Autowired 和 @Resource 区别的补充说明与示例
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [\u4e00-\u9fa5] //匹配中文字符
  • [20170728]oracle保留字.txt
  • [22]. 括号生成
  • [Android 13]Input系列--获取触摸窗口
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [CSS] 点击事件触发的动画
  • [Deepin] 简单使用 RustDesk 实现远程访问Deepin
  • [IE编程] WebBrowser控件中设置页面的缩放
  • [javaSE] 看知乎学习工厂模式
  • [JAVASE] 异常 与 SE阶段知识点补充