【framework】WindowContainer简介
1 前言
WindowContainer 继承自 ConfigurationContainer,是 WMS 家族的重要基类。ConfigurationContainer简介 中,已介绍 ConfigurationContainer。
本文主要介绍 WindowContainer、SurfaceControl、SurfaceAnimator、WindowContainerController 及其相关类。
2 源码
2.1 SurfaceControl
源码地址→/frameworks/base/core/java/android/view/SurfaceControl.java
(1)主要属性
private final String mName
//事务
static Transaction sGlobalTransaction
private int mWidth
private int mHeight
说明:Transaction 实现了 Closeable 接口,是 SurfaceControl 的静态内部类,里面封装了一系列 native 方法,SurfaceControl 的各种操作,最终都会调用 Transaction 的相应方法。
(2)获取属性
public int getWidth()
public int getHeight()
(3)事务相关
//开启事务:sGlobalTransaction = new Transaction()
public static void openTransaction()
//关闭事务:sGlobalTransaction.apply(sync)
private static void closeTransaction(boolean sync)
(4)图层、位置、尺寸
//sGlobalTransaction.setLayer(this, zorder)
public void setLayer(int zorder)
//sGlobalTransaction.setPosition(this, x, y)
public void setPosition(float x, float y)
//sGlobalTransaction.setSize(this, w, h)
public void setSize(int w, int h)
(5)显示、隐藏
//sGlobalTransaction.show(this)
public void show()
//sGlobalTransaction.hide(this)
public void hide()
(6)透明度、颜色、阵点
//sGlobalTransaction.setAlpha(this, alpha)
public void setAlpha(float alpha)
//sGlobalTransaction.setColor(this, color)
public void setColor(float[] color)
//sGlobalTransaction.setMatrix(this, dsdx, dtdx, dtdy, dsdy)
public void setMatrix(float dsdx, float dtdx, float dtdy, float dsdy)
(7)Display 相关
//nativeCreateDisplay(name, secure)
public static IBinder createDisplay(String name, boolean secure)
//sGlobalTransaction.setDisplaySurface(displayToken, surface)
public static void setDisplaySurface(IBinder displayToken, Surface surface)
//sGlobalTransaction.setDisplaySize(displayToken, width, height)
public static void setDisplaySize(IBinder displayToken, int width, int height)
public static SurfaceControl.PhysicalDisplayInfo[] getDisplayConfigs(IBinder displayToken)
(8)截屏
//nativeScreenshot(display, consumer, sourceCrop, width, height, minLayer, maxLayer, allLayers, useIdentityTransform)
private static void screenshot(IBinder display, Surface consumer, Rect sourceCrop, int width, int height, int minLayer, int maxLayer, boolean allLayers, boolean useIdentityTransform)
(9)内部类
SurfaceControl 的内部类主要包含 Builder、Transaction、PhysicalDisplayInfo,这里仅介绍 Builder。
public static class Builder {
private SurfaceSession mSession;
private int mFlags = HIDDEN;
private int mWidth;
private int mHeight;
private int mFormat = PixelFormat.OPAQUE;
private String mName;
private SurfaceControl mParent;
private int mWindowType = -1;
private int mOwnerUid = -1;
public SurfaceControl build() {
...
return new SurfaceControl(mSession, mName, mWidth, mHeight, mFormat, mFlags, mParent, mWindowType, mOwnerUid);
//mNativeObject = nativeCreate(session, name, w, h, format, flags, parent != null ? parent.mNativeObject : 0, windowType, ownerUid)
}
}
SurfaceSession 类如下。
public final class SurfaceSession {
private long mNativeClient; // SurfaceComposerClient
//创建与 SurfaceFlinger 的连接:mNativeClient = nativeCreate()
public SurfaceSession()
//创建与 SurfaceFlinger 的连接:mNativeClient = nativeCreateScoped(root.mNativeObject)
public SurfaceSession(Surface root)
//nativeDestroy(mNativeClient)
protected void finalize()
//nativeKill(mNativeClient)
public void kill()
}
2.2 SurfaceAnimator
源码地址→/frameworks/base/services/core/java/com/android/server/wm/SurfaceAnimator.java
(1)内部接口:OnAnimationFinishedCallback、Animatable
interface OnAnimationFinishedCallback {
void onAnimationFinished(AnimationAdapter anim); //动画结束时调用
}
interface Animatable {
//获取待提交的事务
Transaction getPendingTransaction();
//提交事务
void commitPendingTransaction();
//在leash创建时执行
void onAnimationLeashCreated(Transaction t, SurfaceControl leash);
//在leash销毁时执行
void onAnimationLeashDestroyed(Transaction t);
//生成leash
SurfaceControl.Builder makeAnimationLeash();
//获取Leash父节点
SurfaceControl getAnimationLeashParent();
//获取动画的SurfaceControl
SurfaceControl getSurfaceControl();
//获取动画Surface的父SurfaceControl
SurfaceControl getParentSurfaceControl();
//获取Surface宽度
int getSurfaceWidth();
//获取Surface高度
int getSurfaceHeight();
//动画结束时执行
default boolean shouldDeferAnimationFinish(Runnable endDeferFinishCallback) {
return false;
}
}
(2)主要属性
private final WindowManagerService mService
private AnimationAdapter mAnimation
SurfaceControl mLeash
private final Animatable mAnimatable
private final OnAnimationFinishedCallback mInnerAnimationFinishedCallback
final Runnable mAnimationFinishedCallback
private boolean mAnimationStartDelayed
(3)主要方法
//mAnimation.startAnimation(mLeash, t, mInnerAnimationFinishedCallback)
void startAnimation(Transaction t, AnimationAdapter anim, boolean hidden)
//mAnimatable.commitPendingTransaction()
void endDelayingAnimationStart()
//t.setLayer(mLeash != null ? mLeash : mAnimatable.getSurfaceControl(), layer)
void setLayer(Transaction t, int layer)
//t.reparent(mLeash != null ? mLeash : mAnimatable.getSurfaceControl(), newParent.getHandle())
void reparent(Transaction t, SurfaceControl newParent)
//mService.scheduleAnimationLocked()
private void reset(Transaction t, boolean destroyLeash)
2.3 WindowContainerController
源码地址→/frameworks/base/services/core/java/com/android/server/wm/WindowContainerController.java
(1)类定义
//E 为管理的 WindowContainer 类型
class WindowContainerController<E extends WindowContainer, I extends WindowContainerListener> implements ConfigurationContainerListener
(2)主要属性
//管理的 WindowContainer
E mContainer
final I mListener
(3)主要方法
//mContainer = container
void setContainer(E container)
//mContainer.setController(null)、mContainer = null
void removeContainer()
//mContainer.onOverrideConfigurationChanged(overrideConfiguration)
public void onOverrideConfigurationChanged(Configuration overrideConfiguration)
2.4 WindowContainer
源码地址→/frameworks/base/services/core/java/com/android/server/wm/WindowContainer.java
WindowContainer 是 AppWindowToken、Task、TaskStack、DisplayContent 的基类,用于管理窗口配置。
(1)类定义
//E为子节点类型
class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<E> implements Comparable<WindowContainer>, Animatable
(2)主要属性
//父节点
private WindowContainer<WindowContainer> mParent
//WindowList 继承 ArrayList,用于存储孩子节点
protected final WindowList<E> mChildren = new WindowList<E>()
protected int mOrientation = SCREEN_ORIENTATION_UNSPECIFIED
//SynchronizedPool 为同步对象池,通过 acquire() 方法获取对象,release() 方法释放对象,避免了反复创建对象,节省了系统资源,同时保证了线程安全
private final Pools.SynchronizedPool<ForAllWindowsConsumerWrapper> mConsumerWrapperPool = new Pools.SynchronizedPool<>(3)
//窗口容器控制者,每个 WindowContainer 与 WindowContainerController 一一对应
WindowContainerController mController
protected DisplayContent mDisplayContent
protected SurfaceControl mSurfaceControl
private SurfaceControl mLastRelativeToLayer = null
//当前窗口容器的图层序数
private int mLastLayer = 0
//事务
protected final Transaction mPendingTransaction
protected final SurfaceAnimator mSurfaceAnimator
protected final WindowManagerService mWmService
//当前窗口容器的位置(左上角位置)
protected final Point mLastSurfacePosition = new Point()
//以当前窗口容器为根节点的子树的叶子节点数
private int mTreeWeight = 1
(3)获取/注入属性
//return mParent
final protected WindowContainer getParent()
//mParent = parent、onConfigurationChanged(mParent.getConfiguration())、onMergedOverrideConfigurationChanged()
setParent(WindowContainer<WindowContainer> parent)
//getOrientation(mOrientation)
int getOrientation()
//mOrientation = orientation
void setOrientation(int orientation)
//mController
WindowContainerController getController()
//controller.setContainer(this)、mController = controller
void setController(WindowContainerController controller)
//mDisplayContent
DisplayContent getDisplayContent()
//mSurfaceControl
public SurfaceControl getSurfaceControl()
//mPendingTransaction
public Transaction getPendingTransaction()
(4)节点相关
//return mChildren.size()
protected int getChildCount()
//是否包含指定子节点(遍历当前节点的所有子孙节点)
boolean hasChild(E child)
//return mChildren.get(index)
protected E getChildAt(int index)
//return mChildren.peekLast()
E getTopChild()
void addChild(E child, int index)
void removeChild(E child)
void removeIfPossible()
//删除当前节点及其所有叶子节点
void removeImmediately()
//获取当前节点前缀序号(当前节点左边的叶子节点数+1)
int getPrefixOrderIndex()
//当前节点在父节点的孩子数组中,是否处于最后一个:mParent.getTopChild() == this && mParent.isOnTop()
boolean isOnTop()
//是否有可见的子节点:mChildren.get(i).isVisible()
boolean isVisible()
(5)Layer 相关
//mChildren.get(j).assignLayer(t, layer++)
void assignChildLayers(Transaction t)
//setLayer(t, layer)、mLastLayer = layer
void assignLayer(Transaction t, int layer)
//mSurfaceAnimator.setLayer(t, layer)
protected void setLayer(Transaction t, int layer)
//mParent.assignChildLayers()
void onParentSet()
(6)Configuration 相关
public void onConfigurationChanged(Configuration newParentConfig)
public void onOverrideConfigurationChanged(Configuration overrideConfiguration)
//当前节点及其子孙的 overrideConfiguration 改变了
void onDescendantOverrideConfigurationChanged()
(7)Surface 相关
//mSurfaceControl.getWidth()
public int getSurfaceWidth()
//mSurfaceControl.getHeight()
public int getSurfaceHeight()
//更新 surface 位置
//mPendingTransaction.setPosition(mSurfaceControl, mTmpPos.x, mTmpPos.y)
//mLastSurfacePosition.set(mTmpPos.x, mTmpPos.y)
void updateSurfacePosition()
//mParent.makeChildSurface(child).setParent(mSurfaceControl)
SurfaceControl.Builder makeChildSurface(WindowContainer child)
//mParent.makeChildSurface(this)
SurfaceControl.Builder makeSurface()
//mParent.getSurfaceControl()
public SurfaceControl getParentSurfaceControl()
//mSurfaceAnimator.reparent(t, newParent)
protected void reparentSurfaceControl(Transaction t, SurfaceControl newParent)
// mChildren.get(i).prepareSurfaces()
void prepareSurfaces()
//mParent.getSession()
SurfaceSession getSession()
(8)Resize
void onResize()
void onMovedByResize()
void setWaitingForDrawnIfResizingChanged()
void resetDragResizingChangeReported()
(9)动画相关
//判断当前节点是否处于 Animating 状态:mSurfaceAnimator.isAnimating()
boolean isSelfAnimating()
//判断当前节点或其子孙节点是否处于 Animating 状态
boolean isSelfOrChildAnimating()
//mParent.getAppAnimationLayer(animationLayer)
SurfaceControl getAppAnimationLayer(int animationLayer)
//mParent.scheduleAnimation()
void scheduleAnimation()
//mSurfaceAnimator.startAnimation(t, anim, hidden)
void startAnimation(Transaction t, AnimationAdapter anim, boolean hidden)
//mSurfaceAnimator.transferAnimation(from.mSurfaceAnimator)
void transferAnimation(WindowContainer from)
(10)Display 相关
//mChildren.get(i).hasContentToDisplay()
boolean hasContentToDisplay()
//mChildren.get(i).onDisplayChanged(dc)
void onDisplayChanged(DisplayContent dc)
(11)回调
//回调
boolean forAllWindows(ToBooleanFunction<WindowState> callback, boolean traverseTopToBottom)
//ForAllWindowsConsumerWrapper wrapper = obtainConsumerWrapper(callback) //对 Consumer 进行装饰
//forAllWindows(wrapper, traverseTopToBottom)
void forAllWindows(Consumer<WindowState> callback, boolean traverseTopToBottom)
void forAllTasks(Consumer<Task> callback)
WindowState getWindow(Predicate<WindowState> callback)
(12)其他方法
//通知 Clients 当前窗口可见:mChildren.get(i).sendAppVisibilityToClients()
void sendAppVisibilityToClients()
//mChildren.get(i).checkAppWindowsReadyToShow()
void checkAppWindowsReadyToShow()
//mChildren.get(i).onAppTransitionDone()
void onAppTransitionDone()
//mChildren.get(i).applyMagnificationSpec(t, spec)
void applyMagnificationSpec(Transaction t, MagnificationSpec spec)
(13)内部类
消费者装饰类:
private final class ForAllWindowsConsumerWrapper implements ToBooleanFunction<WindowState> {
private Consumer<WindowState> mConsumer;
void setConsumer(Consumer<WindowState> consumer) {
mConsumer = consumer;
}
@Override
public boolean apply(WindowState w) {
mConsumer.accept(w);
return false;
}
void release() {
mConsumer = null;
mConsumerWrapperPool.release(this);
}
}
其中,ToBooleanFunction 接口如下:
public interface ToBooleanFunction<T> {
boolean apply(T value);
}
(14)依赖接口
消费者接口:
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
谓词接口
public interface Predicate<T> {
boolean test(T t);
//与运算:return (t) -> test(t) && other.test(t)
default Predicate<T> and(Predicate<? super T> other)
//非运算:return (t) -> !test(t)
default Predicate<T> negate()
//或运算:return (t) -> test(t) || other.test(t)
default Predicate<T> or(Predicate<? super T> other)
//判等运算:return object -> targetRef.equals(object)
static <T> Predicate<T> isEqual(Object targetRef)
}
声明:本文转自【framework】WindowContainer简介
【framework】WindowContainer简介的更多相关文章
- 实体框架(Entity Framework)简介
实体框架(Entity Framework)简介 简称EF,与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R ...
- iOS - 系统经常使用框架(framework)的简介
系统框架(framework)的简介 ImageIO - 该框架的接口可用于导入或导出图像数据及图像元数据 CoreTelephony - 获取IMSI号,SIM卡背面的号码是SIM卡的电子串号, ...
- .NET Entity Framework入门简介及简单操作
Entity Framework是微软借鉴ORM思想开发自己的一个ORM框架. ORM就是将数据库表与实体对象(相当于三层中的Model类)相互映射的一种思想. 最大的优点就是非常方便的跨数据库平台. ...
- Spring Framework体系结构简介
说明:以下转自Spring官方文档,用的版本为4.3.11版本. 一.引用官方文档 2.2.1核心集装箱 所述核心容器由以下部分组成spring-core, spring-beans,spring-c ...
- 2、ASP.NET MVC入门到精通——Entity Framework入门
实体框架(Entity Framework)简介 简称EF 与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R ...
- C# 泛型简介
摘要:本文讨论泛型处理的问题空间.它们的实现方式.该编程模型的好处,以及独特的创新(例如,约束.一般方法和委托以及一般继承).此外,本文还讨论 .NET Framework 如何利用泛型. 下载 Ge ...
- Robot Framework测试框架学习笔记
一.Robot Framework框架简介 Robot Framework是一种基于Python的可扩展关键字驱动自动化测试框架,通常用于端到端的可接收测试和可接收测试驱动的开发.可以 ...
- 实体框架(Entity Framework)
实体框架(Entity Framework) 实体框架(Entity Framework)简介 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对 ...
- 七、Framework类库
1.Framework类库简介 .Net Framework类库包含Framework类库(Framework Class Library,FCL).FCL是一组DLL程序集的统称,其中含有数千个类型 ...
- 小试---EF5.0简介
简介 实体框架Entity Framework 是 ADO.NET 中的一组支持开发面向数据的软件应用程序的技术.是微软的一个ORM框架.简单的说就是把关系型数据库映射成面向对象模型. 一篇更加详细的 ...
随机推荐
- 安卓系统如何使用谷歌框架下的app?
1.问题 安卓系统从理论上无法使用谷歌框架下的应用(比如像GMail,YouTube,Google play等等),会导致一些麻烦(闪退,卡在登陆界面等等) 注意:使用前提是会魔法,否则请绕道 2.解 ...
- [转帖]可能是最完整的 TCP 连接健康指标工具 ss 的说明
https://blog.mygraphql.com/zh/notes/low-tec/network/tcp-inspect/ 写在前面 TCP 连接健康的重要性 如何查看 TCP 连接健康 容器化 ...
- [转帖]PD Control 使用说明
https://docs.pingcap.com/zh/tidb/stable/pd-control PD Control 是 PD 的命令行工具,用于获取集群状态信息和调整集群. 安装方式 注意 ...
- [转帖]minio性能测试
https://zhangzhuo.ltd/articles/2021/09/08/1631106274550.html 压测参数说明 压测数据量为:2个backet,每个backet为10000对象 ...
- [转帖]vdbench
https://www.cnblogs.com/AgainstTheWind/p/9869513.html 一.vdbench安装1.安装java:java -version(vdbench的运行依赖 ...
- [转帖]深入理解Redis的scan命令
熟悉Redis的人都知道,它是单线程的.因此在使用一些时间复杂度为O(N)的命令时要非常谨慎.可能一不小心就会阻塞进程,导致Redis出现卡顿. 有时,我们需要针对符合条件的一部分命令进行操作,比如删 ...
- fio test 简单查看一些系统的io性能结果
简单测试的脚本: echo "本次测试测试128k 16k 8k 1k 的 顺序读写 随机读写性能,每个脚本耗时约30s, 总计耗时大约8min左右完成: " fio -name= ...
- React中兄弟组件通信和组件跨级传递Context的使用
React兄弟组件之间的通信 Child2组件需要去更改Child1组件中的数据. 因为Child1和Child2是兄弟组件 所以数据和事件都放在最进的父级组件中去 兄弟组件通信的简单使用 impor ...
- elementUI(datepicker)限制日日期的选择
指定起始日期,后选的将会受到先选的限制 参考地址 https://www.jianshu.com/p/c59c8ef6c500 实现方法不难,利用了 change 事件,动态改变 picker-opt ...
- 一个思路:实现 golang 中的 `__file__` `__line__` 宏
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 测试 zaplog 发现,开启 caller 的调用,会使 ...