Android SurfaceControlViewHost介绍及使用

目录

概要介绍

具体实现

绘制进程内类图

SurfaceControlViewHost 成员变量 

 SurfaceControlViewHost成员函数       

surfacecontrol 层级关系

示例代码

host端即绘制进程

client端即显示进程


概要介绍

SurfaceControlViewHost是一个辅助类, 用于帮助在其他进程中显示本进程的view。 

SurfaceControlViewHost 为绘制进程持有,其中的SurfacePackage 通过binder调用交给另外的显示进程,SurfacePackage中持有绘制进程端的绘制surfacecontrol信息。

在显示进程中的SurfaceView中通过SurfaceView.setChildSurfacePackage(SurfacePackage) 将绘制进程中的界面(即surfacecontrol)与surfaceview关联并进行显示。可以理解为绘制进程和显示进程中传递的实际上为surfacecontrol, 也即SurfaceFlinger端Layer的信息。在显示进程中, 在surfaceView中通过接口设定绘制进程的surface 的父surface为surfaceview自身的mSurfaceControl,并设定z order 关系,  从而在显示上看起来是显示进程的一个view。   


具体实现

绘制进程内类图

如下:  

SurfaceControlViewHost 成员变量 

  •        WindowlessWindowManager mWm, 构造时传入,或者构造时创建。为IWindowSession 子类, 该类并不将一个view加入到wms中作为窗口管理, 而是将该view作为一个子surface加入到另一个父surface中。构造时创建时, 使用本类的mSurfaceControl作为参数, 作为WindowlessWindowManager的mRootSurface。 WindowlessWindowManager类的addToDisplay是按照 WindowManager.LayoutParams 创建一个surfacecontrol, 该surfacecontrol 对应SurfaceFlinger的buffer Layer, 分配具体的绘制buffer, 绘制进程的view 即绘制在该surface上。 该surface 存入WindowlessWindowManager.State.mSurfaceControl, mRootSurface为其parent。 WindowlessWindowManager类的relayout()中按照输入高宽及LayoutParams调整WindowlessWindowManager.State.mSurfaceControl的参数。 
  •        ViewRootImpl mViewRoot;  在SurfaceControlViewHost类构造时创建, 传入的参数为WindowlessWindowManager, 构造时会调用ViewRootImpl.forceDisableBLAST(),即绘制buffer在surfaceFlinger侧分配管理, 而不是在app侧。 
  •        SurfaceControl mSurfaceControl;  //构造时创建, 名字为“SurfaceControlViewHost”, 对应SurfaceFlinger中的ContainerLayer, 作为整个绘制surface的根。 其子layer 为在WindowlessWindowManager.addToDisplay中创建的buffer layer。 mSurfaceControl也作为根layer通过SurfacePackage传递给远端显示进程。 

SurfaceControlViewHost成员函数       

  • getSurfacePackage() :创建SurfacePackage:  new SurfacePackage(mSurfaceControl, mAccessibilityEmbeddedConnection); 其中SurfaceControlViewHost.mSurfaceControl 也作为SurfacePackage的mSurfaceControl, 会加入到显示进程中的SurfaceView中。
  • setView(View, ......): 最终调用的是mViewRoot.setView(view, attrs, null),进而调用WindowlessWindowManager.addToDisplay() 和relayout(), 将该view内容与WindowlessWindowManager.State.mSurfaceControl关联。 该mSurfaceControl即为buffer  layer。
  • surfacecontrol 层级关系

- SurfaceControlViewHost: mSurfaceControl (contrainer layer)

        -  WindowlessWindowManager.State.mSurfaceControl (buffer laye)

示例代码

  • host端即绘制进程

参见: /frameworks/base/core/java/android/service/autofill/InlineSuggestionRenderService.java:170  

    final SurfaceControlViewHost host = new SurfaceControlViewHost(this, getDisplay(),
                      hostInputToken);
    host.setView(suggestionRoot, lp);
    aidlClass.aidlFunction(host.getSurfacePackage());  //通过aidl接口将SurfacePackage交给显示进程即client端。 


    

  • client端即显示进程

 SurfaceHolder.Callback.surfaceCreated() {
     从远程host中获取SurfaceControlViewHost.SurfacePackage。 可以显示进程调用aidl接口从绘制进程获取,或绘制进程调用aidl传入到显示进程。
     SurfaceView.setChildSurfacePackage(SurfacePackage);
}

Client端Surfaceview的层次结构如下:

SurfaceView hierarchy
 - ViewRootImpl surface
      - bounds layer (crops all child surfaces to parent surface insets)
          - SurfaceView surface (drawn relative to ViewRootImpl surface)

               - SurfaceControlViewHost.SurfacePackage surface  

          - Background color layer (drawn behind all SurfaceView surfaces)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio是一款用于开发Android应用程序的集成开发环境(IDE)。安装和使用Android Studio需要以下几个步骤: 1. 首先,你需要下载Android Studio的安装包。你可以从官方网站上下载最新版本的Android Studio安装包。 2. 在安装Android Studio之前,你需要先安装Java开发工具包(JDK),因为Android的开发语言是Java。你可以从官方网站下载适合你系统的JDK版本。 3. 安装JDK后,你可以执行Android Studio的安装包。在安装过程中,你可以选择安装目录以及其他自定义设置。 4. 当安装完成后,你可以打开Android Studio。在首次运行时,它会进行一些初始化设置和配置。你可以根据需要选择安装的组件以及更改其他设置。 5. 安装完成后,你可以创建一个新的Android项目或导入现有的项目。你可以使用Android Studio提供的模板和工具来开发和调试你的应用程序。 至于使用Android Studio的具体教程和功能介绍,你可以参考官方文档、在线教程、视频教程等资源,这些资源可以帮助你更好地理解和使用Android Studio。 如果你想彻底重装Android Studio,你可以删除一些目录和文件夹,例如: - 在C:\Users\用户名目录下,删除.android和.gradle文件夹。如果使用的是Android Studio 4.0版本之前的版本,还可以删除.Android studio文件夹。 - 在C:\Users\用户名\AppData\Roaming\Google\AndroidStudio4.2目录下,删除Google文件夹。 - 在C:\Users\用户名\AppData\Local\Google\AndroidStudio4.2目录下,删除Google文件夹。 请注意,在删除这些文件夹之前,确保你已经备份了你的项目和其他重要的文件。删除这些文件夹后,你可以重新安装和配置Android Studio。 总结,安装和使用Android Studio的步骤包括下载安装包、安装JDK、执行安装程序、配置初始设置、创建项目或导入现有项目。你可以参考官方文档和其他教程资源来深入了解Android Studio的使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值