介绍
这篇文章将为大家详细讲解有关android如何实现桌面移动悬浮窗口,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
现在很多应用都有这样的功能,比如360等安全卫士,手机管家之内的应用。
效果图:
<强>一、实现原理及移动思路强>
调用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 nullandroid如何实现桌面移动悬浮窗口