Android常用控件之悬浮窗(Service实现)
悬浮窗可以显示在所有应用程序之上,不管在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
                    
                
                
            
        
浙公网安备 33010602011771号