在项目研发过程中,有个需求需要创建一个全局的window窗口,于是挠头了,这怎么做呢?于是网上各种搜索,都是在Activity中去创建,单独的app,不能做全局的,经过研究最终在SystemUI中进行创建,下面我们来看具体的实现,我采用的是7.0系统;
SystemUI中的源码详细分析就不在这多讲了,我们直接入手去创建window;
创建系统权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
在创建window时创建一个view用来附属在window上,创建布局;
system_window_view.xml
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/system_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#e0000000"> </LinearLayout>
布局创建成功,我们来看如和实现;
首先来看phoneStatusbar.java,它重写了BaseStatusBar.java中的createAndAddwindow();
@Override public void createAndAddWindows() { addStatusBarWindow(); } private void addStatusBarWindow() { makeStatusBarView(); mStatusBarWindowManager = new StatusBarWindowManager(mContext); …… } 我们就直接在makeStatusBarVew中去创建; protected PhoneStatusBarView makeStatusBarView() { final Context context = mContext; updateDisplaySize(); // populates mDisplayMetrics updateResources(); //创建 view; infateView(context); …… } infateView中内部实现; //init private void infateSystemView(Context context) { mWindowView =(LinearLayout) View.inflate(context,R.layout.system_window_view,null); }
view初始加载成功了,下面我们来看window的创建,在phoneStatusbar中有个start()方法,这就是用来window初始窗口和创建;
@Override public void start() { ………… super.start(); // calls createAndAddWindows() …………. addWindow();//create window. }
这不很重要,是具体实现窗口创建,通过windowManager来添加view;
private void addSystemWindow() { //add view mWindowManager.addView(mWindowView,getLayoutParams()); }
这里根据自己window的大小等级来设置;
public LayoutParams getLayoutParams() { WindowManager.LayoutParams p = new WindowManager.LayoutParams( LayoutParams.MATCH_PARENT,,LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); p.gravity = Gravity.TOP|Gravity.LEFT; p.x = 0; //Equivalent to margin settings p.y = 0; return p; }
全局窗口的创建成功了;
版权声明:本文为xiao_yuanjl原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。