Android悬浮窗口

FloatService:

package com.home.floatwindow;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.home.testfolatwindow.R;

public class FloatService extends Service {

	private WindowManager wm;
	private WindowManager.LayoutParams wmlp;
	private LinearLayout layout;

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		createFloatView();
	}

	private void createFloatView() {
		wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
		wmlp = new WindowManager.LayoutParams();
		wmlp.type = LayoutParams.TYPE_PHONE;
		// 设置图片格式,效果为背景透明
		wmlp.format = PixelFormat.RGBA_8888;
		// 设置浮动窗口不可聚焦
		wmlp.flags = LayoutParams.FLAG_NOT_FOCUSABLE;
		wmlp.gravity = Gravity.LEFT | Gravity.TOP;
		wmlp.x = 0;
		wmlp.y = 0;
		wmlp.width = WindowManager.LayoutParams.WRAP_CONTENT;
		wmlp.height = WindowManager.LayoutParams.WRAP_CONTENT;
		layout = getLayout();
		wm.addView(layout, wmlp);
		layout.measure(View.MeasureSpec.makeMeasureSpec(0,
				View.MeasureSpec.UNSPECIFIED), View.MeasureSpec
				.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
		ImageView iv = (ImageView) layout.findViewById(1);
		iv.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Log.i("onClick", "onClick");
			}
		});
		iv.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// getRawX是触摸位置相对于屏幕的坐标,getX是相对于按钮的坐标
				wmlp.x = (int) event.getRawX() - layout.getMeasuredWidth() / 2;
				// 减25为状态栏的高度
				wmlp.y = (int) event.getRawY() - layout.getMeasuredHeight() / 2
						- 25;
				wm.updateViewLayout(layout, wmlp);
				return false;
			}
		});
	}

	private LinearLayout getLayout() {
		LinearLayout layout = new LinearLayout(this);
		ImageView iv = new ImageView(this);
		iv.setBackgroundResource((R.drawable.ic_launcher));
		iv.setId(1);
		layout.addView(iv);
		return layout;
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		if (layout != null) {
			// 移除悬浮窗口
			wm.removeView(layout);
		}
	}
}

权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
时间: 2024-10-13 11:47:16

Android悬浮窗口的相关文章

Android 悬浮窗口

一.创建悬浮窗口步骤    1.实现一个ViewGroup类,作为悬浮窗口的界面类,以便在里面重写onInterceptTouchEvent和onTouchEvent方法,实现移动界面的目的.       在本例中实现了一个FloatLayer类,可以作为通用的类,使用时需要传入WindowManager对象以实现移动窗口. // FloatLayer ~ package com.example.hellofloatingwnd; import static com.ahai.util.Debu

Android悬浮窗口的实现

效果图:(悬浮框可拖动) 在项目开发中有一个需求:弹出悬浮窗后,响应悬浮窗的事件再弹出对话框,但是对话框怎么也不显示.也就是说在弹出悬浮框的同时,不能再弹出对话框,可能的原因: 1.悬浮框的焦点在最前面,把对话框挡住了,我们看不到. 2.浮动框限制了对话框的弹出. 解决: 弹出对话框的时候把悬浮框关掉,然后对话框处理完了,把对话框关掉,在重新开启一个悬浮框,把需要的值传进去. 就相关知识详解: 当我们在手机上使用360安全卫士时,手机屏幕上时刻都会出现一个小浮动窗口,点击该浮动窗口可跳转到安全卫

Android中可自由移动悬浮窗口的实现

大家对悬浮窗概念不会陌生,相信每台电脑桌面的右上角都会有这么一个东西,它总是出现在所有页面的顶端(Top Show).但在Android平台中如何实现这样的效果呢?先来看一看效果图. 看见在Google搜索框上面的那个Icon图片了嘛.下面我就来详细介绍一下在Android平台下悬浮窗口的实现,并让它能够随手指的触摸而移动. 一.实现原理及移动思路 调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView

Android使用WindowManager实现悬浮窗口

原文地址:http://www.3g-edu.org/news/art027.htm 下面就介绍一下如何通过WindowManager来实现这个效果. 通过WindowManager的addView()方法,并设置WindowManager.LayoutParams的相关属性,就可以往WindowManager中加入所需要的View,而根据WindowManager.LayoutParams属性不同,也就能实现不同的效果.比如创建系统顶级窗口,实现悬浮窗口效果.如果需要将View从WindowM

Android 实现顶层窗口、悬浮窗口

1.如图片1所示,在一个Android应用中,除了标题栏和底层的ActionBar的区域,是我们可以操纵的UI区域,那是不是说我们就不能改变除了这两个区域的UI呢?答案是否定的. 比如现在我们希望把一个View放在窗口的最低端显示,通过hierarchyviewer工具我们可以发现最底层的ActionBar是在TestActivity布局的父窗口中设置的,那么我们想通过setContentView(R.layout.activity_main)在activity_main布局文件中设置就无法实现

Android中悬浮窗口

调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了.比如创建系统顶级窗口,实现悬浮窗口效果!WindowManager的方法很简单,基本用到的就三个addView,removeView,updateViewLayout.而WindowManager.LayoutParams的属性就

android 类似360悬浮窗口实现源码

当我们在手机上安装360安全卫士时,手机屏幕上时刻都会出现一个小浮动窗口,点击该浮动窗口可跳转到安全卫士的操作界面,而且该浮动窗口不受其他activity的覆盖影响仍然可见(多米音乐也有相关的和主界面交互的悬浮小窗口).它能悬浮在手机桌面,且不受Activity界面的影响,说明该悬浮窗口是不隶属于Activity界面的,也就是说,他是隶属于启动它的应用程序所在进程.如360App所在的应用进程,当杀掉它所在的应用进程时,它才会消失.悬浮窗口的实现涉及到WindowManager(基于4.0源码分

【Anroid界面实现】通用的桌面悬浮窗口的实现(一)

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 现在很多安全类的软件,比如360手机助手,百度手机助手等等,都有一个悬浮窗,可以飘浮在桌面上,方便用户使用一些常用的操作.今天这篇文章,就是介绍如何实现桌面悬浮窗效果的. 首先,看一下效果图. 悬浮窗一共分为两个部分,一个是平常显示的小窗口,另外一个是点击小窗口显示出来的二级悬浮窗口. 首先,先看一下这个项目的目录结构. 最关键的就是红框内的四个类. 首先,FloatWindowService是一个后台的

Android悬浮窗实现 使用WindowManager

本文转载自: http://blog.csdn.net/stevenhu_223/article/details/8504058 悬浮窗口的实现涉及到WindowManager(基于4.0源码分析),它是一个接口,实现类有WindowManagerImpl,CompatModeWrapper(WindowManagerImpl的内部类),LocalWindowManager(Window的内部类),它们之间的关系如下图的类图: WindowManagerImpl: 1.是WindowManage