1.底层C++
SufaceFlinger类图的静态结构
2.上层Java的调用流程。
首先,直接从WindowManagerService入手:
public int relayoutWindow(Session session, IWindow client, int seq,
WindowManager.LayoutParams attrs, int requestedWidth,
int requestedHeight, int viewVisibility, int flags,
Rect outFrame, Rect outContentInsets, Rect outVisibleInsets,
Configuration outConfig, Surface outSurface)
这个方法中有一句:
Surface surface = win.createSurfaceLocked();
创建Surface,然后继续跟下去,跟到了jni(android_view_Surface.cpp)的如下方法:
static void Surface_init(
JNIEnv* env, jobject clazz,
jobject session,
jint, jstring jname, jint dpy, jint w, jint h, jint format, jint flags)
{
if (session == NULL) {
doThrowNPE(env);
return;
}
SurfaceComposerClient* client =
(SurfaceComposerClient*)env->GetIntField(session, sso.client);
sp<SurfaceControl> surface;
if (jname == NULL) {
surface = client->createSurface(dpy, w, h, format, flags);
} else {
const jchar* str = env->GetStringCritical(jname, 0);
const String8 name(str, env->GetStringLength(jname));
env->ReleaseStringCritical(jname, str);
surface = client->createSurface(name, dpy, w, h, format, flags);
}
if (surface == 0) {
jniThrowException(env, OutOfResourcesException, NULL);
return;
}
setSurfaceControl(env, clazz, surface);
}
郁闷的是这个session又是如何初始化的,同样在android_view_Surface.cpp中:
static void SurfaceSession_init(JNIEnv* env, jobject clazz)
{
sp<SurfaceComposerClient> client = new SurfaceComposerClient;
client->incStrong(clazz);
env->SetIntField(clazz, sso.client, (int)client.get());
}
非常好,那么这个client就是和java层SurfaceSession构成了一一对应关系咯?事实的确如此。看java层的
SurfaceSession的定义,里面仅有的成员变量就是这个client:
public class SurfaceSession {
/** Create a new connection with the surface flinger. */
public SurfaceSession() {
init();
}
/** Forcibly detach native resources associated with this object.
* Unlike destroy(), after this call any surfaces that were created
* from the session will no longer work. The session itself is destroyed.
*/
public native void kill();
/* no user serviceable parts here ... */
@Override
protected void finalize() throws Throwable {
destroy();
}
private native void init();
private native void destroy();
private int mClient;
}
好了,现在回到java层继续看Surface。现在的概念应该很明确了,从本质上来说,Surface是由SurfaceSession创建的。那么SurfaceSession 又是由谁创建的呢? 既然SurfaceSession 是Session的成员变量,那么就顺藤摸瓜去看:
void windowAddedLocked() {
if (mSurfaceSession == null) {
if (WindowManagerService.localLOGV) Slog.v(
WindowManagerService.TAG, "First window added to " + this + ", creating SurfaceSession");
mSurfaceSession = new SurfaceSession();
if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
WindowManagerService.TAG, " NEW SURFACE SESSION " + mSurfaceSession);
mService.mSessions.add(this);
}
mNumWindow++;
}
那么windowAddedLocked又是谁调用的呢?在WIndowState.java中:
void attach() {
if (WindowManagerService.localLOGV) Slog.v(
WindowManagerService.TAG, "Attaching " + this + " token=" + mToken
+ ", list=" + mToken.windows);
mSession.windowAddedLocked();
}
那么这个attach又是谁调用的呢?WindowManagerService.java的一个方法,如下:
public int addWindow(Session session, IWindow client, int seq,
WindowManager.LayoutParams attrs, int viewVisibility,
Rect outContentInsets, InputChannel outInputChannel)
由于这个方法比较长,就不贴了,只看其中最关键的地方,其中有这么一句话:
win.attach();
经过这么一分析,清楚了,SurfaceSession是WindowManagerService在addWindow的时候创建的。而
Surface是在WIndowManagerService进行relayoutWindow时创建的。
- 大小: 54 KB
分享到:
相关推荐
GDI++图形引擎是一种基于Microsoft Windows图形设备接口(GDI)的增强版本,它提供了更高级别的图形绘制功能,常用于开发2D图形应用程序,尤其是游戏。GDI++是对原始GDI的C++封装,使得程序员可以更方便、更高效地...
《GDI图形图像编程》是关于使用Windows操作系统提供的GDI(Graphics Device Interface)技术进行图形和图像处理的专题。GDI是微软Windows API的核心部分,它允许程序员创建和操纵窗口、绘制文本、图形以及处理各种...
GDI,全称为Graphics Device Interface,是Windows操作系统中的一个核心组件,用于图形设备接口。它为应用程序提供了一种与硬件无关的方式,来绘制文本、图形和图像,使得开发者无需关心底层硬件的具体细节,就能在...
《GDI+图形程序设计》是一本专注于GDI+绘图技术的专业书籍,对于开发者来说,它是探索Windows图形编程领域的宝贵资源。GDI+(Graphics Device Interface Plus)是微软为Windows应用程序提供的一种强大的图形处理库,...
在Windows编程领域,GDI+(Graphics Device Interface Plus)是一个强大的图形处理库,它提供了丰富的图形绘制、图像处理和文本渲染等功能。本压缩包“GDI图形绘制加缩放等常规功能.zip”显然包含了关于使用C#语言...
GDI+(Graphics Device Interface Plus)是Windows操作系统中用于图形绘制和图像处理的一个强大的API,它是GDI(Graphics Device Interface)的升级版本。GDI+提供了丰富的绘图功能,包括二维几何图形、曲线、文本、...
在.NET框架下,C#与GDI+(Graphics Device Interface Plus)结合,为开发者提供了强大的图形处理能力。GDI+是Windows操作系统中的一个图形库,它允许程序员创建和操纵2D图形,包括绘制线条、形状、文字以及图像等。...
在本压缩包“GDI图形渲染.rar”中,包含的是易语言编写的GDI图形渲染的源代码,这对于学习和理解GDI编程具有很高的价值。 GDI的主要功能包括: 1. **图形绘制**:GDI提供了各种图形绘制函数,如线、圆、矩形、...
鉴于此,本篇将主要围绕GDI图形程序设计的基础概念、应用场景和技术要点展开讨论。 ### GDI图形程序设计基础 #### 什么是GDI? GDI(Graphics Device Interface)是微软为Windows操作系统开发的一套图形设备接口库,...
**VC++ GDI图形编程** 是Windows环境下进行图形和图像处理的一种重要技术。GDI,全称为Graphics Device Interface,是Microsoft开发的一个API集合,用于帮助程序员高效地与系统硬件交互,绘制文本、图像、形状等元素...
易语言源码易语言GDI图形渲染源码.rar 易语言源码易语言GDI图形渲染源码.rar 易语言源码易语言GDI图形渲染源码.rar 易语言源码易语言GDI图形渲染源码.rar 易语言源码易语言GDI图形渲染源码.rar 易语言源码...
本程序使用GDI(图形设备接口)来进行windows图形编程,充分利用设备无关位图和面向对象的编程思想,实现了许多功能。比如:从工具栏选择颜色,更改绘图的线条的粗细,各式各样的绘图工具,选择不同工具时鼠标光标的...
C#技术文章-GDI图形图像编程是C#开发中的一个重要领域,主要涉及到Windows应用程序的界面设计和动态图像处理。GDI(Graphics Device Interface)是Windows操作系统提供的一种图形设备接口,它允许开发者创建和控制...
GDI+(Graphics Device Interface Plus)是Windows操作系统中用于图形绘制和处理的API,它是GDI的升级版,提供了更多的功能和更好的性能。GDI+ SDK则是开发人员使用GDI+进行图形编程的软件开发工具包,包含了丰富的...
在探讨如何使用GDI+绘制图形之前,我们首先应该了解GDI+的基本概念。GDI+是微软公司推出的一种图形设备接口(GDI),它提供了一系列的图形和字体功能,可以用于Windows平台上应用程序的图形绘制。GDI+继承了GDI,并...
在IT领域,GDI+(Graphics Device Interface Plus)是Windows应用程序开发中用于图形处理的一种强大的API。它提供了丰富的绘图功能,使得开发者可以创建出复杂的2D和3D图形。本教程将深入探讨如何利用纯GDI+实现3D...
在本文中,我们将深入探讨C#中的GDI+技术,特别是在绘制图形方面,特别是如何实现分层、拖放、缩放以及填充等高级功能。GDI+是.NET框架中的一个核心部分,它提供了丰富的图形绘制功能,使得程序员能够创建出交互式且...
C# GDI+图形程序设计》随书源码完整版 总共2个压缩文件,共100多MB,这是第一个
GDI(Graphics Device Interface)是Windows操作系统中的一个核心组件,用于处理图形绘制和输出到各种设备,如显示器、打印机等。GDI+是GDI的升级版,它引入了更多的现代图形处理特性,如矢量图形、透明度、高级文本...