草庐IT

android - 了解 Canvas 和 Surface 概念

coder 2023-11-27 原文

我很难理解绘制到 SurfaceView 的过程,因此整个 Surface/Canvas/Bitmap系统,在Android中使用。

我已经阅读了所有文章和 API 文档页面,我可以在 android-developers 网站上找到这些内容,一些 android 图形教程,LunarLander 源代码和 this question .

请告诉我,这些陈述中哪些是正确的,哪些不是,以及为什么。

  1. Canvas 附有自己的 BitmapSurface 附有自己的 Canvas
  2. 窗口的所有 View 共享相同的 Surface,因此共享相同的 Canvas
  3. SurfaceViewView 的子类,与其他 View 的子类和 View 本身不同,它具有它自己的 Surface 可以绘制。

还有一个问题:

  • 如果已经有用于位图高级操作的 Canvas,为什么还需要 Surface 类。举例说明 Canvas 不适合做 Surface 可以做的工作。

最佳答案

这里有一些定义:

  • Surface 是一个包含像素的对象,这些像素正在合成到屏幕上。您在屏幕上看到的每个窗口(对话框、全屏 Activity、状态栏)都有自己的绘制表面,SurfaceFlinger 以正确的 Z 顺序将它们渲染到最终显示。表面通常有多个缓冲区(通常是两个)来进行双缓冲渲染:应用程序可以绘制其下一个 UI 状态,而表面转换器正在使用最后一个缓冲区合成屏幕,而无需等待应用程序完成绘图。

  • 窗口基本上就像您认为桌面上的窗口一样。它有一个 Surface,窗口的内容在其中呈现。应用程序与窗口管理器交互以创建窗口;窗口管理器为每个窗口创建一个 Surface 并将其提供给应用程序进行绘图。应用程序可以在 Surface 中绘制任何它想要的东西;对于窗口管理器,它只是一个不透明的矩形。

  • View 是窗口内的交互式 UI 元素。一个窗口有一个附加的 View 层次结构,它提供了窗口的所有行为。每当窗口需要重绘时(例如因为 View 本身已失效),都会在窗口的 Surface 中完成。 Surface 被锁定,它返回一个可用于在其中绘制的 Canvas。绘制遍历在层次结构中向下完成,为每个 View 向下传递 Canvas 以绘制它的 UI 部分。完成后,Surface 将被解锁并发布,以便将刚刚绘制的缓冲区交换到前景,然后由 Surface Flinger 合成到屏幕。

  • SurfaceView 是 View 的一种特殊实现,它还创建自己的专用 Surface 供应用程序直接绘制(在普通 View 层次结构之外,否则必须为窗口共享单个 Surface)。它的工作方式比您想象的要简单——所有 SurfaceView 所做的就是要求窗口管理器创建一个新窗口,告诉它对该窗口进行 Z 排序,紧接在 SurfaceView 窗口的后面或前面,并将其定位以匹配SurfaceView 出现在包含窗口中的位置。如果表面被放置在主窗口后面(按 Z 顺序),SurfaceView 也会用透明度填充它在主窗口的部分,以便可以看到表面。

  • 位图只是一些像素数据的接口(interface)。当您直接创建一个像素时,像素可能由 Bitmap 本身分配,或者它可能指向它不拥有的像素,例如内部碰巧将 Canvas 挂接到 Surface 进行绘图。 (创建一个Bitmap并指向Surface当前的绘图缓冲区。)

另外请记住,正如这暗示的那样,SurfaceView 是一个相当重量级的对象。如果您在特定 UI 中有多个 SurfaceView,请停下来思考是否真的需要这样做。如果你有两个以上,你几乎肯定有太多。

关于android - 了解 Canvas 和 Surface 概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17198520/

有关android - 了解 Canvas 和 Surface 概念的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby - 了解在 Ruby 中与 lambda 一起使用的 inject 行为 - 2

    我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject

  3. ruby-on-rails - 如何测试自己对 Ruby/ROR 的了解? - 2

    是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby​​和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T

  4. ruby-on-rails - 了解 "attribute_will_change!"方法 - 2

    我想覆盖store_accessor的getter。可以查到here.代码在这里:#Fileactiverecord/lib/active_record/store.rb,line74defstore_accessor(store_attribute,*keys)keys=keys.flatten_store_accessors_module.module_evaldokeys.eachdo|key|define_method("#{key}=")do|value|write_store_attribute(store_attribute,key,value)enddefine_met

  5. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  6. ruby-on-rails - 正确了解 Rails 框架的最佳方式是什么? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我一直在Rails上做两个项目,它们运行良好,但在这个过程中重新发明了轮子,自来水(和热水)和止痛药,正如我随后了解到的那样,这些已经存在于框架中。那么基本上,正确了解框架中所有智能部分的最佳方法是什么,这将节省时间而不是自己构建已经实现的功能?从第1页开始阅读文档?是否有公开所有内容的特定示例应用程序?一个特定的开源项目?所有的rails交通?还是完全

  7. ruby - 了解 Ruby Enumerable#map(具有更复杂的 block ) - 2

    假设我有一个函数defodd_or_evennifn%2==0return:evenelsereturn:oddendend我有一个简单的可枚举数组simple=[1,2,3,4,5]然后我用我的函数在map中运行它,使用一个do-endblock:simple.mapdo|n|odd_or_even(n)end#=>[:odd,:even,:odd,:even,:odd]如果不首先定义函数,我怎么能做到这一点?例如,#doesnotworksimple.mapdo|n|ifn%2==0return:evenelsereturn:oddendend#Desiredresult:#=>[

  8. ruby - 了解 Ruby 中赋值和逻辑运算符的优先级 - 2

    在以下示例中,我无法理解Ruby运算符的优先级:x=1&&y=2由于&&的优先级高于=,我的理解是类似于+和*运算符:1+2*3+4解析为1+(2*3)+4它应该等于:x=(1&&y)=2但是,所有Ruby源代码(包括内部语法解析器Ripper)都将其解析为x=(1&&(y=2))为什么?编辑[08.01.2016]让我们关注一个子表达式:1&&y=2根据优先规则,我们应该尝试将其解析为:(1&&y)=2这没有意义,因为=需要特定的LHS(变量、常量、[]数组项等)。但是既然(1&&y)是一个正确的表达式,那么解析器应该如何处理呢?我试过咨询Ruby的parse.y,但它太像意大利面条

  9. ruby - 了解 ruby 奎因 - 2

    我在维基百科上找到了这个代码块,作为Ruby中quine(打印自身的程序)的示例。puts但是,我不明白它是如何工作的。特别是,我没有得到的是,当我删除最后一行时,出现此错误:syntaxerror,unexpected$end,expectingtSTRING_CONTENTortSTRING_DBEGortSTRING_DVARortSTRING_END这些行中发生了什么? 最佳答案 语法以here-document开始,通过Perl从UNIXshell借用-它基本上是一个多行字符串文字,从之后的行开始当一行以something

  10. 最近火热的“数字藏品”,你真的了解吗? - 2

    最近火热的“数字藏品”,你真正了解吗?其实有很多人会把数字藏品跟NFT混为一谈,但其实这两者还是有差别的。数字藏品并不等同于NFT数字藏品是什么?直观来看,它可能就是一张数字化照片或视频,甚至就只是一串数字。但它却是一件对应特定作品、艺术品生成的包含着大量数字信息且拥有唯一加密信息的可以买卖交易的收藏品。NFT则是指一种基于以太坊区块链的“非同质化代币”。它在百度百科里的释义是“用于表示数字资产(包括jpg和视频剪辑形式)的唯一加密货币令牌,可以买卖”。比如已被很多人认识的比特币就是NFT的一种。NFT在元宇宙中发挥的作用是巨大的,目前正是它在支撑着元宇宙中的经济体系。数字藏品其实也是NFT的

随机推荐