`
iaiai
  • 浏览: 2196427 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 为你的应用添加悬浮窗功能

 
阅读更多
不知道有没有童鞋用过QQ的Android版本中的一个高清版本,当你退出QQ的时候,会在你的屏幕上出现一个QQ图标的悬浮窗,就和PC上的迅雷的悬浮窗口一样,在所有应用的最上层,本来这个功能感觉还是挺好的,结果TX就给流氓了下,居然没有做隐藏掉这个悬浮窗的功能。

今天就来为大家简单介绍下这个悬浮窗的实现方法吧,不过记住至少还是给用户做一个隐藏掉这个悬浮窗的功能吧!其实实现原理还是挺简单的,就是利用WindowManager将你的图标View添加到窗口中,不知道大家知道WindowManager.LayoutParams中有一个type属性不,这里玄机挺大的,找了好久,终于给我试出来有一个TYPE_PHONE可以来实现这个功能的,该类型提供与用户交互,置于所有应用程序上方,但是在状态栏后面。至于其他的类型,大家还是去找API或者GG吧。
先看下效果图吧:

红框圈中得图标可以任意拖动哦,你可以根据自己的实际需要给图标添加功能。

核心代码如下:
package com.iaiai.activity;

import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;

/**
 * 
 * <p>
 * Title: TopFloatService.java
 * </p>
 * <p>
 * E-Mail: 176291935@qq.com
 * </p>
 * <p>
 * QQ: 176291935
 * </p>
 * <p>
 * Http: iaiai.iteye.com
 * </p>
 * <p>
 * Create time: 2012-2-10 上午9:31:54
 * </p>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class TopFloatService extends Service {

	WindowManager wm = null;
	WindowManager.LayoutParams wmParams = null;
	View view;
	private float mTouchStartX;
	private float mTouchStartY;
	private float x;
	private float y;
	
	@Override
	public void onCreate() {
		super.onCreate();
		view = LayoutInflater.from(this).inflate(R.layout.floating, null);
		createView();
	}

	private void createView() {
		// 获取WindowManager
		wm = (WindowManager) getApplicationContext().getSystemService("window");
		// 设置LayoutParams(全局变量)相关参数
		wmParams =  ((MyApplication) getApplication()).getMywmParams();
		wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;// 该类型提供与用户交互,置于所有应用程序上方,但是在状态栏后面
		wmParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 不接受任何按键事件
		wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 调整悬浮窗口至左上角
		// 以屏幕左上角为原点,设置x、y初始值
		wmParams.x = 0;
		wmParams.y = 0;
		// 设置悬浮窗口长宽数据
		wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
		wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
		wmParams.format = PixelFormat.RGBA_8888;

		wm.addView(view, wmParams);

		view.setOnTouchListener(new OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event) {
				// 获取相对屏幕的坐标,即以屏幕左上角为原点
				x = event.getRawX();
				// 25是系统状态栏的高度,也可以通过方法得到准确的值,自己微调就是了
				y = event.getRawY()-25 ; 
				switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN:
					// 获取相对View的坐标,即以此View左上角为原点
					mTouchStartX = event.getX();
					mTouchStartY = event.getY()+view.getHeight()/2;
					break;
				case MotionEvent.ACTION_MOVE:
					updateViewPosition();
					break;
				case MotionEvent.ACTION_UP:
					updateViewPosition();
					mTouchStartX = mTouchStartY = 0;
					break;
				}
				return true;
			}

		});
	}
	
	private void updateViewPosition() {
		// 更新浮动窗口位置参数
		wmParams.x = (int) (x - mTouchStartX);
		wmParams.y = (int) (y - mTouchStartY);
		wm.updateViewLayout(view, wmParams);
	}

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


  • 大小: 40.3 KB
分享到:
评论
1 楼 xinyuetonghua 2012-04-28  
请教个问题,怎么很好是区分是view的点击事件还是view的setOnTouchListener事件

相关推荐

    Android应用内悬浮窗的实现方案示例

    悬浮窗,大家应该也不陌生,凌驾于应用之上的一个小弹窗,实现上很简单,就是添加一个系统级别的窗口,Android中通过WindowManagerService( WMS)来管理所有的窗口,对于WMS来说,管你是Activity、Toast、Dialog,...

    android 悬浮窗全屏显示,锁屏页面悬浮窗全屏显示

    1. **悬浮窗基础**:在Android中,悬浮窗通常通过`android.view.WindowManager`服务来创建,它允许应用在屏幕的任意位置添加、移动或删除视图。悬浮窗需要`SYSTEM_ALERT_WINDOW`权限,可以在应用的`AndroidManifest....

    android实现悬浮窗功能,无需权限

    在Android开发中,实现一个无需额外权限的悬浮窗功能是一个常见的需求,特别是在打造辅助工具或者个性化应用时。本文将详细讲解如何在Android系统4.4(API Level 19)及以上版本实现这样的功能,主要涉及的技术点是...

    Android 视频悬浮窗

    通过深入理解Android的窗口管理、视图系统以及多媒体播放,你可以进一步优化悬浮窗的性能和用户体验,例如添加拖放功能、调整视频比例、处理屏幕旋转等。这个名为`MyFloatView`的压缩包文件提供了一个直接运行的示例...

    Android应用源码之android 悬浮窗.zip

    4. **添加和移除悬浮窗**:通过`WindowManager`的`addView()`方法添加悬浮窗,`removeView()`方法移除它。同时,可能还需要处理用户的触摸事件,以便在用户触摸到悬浮窗时做出响应。 5. **动态更新**:如果需要实时...

    Android仿微信文章阅读悬浮窗

    通过以上步骤,你可以成功地在Android应用中实现类似微信文章阅读时的悬浮窗功能。在实际开发中,可能还需要根据具体需求进行优化,例如添加动画效果、自定义拖动行为等。总之,理解并熟练运用这些知识点是开发高效...

    android桌面悬浮窗

    3. 获取`WindowManager`服务并添加悬浮窗:通过`Context.getSystemService()`方法获取到`WindowManager`服务,然后调用`addView()`方法将自定义的视图添加到悬浮窗中。 ```java WindowManager windowManager = ...

    android伸缩式悬浮窗

    4. 添加悬浮窗到窗口: 使用`WindowManager`的`addView()`方法将我们的视图添加到屏幕上。在这个过程中,我们需要传递布局、布局参数以及视图的父容器(通常是空的FrameLayout): ```java FrameLayout parent...

    Android 悬浮窗 可点击

    在AndroidManifest.xml文件中,添加悬浮窗所需的权限: ```xml &lt;uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/&gt; ``` 2. 创建悬浮视图: 悬浮窗的核心是通过`WindowManager`接口来管理...

    Android-Andorid任意界面悬浮窗实现悬浮窗如此简单

    这个标题“Android-Android任意界面悬浮窗实现悬浮窗如此简单”暗示了我们将探讨如何轻松地创建这样的功能。描述进一步强调了实现的简便性,让我们相信即使对Android开发不太熟悉的人也能理解并实现。 首先,我们要...

    Android实例源码-悬浮窗类安卓源代码(4例).zip

    主要涉及的核心类是`WindowManager`和`LayoutParams`,以及如何通过`addView`方法将自定义视图添加到悬浮窗中。开发者还需要理解AndroidManifest.xml中的相关权限设置,如`SYSTEM_ALERT_WINDOW`。 3. **android桌面...

    Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果 源码程序

    在`AndroidManifest.xml`中,需要添加悬浮窗所需的权限: ``` &lt;uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /&gt; ``` 这个权限使得应用可以在其他应用之上显示窗口。 3. **悬浮窗...

    android后台服务悬浮窗动态截屏

    在Android开发中,后台服务(Service)和悬浮窗(Floating Window)是两个关键概念,而动态截屏和录屏功能的实现则涉及到更深层次的技术。本文将深入探讨如何利用IntentService进行后台截屏,并实现悬浮窗来动态显示...

    Android利用WindowManager实现悬浮窗

    5. 使用WindowManager对象,添加悬浮窗视图,使用addView方法来添加View。 6. 最后,使用updateViewLayout方法来更新悬浮窗的位置和大小。 四、WindowManager类型 WindowManager提供了多种类型的窗口,包括: * ...

    应用级可自动贴边悬浮窗(只在本身应用中显示)

    1. 权限声明:首先,要在AndroidManifest.xml中添加悬浮窗权限: ```xml &lt;uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /&gt; ``` 由于Android 6.0(API Level 23)及以上版本,用户需要在...

    Android应用源码之android 悬浮窗-IT计算机-毕业设计.zip

    总的来说,这份"Android应用源码之android 悬浮窗"资源为初学者提供了实践悬浮窗功能的实例,可以帮助他们深入理解Android系统的运行机制,提升移动应用开发技能。同时,对于毕业设计,可以作为研究Android特色功能...

    Android 悬浮窗的实现源码

    6. **添加悬浮窗**: 在Service的`onCreate()`方法中,实例化`WindowManager`和`LayoutParams`,然后使用`windowManager.addView(customView, layoutParams)`将自定义View添加到屏幕。 7. **更新和移除悬浮窗**: ...

Global site tag (gtag.js) - Google Analytics