悬浮窗可以显示在所有应用程序之上,不管在PC机还是Android设备上都有这个,最常见的是360的“加速球”
来看下在Android设备上的效果
程序的目录结构如下图
创建Activity后启动Service就关闭
package import import import import public MainActivity Activity {
- onCreate(Bundle savedInstanceState) {
- .onCreate(savedInstanceState);
- Intent intent = Intent(MainActivity., FloatService.);
- }
悬浮窗的主要工作放在Service上处理
package import import import import import import import import import import import import import import import import import import import import import /**
- * 悬浮窗Service 该服务会在后台一直运行一个悬浮的透明的窗体
- * @author Administrator
- */ public FloatService Service {
- UPDATE_PIC = ;
- statusBarHeight;
- View view;
- TextView text = ;
- Button hideBtn = ;
- Button updateBtn = ;
- HandlerUI handler = ;
- Thread updateThread = ;
- viewAdded = ;
- viewHide = ;
- WindowManager windowManager;
- WindowManager.LayoutParams layoutParams;
- IBinder onBind(Intent arg0) {
- ;
- onCreate() {
- .onCreate();
- onStart(Intent intent, startId) {
- .onStart(intent, startId);
- System.out.println();
- ;
- refresh();
- onDestroy() {
- .onDestroy();
- * 关闭悬浮窗
- removeView() {
- (viewAdded) {
- ;
- createFloatView() {
- HandlerUI();
- UpdateUI update = UpdateUI();
- Thread(update);
- updateThread.start();
- ).inflate(R.layout.main, );
- .getSystemService(WINDOW_SERVICE);
- * LayoutParams.TYPE_SYSTEM_ERROR:保证该悬浮窗所有View的最上层
- * LayoutParams.FLAG_NOT_FOCUSABLE:该浮动窗不会获得焦点,但可以获得拖动
- */ LayoutParams(LayoutParams.WRAP_CONTENT,
- layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
- * 监听窗体移动事件
- OnTouchListener() {
- [] temp = [] { 0f, 0f };
- onTouch(View v, MotionEvent event) {
- eventaction = event.getAction();
- (eventaction) {
- MotionEvent.ACTION_DOWN:
- ] = event.getX();
- temp[] = event.getY();
- ;
- MotionEvent.ACTION_MOVE:
- refreshView(() (event.getRawX() - temp[]),
- ) (event.getRawY() - temp[]));
- ;
- ;
- }
- OnClickListener() {
- onClick(View v) {
- viewHide = ;
- );
- OnClickListener() {
- onClick(View v) {
- * 刷新悬浮窗
- * @param x
- * @param y
- */ refreshView( x, y) {
- (statusBarHeight == ) {
- Rect();
- refresh();
- * 添加悬浮窗或者更新悬浮窗 如果悬浮窗还没添加则添加 如果已经添加则更新其位置
- */ refresh() {
- (viewAdded) {
- {
- ;
- * 接受消息和处理消息
- * @author Administrator
- */ HandlerUI Handler {
- HandlerUI() {
- HandlerUI(Looper looper) {
- (looper);
- * 接收消息
- */
- handleMessage(Message msg) {
- (msg.what == UPDATE_PIC) {
- (!viewHide)
- {
- .handleMessage(msg);
- }
- * 更新悬浮窗的信息
- * @author Administrator
- */ UpdateUI Runnable {
- run() {
- (!Thread.currentThread().isInterrupted()) {
- {
- Thread.sleep();
- (InterruptedException e) {
- }
为悬浮窗创建布局文件
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- </>
悬浮窗上的控件就跟Activity上一样使用
悬浮窗上显示的一些内存信息,通过工具类:SysInfoUtils.java来读取
完整的Demo可以从以下地址下载:
http://download.csdn.net/detail/deng0zhaotai/6577395
http://blog.csdn.net/deng0zhaotai/article/details/16827719