FrameworkWMS之WindowManager(窗口管
1、简介
WindowManager(窗口管理服务),它是显示View的最底层,Toast,Activity,Dialog的底层都用到了这个WindowManager,他是全局的!该类的核心无非:调用addView,removeView,updateViewLayout这几个方法来显示View以及通过WindowManager。LayoutParams这个API来设置相关的属性。
Android为我们提供的用于与窗口管理器进行交互的一个API。我们都知道App的界面都是由一个个的Acitivty组成,而Activity又由View组成,当我们想显示一个界面的时候,第一时间想起的是:Activity,又或者是Dialog和Toast。但是有些情况下,前面这三者可能满足不了我们的需求,比如我们仅仅是一个简单的显示用Activity显得有点多余了,而Dialog又需要Context对象,Toast又不可以点击。对于以上的情况我们可以利用WindowManager添加View到屏幕上,或者从屏幕上移除View。他就是管理Android窗口机制的一个接口,显示View的最底层。2、WMS功能介绍
要想了解WindowManager管理机制,首先我们先介绍WMS是一个非常重要的系统服务。
它支撑着视图相关的各项业务,这非常符合软件设计的单一职责原则,其业务和ActivityManagerService(简称AMS)一起几乎占据了framework业务的半壁江山,可见其重要性。关于WMS的内容实在太多了,这里只简单介绍其大致功能以及启动流程。WMS的大概功能如下图所示:
这里先简单描述一下各项功能:窗口管理:WMS是窗口管理者,结合WindowManager实现窗口的启动、添加、删除,以及管理窗口的大小、层级等。窗口动画:在窗口切换时,使用窗口动画可以使这个过程看起来更炫更生动,这个窗口动画就是由WMS的动画子系统来负责的,动画子系统的管理者便是WindowAnimator。输入系统的中转站:触摸设备屏幕上的窗口时会产生触摸事件,InputManagerService(IMS)会对触摸事件进行处理,找到最合适的窗口来反馈事件。而WMS是这些窗口的管理者,那自然而然就成为了输入系统的中转站了。Surface管理:窗口并不具备绘制功能,所以每个窗口都需要一个Surface来供自己绘制,WMS就是这个Surface的管理者。WindowManager实现悬浮窗详解
关于SYSTEMALERTWINDOW权限申明直接报错设置windowtypeif(Build。VERSION。SDKINTBuild。VERSIONCODES。KITKAT){mWinParams。typeWindowManager。LayoutParams。TYPETOAST;}else{mWinParams。typeWindowManager。LayoutParams。TYPEPHONE;}原因1:type为TYPETOAST在sdk19之前不接收事件,之后可以。原因12:type为TYPEPHONE需要SYSTEMALERTWINDOW权限。在sdk19之前不可以直接申明使用,之后不能直接申明使用。
三:用到的技术知识点:1。OnTouch()的事件处理2。WindowManager类及其LayoutParams的常见属性的理解3。Handler更新UI4。定时器(TimerTimerTask)1。OnTouch事件处理
这个网上的资料很多,这里说一些注意点:
1。获取坐标event。getRawX():获取相对屏幕的坐标X(获取Y的坐标同理)event。getX():获取相对于容器的坐标X(获取Y的坐标同理)
2。返回值returntrue:表示事件不往下传递了returnfalse:表示继续传递事件2。WindowManager类
获取方式:mWmManager(WindowManager)context。getSystemService(Context。WINDOWSERVICE);WindowManager。LayoutParams类this。mWinParamsnewWindowManager。LayoutParams();设置图片格式,效果为背景透明mWinParams。formatPixelFormat。RGBA8888;设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)mWinParams。flagsWindowManager。LayoutParams。FLAGNOTFOCUSABLE;参考系为左上mWinParams。gravityGravity。LEFTGravity。TOP;mScreenHeightmWmManager。getDefaultDisplay()。getHeight();以屏幕左上角为原点,设置x、y初始值,相对于gravitymWinParams。xmScreenWidth4;mWinParams。ymScreenHeight4;设置悬浮窗口长宽数据mWinParams。widthFrameLayout。LayoutParams。WRAPCONTENT;mWinParams。heightFrameLayout。LayoutParams。WRAPCONTENT;
其中需要注意的是其Gravity属性:
注意:Gravity不是说你添加到WindowManager中的View相对屏幕的几种放置,而是说你可以设置你的参考系!
例如:mWinParams。gravityGravity。LEFTGravity。TOP;意思是以屏幕左上角为参考系,那么屏幕左上角的坐标就是(0,0),这是你后面摆放View位置的唯一依据。当你设置为mWinParams。gravityGravity。CENTER;那么你的屏幕中心为参考系,坐标(0,0)。一般我们用屏幕左上角为参考系。设置WindowManager中的View的透明度
使用:LayoutParams。alpha属性(0。0f1。0f),1。0f不透明,0。0f全透明,源码如下:Analphavaluetoapplytothisentirewindow。Analphaof1。0meansfullyopaqueand0。0meansfullytransparentpublicfloatalpha1。0f;Handler更新UI(略)定时器TimerTasktimerTasknewTimerTask(){其实就是一个Runnable};看他的类:publicabstractclassTimerTaskimplementsRunnable{。。。}TimermtimernewTimer();使用的时候:mtimer。schedule(timerTask,0,3);参数1:执行的任务;参数2:延迟0毫米执行;参数3:每隔3毫秒执行一次任务;
要实现WindowManager添加的窗口,实现动画显示,就需要添加如下红色的属性,其他的添加View只要设置其Animations属性也会实现动画,当然自己实现也可,但是能直接用系统的已经实现好的,也很方便。windowManager(WindowManager)mContext。getSystemService(Context。WINDOWSERVICE);WindowParamsnewLayoutParams(LayoutParams。FLAGFULLSCREEN,LayoutParams。FLAGFULLSCREEN);WindowParams。typeLayoutParams。TYPESYSTEMERROR;WindowParams。flagsLayoutParams。FLAGALTFOCUSABLEIM;windowgetsfocusWindowParams。formatPixelFormat。TRANSPARENT;settheopacityto100WindowParams。windowAnimationsandroid。R。style。AnimationTranslucent;settheanimationforthewindowWindowParams。gravityGravity。RIGHTGravity。TOP;windowManager。addView(view,WindowParams);展示:
【私信获取】《Framework精通手册》、
发送资料,即可领取!
【私信发送手册获取】FrameWork源码解析手册文末
本文简单实现一个悬浮窗;framework之wms机制中的WindowManager(窗口管理服务)得简单使用。总上面可以领取framework学习资料,自己整理出的很全的核心技术点。私信可免费获取。
不要买错,微软发布了新版XboxSeriesX概念迷你冰箱来源:GameRent编译卡卡布微软游戏营销资深人士亚伦格林伯格宣布,新版XboxSeriesX迷你冰箱现已在零售商处上架。Xbox游戏营销副总裁AaronGree……
他66岁,身家1450亿,送客户奔驰宝马,带34人成亿万富豪中国的亿万富豪,贡献过不少凡尔赛金句。王健林:先定一个能达到的小目标,比方说我先挣它一个亿。刘强东:我和她在一起不是因为她(章泽天)漂亮,因为我根本不知……
烟雨红尘,最留恋的,是江南的烟雨这一季,最美的情怀。烟雨红尘,最留恋的,是江南的烟雨。烟雨红尘,最难忘的,是谁,湿湿了相思的眼?执手红尘,看陌上花开,蝶舞蜂飞,生生寂,是空气中弥漫的花香,醉了一地……
杰伦布朗我为艰苦的比赛做好了准备但掘金三分30中17有点离谱直播吧1月2日讯在今天结束的一场NBA常规赛中,绿军111123不敌掘金。在赛后接受采访时,杰伦布朗在谈到本场失利时这样说道:我已经为一场艰难的比赛做好了身心准备,我知道……
北海极驰中冠赛上最憋屈的一支球队也许是疫情的原因吧,近十几天来,网上鲜有人再拿泾川文汇战胜北京国安的新闻说事了。2022年11月17日,中国足球史上爆出了最大冷门。中超豪门北京国安以5:7输给了一支县级……
靓丽可人的女宝宝名字,清风过境,暗自留香若说中国诗文最为灿烂的时期,那么唐诗是占据其中一位的。唐诗是中华文化宝库中的一颗璀璨明珠,其对中国的文化发展起到了很大影响,因此很多比较传统的人都希望通过唐诗为孩子起一个名字,……
原神3。2现状快说谢谢小草神《原神》3。2版本再次登顶多国游戏畅销榜,对于手游行业来说似乎已经习以为常,但在苹果商店普遍涨价,以及日本国民游戏开启联动活动等不利局势下,仍然能冲上第一,且不仅限于游戏榜,依……
毛利可达1000!专家智商税如今,高价盐逐渐进入大众视野。红星资本局注意到,市面上存在喜马拉雅粉盐、美国夏威夷火山红盐、喜马拉雅海棠盐等进口盐,425克一瓶售价在100元人民币上下,与400克一袋售……
王者荣耀张人0认输秀腹肌,女粉大饱眼福,剑仙索然无味短视频平台的发展在近几年也是十分的迅速,随着短视频的发展也让很多普通人有了当网红的机会,在这个平台中你只要能够产出有趣的内容或者拥有较为不错的面容,都是能够脱颖而出的,说到网红……
如何利用泊松分布来计算进球数泊松分布结合历史数据,可以计算足球比赛中可能的进球数。玩家将发现使用泊松分布计算足球比赛的可能赛果既简单又实用。泊松分布解释泊松分布是一个数学概念,将平均值换算成可……
丝芭还能出来第二个鞠婧祎吗?原以为许佳琪高位出道成为The9女团一员,解散归来后会将重心放在演员位置上,成为名副其实丝芭二姐,不成想还是回到了Snh48团体。在古装剧《清风朗月花正开》播出后,待播剧……
虎头局,狂飙失速加速拓店,成了阿喀琉斯之踵。来自:猎云精选;文孙媛最新一轮融资过去仅2个月,虎头局资金链风波又起。3月30日,小红书账号疯狂产品Jason发布了一篇文章,标题……