悬浮窗可以显示在所有应用程序之上,不管在PC机还是Android设备上都有这个,最常见的是360的“加速球”

Android 系统悬浮窗吸附 安卓悬浮窗控件_ide

来看下在Android设备上的效果

Android 系统悬浮窗吸附 安卓悬浮窗控件_java_02

程序的目录结构如下图

Android 系统悬浮窗吸附 安卓悬浮窗控件_悬浮窗_03

创建Activity后启动Service就关闭

[java]
packageimportimportimportimportpublic Activity {  
•   
•   
•  onCreate(Bundle savedInstanceState) {  
• .onCreate(savedInstanceState);  
• , FloatService.);  
• }

悬浮窗的主要工作放在Service上处理

[java]
packageimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimport/** 
•  * 悬浮窗Service 该服务会在后台一直运行一个悬浮的透明的窗体 
•  * @author Administrator 
• public Service {  
• ;  
•   
•   
• ;  
• ;  
• ;  
• ;  
• ;  
• ;  
• ;   
•  WindowManager windowManager;  
•  WindowManager.LayoutParams layoutParams;  
•   
•   
•  IBinder onBind(Intent arg0) {  
•   
• ;  
•   
•  onCreate() {  
•   
• .onCreate();  
•   
•  startId) {  
•   
• .onStart(intent, startId);  
• );  
• ;  
•         refresh();  
•   
•  onDestroy() {  
•   
• .onDestroy();  
•      * 关闭悬浮窗 
•   
•  removeView() {  
•  (viewAdded) {  
• ;  
•  createFloatView() {  
•  HandlerUI();  
•  UpdateUI();  
•  Thread(update);  
•   
• ).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) {  
•   
• ] = event.getX();  
• ] = event.getY();  
• ;  
•   
•  MotionEvent.ACTION_MOVE:  
• ) (event.getRawX() - temp[]),  
• ) (event.getRawY() - temp[]));  
• ;  
• ;  
•             }  
•  OnClickListener() {  
•   
•   
•  onClick(View v) {  
•   
• ;  
• );  
•  OnClickListener() {  
•   
•  onClick(View v) {  
•   
•      * 刷新悬浮窗 
•      * @param x 
•      * @param y 
•  y) {  
•   
• ) {  
•  Rect();  
•   
•   
•         refresh();  
•      * 添加悬浮窗或者更新悬浮窗 如果悬浮窗还没添加则添加 如果已经添加则更新其位置 
•  refresh() {  
•   
•  (viewAdded) {  
•  {  
• ;  
•      * 接受消息和处理消息 
•      * @author Administrator 
•  Handler {  
•  HandlerUI() {  
•   
•  HandlerUI(Looper looper) {  
• (looper);  
•          * 接收消息 
•   
•  handleMessage(Message msg) {  
•   
•   
•  (msg.what == UPDATE_PIC) {  
•  (!viewHide)  
•  {  
• .handleMessage(msg);  
•             }  
•      * 更新悬浮窗的信息 
•      * @author Administrator 
•  Runnable {  
•   
•  run() {  
•   
•   
•  (!Thread.currentThread().isInterrupted()) {  
•   
•   
•  {  
• );  
•  (InterruptedException e) {  
•   
• }

为悬浮窗创建布局文件

[html]
<?==?><=  
• =  
• =  
• =  
•   
•   
• =  
• =  
• =  
• =  
• =  
• =  
• =  
•   
• =  
• =  
• =  
• =  
• =  
• =  
• =  
• =  
• =  
•   
•   
• =  
• =  
• =  
• =  
• =  
• =  
• =  
• =  
• =  
•   
• =  
• =  
• =  
• =  
• =  
• =  
• =  
• =  
• </>

悬浮窗上的控件就跟Activity上一样使用

悬浮窗上显示的一些内存信息,通过工具类:SysInfoUtils.java来读取