android如何实现桌面移动悬浮窗口

  介绍

这篇文章将为大家详细讲解有关android如何实现桌面移动悬浮窗口,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

现在很多应用都有这样的功能,比如360等安全卫士,手机管家之内的应用。

效果图:

 android如何实现桌面移动悬浮窗口

<强>一、实现原理及移动思路

调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建视图,这样产生出来的视图根据WindowManager.LayoutParams属性不同,效果也就不同了。比如创建系统顶级窗口,实现悬浮窗口效果!然后通过覆写悬浮视图中onTouchEvent方法来改变windowMananager。LayoutParams中x和y的值来实现自由移动悬浮窗口。

<强>二、示例代码

先看看悬浮视图的代码把

package  com.example.suspend;   ,   import  android.content.Context;   import  android.util.Log;   import  android.view.MotionEvent;   import  android.view.WindowManager;   import  android.widget.ImageView;   ,   public  class  MyFloatView  extends  ImageView  {   ,private  float  mTouchStartX;   ,private  float  mTouchStartY;   ,private  float  x;   y, private  float ;   ,   ,private  WindowManager  wm =, (WindowManager), getContext ()   .getApplicationContext才能().getSystemService (“window");   ,//此wmParams变量为获取的全局变量,用以保存悬浮窗口的属性   ,private  WindowManager.LayoutParams  wmParams =, ((MyApplication), getContext ()   .getApplicationContext才能()).getMywmParams ();   ,   ,public  MyFloatView (Context 上下文),{   ,超级(上下文);   ,}   ,   ,@Override   ,public  boolean  onTouchEvent (MotionEvent 事件),{   ,//TODO  Auto-generated  method 存根   ,//获取相对屏幕的坐标,即以屏幕左上角为原点=,,x  event.getRawX ();=,,y  event.getRawY(),安康;25,,//,25是系统状态栏的高度   ,Log.i (“currP",,“currX", +, x  +,“====currY", +, y);   ,   ,switch  (event.getAction ()), {   ,case  MotionEvent.ACTION_DOWN://,捕获手指触摸按下动作//,才能获取相对视图的坐标,即以此视图左上角为原点   时间=mTouchStartX 才能;event.getX ();   时间=mTouchStartY 才能;event.getY ();   Log.i才能(“startP",,“startX", +, mTouchStartX  +,“====startY"   ,,+,mTouchStartY);   打破才能;   ,case  MotionEvent.ACTION_MOVE://捕获手指触摸移动动作,,,,,,   updateViewPosition才能(),,   打破才能;   ,case  MotionEvent.ACTION_UP://捕获手指触摸离开动作,   updateViewPosition才能(),,   mTouchStartX=mTouchStartY=0;才能,   打破才能;   ,默认值:   打破才能;   ,}   ,return 真实;   ,}   ,   ,private  void  updateViewPosition (), {   ,//更新浮动窗口位置参数,=,wmParams.x  (int) (x 作用;mTouchStartX);=,wmParams.y  (int) (y 作用;mTouchStartY);   ,wm.updateViewLayout(这,wmParams);//刷新显示,,   ,}   }

上面的wmParams变量(即WindowManager。LayoutParams)的存储采用了扩展应用程序的方式来创建全局变量,
示例代码如下:

package  com.example.suspend;   ,   import  android.app.Application;   import  android.view.WindowManager;   ,   public  class  MyApplication  extends  Application  {   ,private  WindowManager.LayoutParams  wmParams =, new  WindowManager.LayoutParams ();   ,   ,@Override   ,public  void  onCreate (), {   ,//TODO  Auto-generated  method 存根   ,super.onCreate ();   ,}   ,   ,public  WindowManager.LayoutParams  getMywmParams (), {   ,return  wmParams;   ,   ,}   ,   }

再来看一看活动中的代码:

package  com.example.suspend;   ,   import  android.app.Activity;   import  android.graphics.PixelFormat;   import  android.os.Bundle;   import  android.view.Gravity;   import  android.view.WindowManager;   import  android.view.WindowManager.LayoutParams;   ,   public  class  MainActivity  extends  Activity  {   ,private  WindowManager 治疗;   ,private  WindowManager.LayoutParams  wmParams;   ,private  MyFloatView  myFV;   ,   ,@Override   ,protected  void  onCreate (Bundle  savedInstanceState), {   ,super.onCreate (savedInstanceState);   ,setContentView (R.layout.activity_main);   ,//创建悬浮窗口   ,createFloatView ();   ,}   ,   ,private  void  createFloatView (), {=,,myFV  new  MyFloatView (getApplicationContext ());   ,myFV.setImageResource (R.drawable.ic_launcher);   ,//获取WindowManager=,wm  (WindowManager), getApplicationContext () .getSystemService (“window");   ,//设置LayoutParams(全局变量)相关参数   ,wmParams =, ((MyApplication), getApplication ()) .getMywmParams ();   ,   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

android如何实现桌面移动悬浮窗口