mshow(mshow启动不来)

作者| Android开发编程编辑|欧阳淑丽

在Android框架中,每个应用程序界面都有一个应用程序级窗口。

常用的活动、对话、祝酒词等。都是通过创建window和Phonewindow来实现的,所以其实我们无时无刻不在看到window,只是不知道它就是window。

了解window的机制原理可以帮助你更好的理解window以及android是如何管理屏幕上的视图的。

这样,当我们需要使用dialog或者popupWindow的时候,就可以知道他在背后做了什么,从而更好地利用dialog和popupWindow。

mshow(mshow启动不来)窗口,电话窗口,装饰关系

先看图。

mshow(mshow启动不来)1.每个活动持有一个窗口对象,

公共类活动扩展ContextThemeWrappe { private Window m Window;}但是Window是一个抽象类,Android为Window提供了唯一的实现类PhoneWindow。也就是说,Activity中的window实例是PhoneWindow对象。

2.但PhoneWindow毕竟是窗口,并没有太多视图相关的能力。然而,Android中一个非常重要的视图对象Decor View保存在PhoneWindow中。它在PhoneWindow中的定义如下:

公共类PhoneWindow扩展Window{ //这是窗口的顶级视图,包含窗口装饰。私人DecorView mDecor}3.看一下DecorView的继承关系,我们知道DecorView继承自frameLayout。

公共装饰扩展框架布局{ 0 }之间的关系现在已经非常清楚了。每个活动保存一个PhoneWindow对象,一个PhoneWindow对象保存一个decorView实例。所以活动中与view相关的大部分操作,其实都是通过DecorView来完成的。

mshow(mshow启动不来)窗户

Android手机中的所有视图都是通过Window呈现的,比如常用的Activity、Dialog、PopupWindow、Toast。他们的视图是依附于Window的,所以可以说Window是视图的直接管理者。

源代码如下

mshow(mshow启动不来)公共抽象类窗口{ public abstract @ Non View getDecorView;public abstract View peekcorview;公共抽象包saveHierarchyState公共抽象void restoreHierarchyState(Bundle savedInstanceState);活动上受保护的抽象void@ able public & ltt扩展视图& gtt findViewById(@ IdRes int id){ return getdecorview . findViewById(id);} public abstract void setContentView(@ layout RES int layout resid);}1.窗口的类型属性

窗口是分类的,不同类别的显示高度范围是不同的。同样,窗户也根据高度范围进行分类。他还有一个可变的Z顺序,它决定了窗口的高度。Z顺序越大,窗口离用户越近,显示越高。高的窗口会盖住低的窗口。窗口可以分为三类:

应用窗口:应用窗口一般位于底部,Z顺序为1-99。

子窗口:一般在应用窗口上显示子窗口,Z顺序从1000到1999。

系统级窗口:一般系统级窗口位于顶层,不会被其他窗口遮挡,比如Toast,2000-2999的Z-Order。如果要弹出自定义的系统级窗口,需要动态申请权限。

窗口的标志参数

//当窗口可见时允许锁定屏幕。公共静态final int flag _ allow _ lock _ while _ screen _ on = 0x 00000001;//窗口后面的一切都变暗public static final int flag _ dim _ behind = 0x 00000002;// Window无法获得输入焦点,即不接受任何按键或按钮事件。比如窗口上有EditView,点击EditView不会弹出软键盘。//窗口范围外的事件仍由原窗口处理;例如,如果您在此窗口外单击查看,仍然会有响应。另外,只要设置了这个标志,就会启用Flag _ not _ touch _ modal public static final int Flag _ not _ focusable = 0x 00000008;//设置此标志是为了将窗口外的按键事件发送到后面的窗口进行处理,只能处理窗口区域的触摸事件。//窗口外的视图也可以响应触摸事件。public static final int FLAG _ NOT _ TOUCH _ MODAL = 0x 00000020;//设置标志,表示窗口不接受任何触摸事件。比如点击窗口不会有响应,只会发送到下面有焦点的窗口。public static final int FLAG _ NOT _ touch able = 0x 00000010;//只要窗口可见,屏幕就一直开着,public static final int flag _ keep _ screen _ on = 0x 00000080;//允许窗口占据整个屏幕public static final int flag _ layout _ in _ screen = 0x 00000100;//允许窗口超出屏外公共静态final int flag _ layout _ no _ limits = 0x 00000200;//全屏显示,隐藏所有窗口装饰,比如在游戏和玩家中全屏显示public static final int flag _ Full screen = 0x 00000400;//表示比FLAG_FULLSCREEN低一级,会显示状态栏public static final int FLAG _ force _ not _ full screen = 0x 00000800;//当用户面部靠近屏幕时(比如打电话),不会响应此事件public static final int flag _ ignore _ cheek _ pressures = 0x 00008000;//当按键动作发生在窗口之外时,一个MotionEvent。将接收ACTION_OUTSIDE事件。公共静态final int FLAG _ WATCH _ OUTSIDE _ TOUCH = 0x 00040000;@Deprecated//窗口可以显示在锁定窗口的上方。使用activity # setshowwhenLocked(Boolean)方法,而不是public static final int flag _ show _ when _ locked = 0x 00080000;//表示负责绘制系统栏的背景。如果设置,系统栏将以透明背景绘制,//并且该窗口中的相应区域将用Window#getStatusBarColor和Window#getNavigationBarColor中指定的颜色填充。public static final int FLAG _ DRAWS _ SYSTEM _ BAR _ BACKGROUNDS = 0x 80000000;//表示这个窗口后面需要显示系统壁纸,而且窗口表面必须是半透明的,这样才能真正看到后面的壁纸:public static final int flag _ show _ wallpaper = 0x 00100000;window的solfInputMode属性的这一部分是弹出软件盘时window的处理逻辑,在日常生活中经常遇到。比如聊天的时候点击输入框,软键盘弹出的时候,输入框就会被推上来。如果不想被顶,也可以设置成软键盘覆盖。下面介绍一下常见属性。//没有指定状态,系统会根据主题选择合适的状态或者配置public static final int soft _ input _ state _ unchanged = 1;//当用户进入此窗口时,隐藏软键盘public static final int soft _ input _ state _ hidden = 2;//当窗口获得焦点时隐藏软键盘public static final int soft _ input _ state _ always _ hidden = 3;//当用户进入窗口时,显示软键盘公共静态final int soft _ input _ state _ visible = 4;//当窗口获得焦点时,显示软键盘公共静态final int soft _ input _ state _ always _ visible = 5;//窗口将调整大小以适合软键盘窗口public static final int soft _ input _ mask _ adjust = 0xf 0;//如果没有指定状态,系统会根据主题选择合适的状态或者设置public static final int soft _ input _ adjust _ unqualified = 0x 00;//当软键盘弹出时,窗口将被调整大小。例如,单击一个编辑视图,整个布局将在翻译和软件磁盘上方可见。//同一模式不能与SOFT_INPUT_ADJUST_PAN结合使用;//如果窗口的布局参数flag包含FLAG_FULLSCREEN,则该值将被忽略,窗口不会调整大小,而是保持全屏。public static final int SOFT _ INPUT _ ADJUST _ RESIZE = 0x 10;//软键盘弹出时,窗口不需要调整大小。确保输入焦点可见。//比如EditView有两个输入框,一个是Ev1,一个是Ev2。当您点击Ev1输入数据时,Ev1的当前输入框将移动到软键盘的顶部。//此模式不能与SOFT_INPUT_ADJUST_RESIZE结合使用public static final int SOFT _ INPUT _ ADJUST。//不会调整大小,直接叠加在窗口上,public static final int soft _ input _ adjust _ nothing = 0x 30;2.窗口的其他属性

x和y属性:指定窗口的位置。

alpha:窗口的透明度

重力:窗口在屏幕上的位置使用重力类的常数。

Format:Pixel Format:window,值以像素格式定义。

窗口属性分配

WindowManager.LayoutParams windowParams = new WindowManager.LayoutParams;windParams.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN;TextView view = new TextView(this);getWindowManager.addview(view,windowParams);getWindow.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN; mshow(mshow启动不来)

PhoneWindow窗口管理器。layout params window params = new window manager。LayoutParamswindParams.flags = WindowManager。LayoutParams . FLAG _ FULLSCREENTextView view = new TextView(this);getWindowManager.addview(view,window params);getWindow.flags = WindowManagerLayoutParams . FLAG _ FULLSCREEN& ltactivity Android:windowSoftInputMode = " SOFT _ INPUT _ STATE _ VISIBLE "/& gt;电话窗口

从Window类继承就是Window类的具体实现,也就是我们可以通过这个类来绘制窗口。此外,该类包含一个DecorView对象,它是所有应用程序窗口(活动接口)的根视图。

简而言之,PhoneWindow类封装了一个frameLayout类,即DecorView对象,并将其作为应用窗口的根视图,提供了一套通用的窗口操作接口。它是Android中最基本的窗口系统。每个活动将创建一个PhoneWindow对象,它是活动和整个视图系统之间的接口。

mshow(mshow启动不来)公共类PhoneWindow扩展窗口实现MenuBuilder。回调{ private final static String TAG = " phone window ";final PhoneWindowMenuCallback mContextMenuCallback = new PhoneWindowMenuCallback(this);最终类型值mMinWidthMajor =新类型值;最终类型值mMinWidthMinor =新类型值;TypedValue mFixedWidthMajorTypedValue mFixedWidthMinorTypedValue mFixedHeightMajorTypedValue mFixedHeightMinor//这是窗口的顶级视图,包含窗口装饰。私人DecorView mDecor//当我们重用decor视图时,我们需要重新创建内容根。当请求decor // view时会发生这种情况,所以我们需要在不引入无限循环的情况下强制重新创建。private boolean mForceDecorInstall = false;//这是放置窗口内容的视图。它或者是// mDecor本身,或者是内容所在的mDecor的子级。ViewGroup mContentParent//客户端是否明确设置了内容视图。如果为false并且mContentParent不是//,则由于窗口保留而设置了内容父级。private boolean mContentParentExplicitlySet = false;Callback2 mTakeSurfaceCallback输入队列。回调mTakeInputQueueCallback布尔错误浮动;私有布尔误透;private LayoutInflater mLayoutInflater;私有TextView mTitleViewDecorContentParent mDecorContentParent;}是Android中最基础的窗口系统。每个活动将创建一个PhoneWindow对象,它是活动和整个视图系统之间的接口。

mshow(mshow启动不来)装饰视图

作为顶层视图,DecorView内部通常包含一个垂直的LinearLayout,标题栏在顶部,内容栏在底部。

通常我们在Activity中通过setContentView设置的布局文件是加载到id为android的内容栏(frameLayout)中的。内容标识

mshow(mshow启动不来)public类DecorView扩展frameLayout实现RootViewSurfaceTaker,window callbacks { private static final String TAG = " decor view ";private static final boolean DEBUG _ MEASURE = false;private static final布尔SWEEP _ OPEN _ MENU = false//在DIP中有焦点的窗口的高度。private final静态int DECOR _ SHADOW _ FOCUSED _ HEIGHT _ IN _ DIP = 20;//没有倾斜的窗口的高度。私有最终静态int DECOR _ SHADOW _ UNFOCUSED _ HEIGHT _ IN _ DIP = 5;private static final int SCRIM _ LIGHT = 0x e 6 ffffff;// 90%白色私有可绘制mMenuBackground私有布尔型mWatchingForMenuprivate int mDownYActionMode mPrimaryActionModeprivate action mode mFloatingActionMode;private ActionBarContextView mPrimaryActionModeView;private popup window mPrimaryActionModePopup;mShowPrimaryActionModePopup私有ViewTreeObserver。onpredlistener mFloatingToolbarPreDrawListener;私有视图mFloatingActionModeOriginatingView;私有浮动工具栏mFloatingToolbar私有ObjectAnimator mFadeAnim//在运行时添加的视图,以在状态栏区域下绘制私有视图mStatusGuard}DecorView它主要有以下功能总结:

作为顶层视图,DecorView内部通常包含一个垂直的LinearLayout,标题栏在顶部,内容栏在底部。通常我们在Activity中通过setContentView设置的布局文件是加载到id为android的内容栏中的。R.id.content(框架布局);

由Dispatch ViewRoot分发的按键、触摸、轨迹球等外部事件;

DecorView有一个直接的子视图,我们称之为SystemLayout。这个视图是从系统的Layout.xml解析出来的,它包含了当前UI的样式,比如是否带title,是否带processbar等。您可以将这些属性称为windowdecorations

作为PhoneWindow和ViewRoot之间的桥梁,ViewRoot通过DecorView设置窗口属性。//可以这样得到View = getWindow.getDecorView

DecorView只有一个名为LinearLayout的子元素。代表整个窗口界面,包括三个区域:通知栏、标题栏和内容显示栏。TitleView: title在DecorView中,可以设置RequestWindowFeature(window . feature _ no _ title)来取消contentView:是一个框架布局,id为content。我们通常在Activity中使用的setContentView是在这里设置的,也就是在frameLayout上;

每个活动都包含一个窗口对象(对话框,吐司,等等。也是新增加的window对象),而Window是一个抽象类,其具体实现是PhoneWindow。Activity中的SetContentView实际上是调用PhoneWindow的setContentView方法。PhoneWindow包含成员变量DecorView。

mshow(mshow启动不来)总结:

Class Window相当于一幅画,PhoneWindow是一幅风景画(具体概念,我们知道是谁的画,是什么性质),DecorView是风景画的具体内容。装饰呈现在电话窗口上。

mshow(mshow启动不来)mshow(mshow启动不来)

mshow(mshow启动不来)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。系信息发布平台,仅提供信息存储空间服务。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

本文来自网络,若有侵权,请联系删除,作者:刘熙华,如若转载,请注明出处:

发表回复

登录后才能评论