文章目录
WindowManager(窗口管理服务),它是显示View的最底层,Toast,Activity,Dialog的底层都有用到了这个WindowManager。WindowManager里面主要是addView,removeView,updateViewLayout这几个方法来显示View,以及通过WindowManager.LayoutParams这个API来设置相关的属性。下文讲详细介绍。
WindowsManager
1、WindowsManager使用方法
1
//获取WindowManager对象
WindowManager wManager = getApplicationContext().getSystemService(Context.WINDOW_ SERVICE);
//获得WindowManager.LayoutParams对象,为后续操作作准备
WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();
//...WindowManager.LayoutParams一顿设置
wManager.addView(textView, wmParams);
2
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button floatingButton = new Button(this);
floatingButton.setText("button");
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
0, 0,
PixelFormat.TRANSPARENT
);
// flag 设置 Window 属性
layoutParams.flags= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
// type 设置 Window 类别(层级)
layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
layoutParams.gravity = Gravity.CENTER;
WindowManager windowManager = getWindowManager();
windowManager.addView(floatingButton, layoutParams);
}
}
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
3全屏设置
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去除标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
//去除状态栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);//要放到加载布局文件代码之前
initView();
initData();
initListener();
}
2、WindowManager的关联类
2.1、 WindowManager
先来看看WindowManager里面有什么。
Android_8_0_r36_\frameworks\base\core\java\android\view\WindowManager.java
public interface WindowManager extends ViewManager {
int DOCKED_INVALID = -1;
int DOCKED_LEFT = 1;
int DOCKED_TOP = 2;
int DOCKED_RIGHT = 3;
int DOCKED_BOTTOM = 4;
final static String INPUT_CONSUMER_PIP = "pip_input_consumer";
final static String INPUT_CONSUMER_NAVIGATION = "nav_input_consumer";
final static String INPUT_CONSUMER_WALLPAPER = "wallpaper_input_consumer";
public static class BadTokenException extends RuntimeException {
public BadTokenException() {
}
public BadTokenException(String name) {
super(name);}
}
public static class InvalidDisplayException extends RuntimeException {
public InvalidDisplayException() {
}
public InvalidDisplayException(String name) {
super(name);}
}
public Display getDefaultDisplay();
public void removeViewImmediate(View view);
public interface KeyboardShortcutsReceiver {
void onKeyboardShortcutsReceived(List<KeyboardShortcutGroup> result);
}
final int TAKE_SCREENSHOT_FULLSCREEN = 1;
final int TAKE_SCREENSHOT_SELECTED_REGION = 2;
public static final String PARCEL_KEY_SHORTCUTS_ARRAY = "shortcuts_array";
public void requestAppKeyboardShortcuts(final KeyboardShortcutsReceiver receiver, int deviceId);
public static class LayoutParams extends ViewGroup.LayoutParams implements Parcelable {
......
}
......
}
WindowManager是一个接口,继承ViewManager。里面有一些实例属性和方法,还有一个LayoutParams占据着很大一部分。LayoutParams是一个序列化类。而且WindowManager里面的大部分都是隐藏的属性和方法,只给系统调用。
2.2、ViewManager
WindowManager继承ViewManager。ViewManager里面实际上只有三个方法:addView
、updateViewLayout
、removeView
,分别对应着添加view、更新viewlayout、移走view。
\frameworks\base\core\java\android\view\ViewManager.java
package android.view;
public interface ViewManager
{
public void addView(View view, ViewGroup.LayoutParams params);
public void updateViewLayout(View view, ViewGroup.LayoutParams params);
public void removeView(View view);
}
2.3、WindowManagerImpl
那么WindowManager的实现类是哪个?是WindowMan