悬浮窗

 1 package com.bi.dialogactivity_xuanfuchuang.app;
 2
 3 import android.graphics.Color;
 4 import android.graphics.PixelFormat;
 5 import android.support.v7.app.ActionBarActivity;
 6 import android.os.Bundle;
 7 import android.view.*;
 8 import android.widget.LinearLayout;
 9 import android.widget.TextView;
10
11
12 public class MainActivity extends ActionBarActivity {
13
14     private LinearLayout ll;
15
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.activity_main);
20
21
22         ll=new LinearLayout(this);
23        ll.setBackgroundColor(Color.BLUE);
24         Window window=getWindow();
25         WindowManager.LayoutParams layoutParams = window.getAttributes();
26
27         layoutParams.gravity= Gravity.CENTER;
28
29         //x只有gravity设置了Left right之后才起作用
30         //y只有gravity设置了top bottom之后才起作用
31         layoutParams.x=10;
32         layoutParams.y=10;
33         layoutParams.width=WindowManager.LayoutParams.MATCH_PARENT;
34         layoutParams.height=300;
35
36         window.setAttributes(layoutParams);
37
38         WindowManager manager=getWindowManager();
39         WindowManager.LayoutParams lp=new WindowManager.LayoutParams();
40         lp.gravity=Gravity.TOP|Gravity.LEFT;
41         lp.x=100;
42         lp.y=10;
43         lp.width=200;
44         lp.height=30;
45         lp.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
46                 |WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
47         lp.flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
48                 |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;//用户点击悬浮窗之外区域能传递事件
49         //悬浮窗通过addView后如果悬浮窗可以获取焦点那么下层的activity将不能交互
50         manager.addView(ll,lp);
51
52     }
53     //不重写此方法会导致回退键不能用
54     @Override
55     protected void onDestroy() {
56         //释放悬浮窗
57         WindowManager manager=getWindowManager();
58         manager.removeViewImmediate(ll);
59         super.onDestroy();
60     }
61
62
63 }

Main

上面是activity级别的悬浮窗  activity销毁的话  悬浮窗也会销毁

下面的是系统级别的不会销毁

 1 package com.bi.xuanfuchuangxitong.app;
 2
 3 import android.graphics.PixelFormat;
 4 import android.support.v7.app.ActionBarActivity;
 5 import android.os.Bundle;
 6 import android.util.Log;
 7 import android.view.*;
 8 import android.widget.ImageView;
 9
10
11 public class MainActivity extends ActionBarActivity {
12
13
14     private WindowManager.LayoutParams lp;
15     private WindowManager manager;
16     private static ImageView imageView;
17
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.activity_main);
22
23         manager = (WindowManager)getApplicationContext().getSystemService(WINDOW_SERVICE);
24         //利用Application来创建ImageView避免activity退出导致的Context问题
25         if(imageView!=null){
26             manager.removeViewImmediate(imageView);
27         }
28
29         imageView = new ImageView(getApplicationContext());
30         imageView.setImageResource(R.mipmap.ic_launcher);
31         //设置触摸监听
32         //建议使用匿名内部类来设置触摸的监听器
33         imageView.setOnTouchListener(new View.OnTouchListener() {
34             private float lastX, lastY;
35
36             @Override
37             public boolean onTouch(View v, MotionEvent event) {
38                 boolean ret = false;
39                 int action = event.getAction();
40                 switch (action) {
41                     case MotionEvent.ACTION_DOWN:
42                         lastX = event.getRawX();
43                         lastY = event.getRawY();
44                         ret = true;
45                         Log.d("ff", "-->" + action);
46                         break;
47                     case MotionEvent.ACTION_MOVE:
48                         float cx = event.getRawX();
49                         float cy = event.getRawY();
50                         float ccx = cx - lastX;
51                         float ccy = cy - lastY;
52
53                         lp.x += ccx;
54                         lp.y += ccy;
55                         //更新悬浮窗
56                         manager.updateViewLayout(imageView, lp);
57                         lastY=cy;
58                         lastX=cx;
59
60                         Log.d("ff", "-->" + action);
61                         break;
62                     case MotionEvent.ACTION_UP:
63                         Log.d("ff", "-->" + action);
64                         break;
65                 }
66
67                 return ret;
68             }
69         });
70
71
72         lp = new WindowManager.LayoutParams();
73         //对于应用程序实用的系统类型
74         //TYPE_SYSTEM_ALERT允许接收事件    TYPE_SYSTEM_OVERLAY只是悬浮
75         lp.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
76                 |WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
77         lp.flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
78                 |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;//用户点击悬浮窗之外区域能传递事件
79         lp.gravity= Gravity.LEFT|Gravity.TOP;
80         lp.x=300;
81         lp.y=300;
82         lp.width=WindowManager.LayoutParams.WRAP_CONTENT;
83         lp.height=WindowManager.LayoutParams.WRAP_CONTENT;
84        lp.format= PixelFormat.TRANSPARENT;
85         manager.addView(imageView, lp);
86
87
88     }
89
90
91
92
93 }

main

最后需要添加权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
时间: 2024-11-12 04:22:00

悬浮窗的相关文章

【图文教程】小米4如何获取触动精灵悬浮窗权限

机型:小米4 系统:4.4.4 1. 打开设置,在界面底部找到其他应用管理,点击 2. 在打开的界面找到触动精灵并点击 3. 在应用详情界面上滑,点击底部的权限管理 4. 点击悬浮窗管理,在弹出的底部菜单选择允许

Android 悬浮窗

iPhone有个很好用的白色圆点,今天就来研究下Android中的悬浮框,这里主要是实现一个快捷键的功能,当然也可以在悬浮框中做想做的事! 悬浮窗的实现主要是通过WindowManager实现,当然WindowManager只是一个接口,想了解源码的同志们可以去看WindowManagerImpl,悬浮框主要是通过WindowManager中的addView,updateView,removeView实现 WindowManager.LayoutParams这个类用于提供悬浮窗所需的参数 Win

(转载)简易的可拖动的桌面悬浮窗效果

本文转载自:http://www.cnblogs.com/xqxacm/p/4918470.html 首先,我们需要知道,悬浮窗分为两种:Activity级别的悬浮窗,系统级别的悬浮窗 Activity级别的悬浮窗跟随所属Activity的生命周期而变化,而系统级别的悬浮窗则可以脱离Activity而存在. 由此可知,要实现360手机卫士那样的悬浮窗效果,就需要使用系统级别的悬浮窗 下面学习实现桌面悬浮窗效果的代码步骤: 1.配置清单文件AndroidManifest.xml 中 添加系统悬浮窗

android桌面悬浮窗实现

                        首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. 1.新建一个项目 , 打开activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.an

自定义水波球清理内存的悬浮窗小工具

一.概述 现在一些手机管家都会有一个用来清理内存的悬浮窗小工具,感觉挺实用的,就自己做了一个.首先介绍一下这个工具的功能,除了可以清理内存,还有调节手机屏幕亮度.手电筒.无线网.移动数据.蓝牙.GPS开关的功能.先上图,感受一波: 清理手机内存     一些常用功能的开关 二.功能实现 1.悬浮窗     MainActivity只有两个按钮,控制悬浮窗的打开和关闭.这里我是用Service去控制的.下面我把FloatWindowService的代码贴出来: public class Float

android桌面悬浮窗仿QQ手机管家加速效果

主要还是用到了WindowManager对桌面悬浮进行管理. 需要一个火箭的悬浮窗 一个发射台悬浮窗  ,判断火箭是否放到了发射台,如果放上了,则使用AsyTask 慢慢将火箭的图片往上移.结束后., 返回原位. 1.打开activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.andro

Android进阶2之PopupWindow弹窗(有点悬浮窗的感觉)

PopupWindow是一个可以用来显示一个任意的视图的弹出窗口,他需要完全依赖layout布局. 它没什么界面,在弹出的窗口中完全显示布局中的控件. 上面两个美女头就是弹窗PopupWindow显示的内容.是两个Button. 具体实现: 注意:那三个Button不能和普通的Button一样通过findViewById()方法获得,必须首先说的Button所在的视图,View popview = layoutInflater.inflate(R.layout.poplayout, null);

Android 悬浮窗各机型各系统适配大全

这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时,感兴趣或者找到其他机型适配方法的请留言告诉我,或者加群544645972一起交流一下,非常感谢~ 相关权限请看我的另一篇博客:android permission权限与安全机制解析(下),或者关于权限的案例使用:android WindowManager解析与骗取QQ密码案例分析. 转载请注明出处

Android桌面悬浮窗

经常,我们看到在桌面上可移动的悬浮窗,这种场景还是很多的, 像流量统计,桌面歌词等,安全软件的清理小部件 这种小部件主要是通过 WindowManager ; WindowManager.LayoutParams 这两个类来实现 调用 WindowManager 的addView(view, params)方法来添加一个悬浮窗.updateViewLayout(view,params)来更新悬浮窗参数.removeView(view)用于移除悬浮窗 WindowManager.LayoutPar