Android WindowManager

来源:互联网 发布:淘宝在线客服工作时间 编辑:程序博客网 时间:2024/06/05 09:47

WindowManager 的简单使用

通过WindowManager添加一个Button,此Button显示在窗口的最上层

如果要在系统层面显示,需要添加权限

    <!-- 显示顶层浮窗 -->    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

LayoutParams关键参数设置

Format : 一般设置为 PixelFormat.TRANSPARENT ,即透明,否则会为黑色

Type: View 显示的类型,分为三种层面 1.APP层 2.系统层 3.子Window层

使用系统层时,需要添加权限
这个Demo中使用的是系统层
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;

Flag: 设置Flag表示是否接收事件.
FLAG_NOT_FOCUSABLE 表示Window不需获取焦点,也不需接收各种输入事件

FLAG_NOT_TOUCH_MODEL 表示会将当前View以外的事件传递给底层View

FLAG_SHOW_WHEN_LOCKED 显示在锁屏上.

窗体的大小和位置通过WindowManager.LayoutParams来设置,在通过x和y值来设置窗体位置时,需要注意gravity属性,如果gravity没有设置或者是center之类的,那么设置的x和y值就不会起作用,具体的说明见
View的大小设置为Match_Patent时,对应的X,Y值就会不起作用

X position for this window. With the default gravity it is ignored. When using LEFT or START or RIGHT or END it provides an offset from the given edge.
Y position for this window. With the default gravity it is ignored. When using TOP or BOTTOM it provides an offset from the given edge.

public class MainActivity extends AppCompatActivity {    private static final String TAG = "Logger";    private WindowManager mManager;    private Button mBtnFloat;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mBtnFloat = new Button(this);        mBtnFloat.setText("Floating");        mManager = (WindowManager) getSystemService(WINDOW_SERVICE);        // 获取LayoutParams参数        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT                , WindowManager.LayoutParams.WRAP_CONTENT, 0, 0, PixelFormat.TRANSPARENT);        // 设置Flag        params.x = 200;        params.y = 200;        params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL                | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;        // 设置Type , 决定View显示的层级        params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; // 添加在系统上        params.gravity = Gravity.START | Gravity.TOP;        mManager.addView(mBtnFloat, params);        // 设置触摸监听器        mBtnFloat.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View view, MotionEvent motionEvent) {                Log.d(TAG, "onTouch");                switch (motionEvent.getAction()) {                    case MotionEvent.ACTION_MOVE:                        Log.d(TAG, "onTouch: ActionDown");                        params.x = (int) motionEvent.getRawX();                        params.y = (int) motionEvent.getRawY();                        // 重新更新Window上的View                        mManager.updateViewLayout(mBtnFloat, params);                        break;                    default:                        break;                }                return false;            }        });    }}

这里写图片描述

0 0