什么是Android Window、Activity、DecorView和ViewRoot
image.png-
Android Window
是上图的PhoneWindow层次,是视图的承载器- 视图承载器:内部持有一个DecorView(view的跟布局)
-
DecorView(布局显示):是FrameLayout的子类,是Android的视图树的跟节点
-
源码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:fitsSystemWindows="true" android:orientation="vertical"> <!-- Popout bar for action modes --> <ViewStub android:id="@+id/action_mode_bar_stub" android:layout_width="match_parent" android:layout_height="wrap_content" android:inflatedId="@+id/action_mode_bar" android:layout="@layout/action_mode_bar" android:theme="?attr/actionBarTheme" /> <FrameLayout style="?android:attr/windowTitleBackgroundStyle" android:layout_width="match_parent" android:layout_height="?android:attr/windowTitleSize"> <TextView android:id="@android:id/title" style="?android:attr/windowTitleStyle" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@null" android:fadingEdge="horizontal" android:gravity="center_vertical" /> </FrameLayout> <FrameLayout android:id="@android:id/content" android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" android:foreground="?android:attr/windowContentOverlay" android:foregroundGravity="fill_horizontal|top" /> </LinearLayout>
-
结构: 包含一个竖直方向的LinearLayout,内容为:TitleView和ContentViews
-
ViewStub:
- 延迟加载的根据Theme设置ActionBar视图 ,有的布局没有
-
TitleView:
- 标题栏根据Theme设置,有的布局没有
-
ContentViews:
-
加载Activity中设置的布局R.layout.activity_main
-
获取加载的布局的方式:
ViewGroup content = (ViewGroup)findViewById(android.R.id.content); ViewGroup rootView = (ViewGroup) content.getChildAt(0);
-
-
-
-
ViewRoot (布局操作):在安卓代码中只的是ViewRootImpl类, View的绘制 以及 事件分发 等交互 都是通过它来执行或传递的
- View的绘制中的作用: 三大流程(测量(measure),布局(layout),绘制(draw))
- 事件分发中的作用:
- 其他特定:
- 连接WindowManagerService和DecorView的纽带
- 实现了ViewParent接口,这让它可以作为View的名义上的父视图
- 继承了Handler类,可以接收事件并分发 , 所有触屏事件、按键事件、界面刷新等事件都是通过ViewRoot进行分发的
-
- 视图承载器:内部持有一个DecorView(view的跟布局)
-
Activity
并不负责视图控制,它只是控制生命周期和处理事件
- 控制生命周期
- 处理事件 :
- 安卓事件分发机制是从Activity中开始的。(较真的话那就是从屏幕感知获取的了)
网友评论