一般构建UI的时候都是通过Actvity.setContentView(R.layout.main) 来实现的,其等价于Activity.getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null)). 也就是说用户界面必须有Activity 和 windowManager共同参与,但是像 StatusBar LockScreen都是在service中 直接创建view 并添加到windowManager中显示的。
上图中的这个笑脸就是一个浮动的视图,它可以响应用户的点击和拖动事件。Android中浮动窗口的实现主要是靠WindowManager这个类。通过WindowManager类的addView(),updateViewLayout(),removeView()这几个方法,我们可以直接在Window中添加,更新,移除View。
浮动窗口实现的具体步骤
毫无疑问,我们得先拿到WindowManger对象。考虑到浮动窗口通常在应用程序退出后依然显示,所以我们需要在Service中实现浮动窗口的添加和更新,当然别忘了提供给用户一个取消浮动窗口的功能。
定义你要显示的View。可以在布局文件中定义,也可以自定义视图。
设置必要的参数,其中有几个比较重要的参数需要设置,具体请参考下面的代码。
将View添加到Window中,接收并处理事件,更新View。
在Manifest中加入对应的权限。<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
浮动窗口实现代码
- package com.spreadst.floatwindow;
- import android.app.Service;
- import android.content.Context;
- import android.content.Intent;
- import android.graphics.PixelFormat;
- import android.os.IBinder;
- import android.util.Log;
- import android.view.Gravity;
- import android.view.LayoutInflater;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.WindowManager;
- public class FloatWindowService extends Service {
- private WindowManager mWindowManager;
- private WindowManager.LayoutParams mLayoutParams;
- private LayoutInflater mLayoutInflater;
- private View mFloatView;
- private int mCurrentX;
- private