`

悬浮窗口的实现

阅读更多
最近一些软件有了很牛X的悬浮窗口功能,很好奇怎么实现的,刚刚终于弄出来了...原理就是调用WindowManager直接操控View,然后再配合相应的WindowManager.LayoutParams属性,就OK了。这样产生出来的View根据LayoutParams的属性不同,效果也不一样。有关具体的属性,请自行参考SDK文档。

以下代码请仅供演示:

public class myFloatView extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button bb=new Button(getApplicationContext());
        WindowManager wm=(WindowManager)getApplicationContext().getSystemService("window");
        WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();
        wmParams.type=2002;  //type是关键,这里的2002表示系统级窗口,你也可以试试2003。
        wmParams.format=1;
        wmParams.flags=40;
        wmParams.width=40;
        wmParams.height=40;
        wm.addView(bb, wmParams);
    }



以下转自:http://blog.csdn.net/ljl_xyf/article/details/6894220
今天发现一些软件可以在android 的桌面上显示一些浮动小窗口,经过一番查找,终于找到的解决方案,代码如下:

FloatingFunc.java:

package hrxcframe.comm;

import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.test.R;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;

/**
 * 可以永远显示在android屏幕最上方的浮动菜单
 * 
 * @author liujl v1.0 需要添加 <uses-permission
 *         android:name="android.permission.SYSTEM_ALERT_WINDOW"
 *         /><!--系统弹出窗口权限-->权限不然会报错
 */
public class FloatingFunc {
    /**
     * 浮动窗口在屏幕中的x坐标
     */
    private static float x = 0;
    /**
     * 浮动窗口在屏幕中的y坐标
     */
    private static float y = 200;
    /**
     * 屏幕触摸状态,暂时未使用
     */
    private static float state = 0;
    /**
     * 鼠标触摸开始位置
     */
    private static float mTouchStartX = 0;
    /**
     * 鼠标触摸结束位置
     */
    private static float mTouchStartY = 0;
    /**
     * windows 窗口管理器
     */
    private static WindowManager wm = null;

    /**
     * 浮动显示对象
     */
    private static View floatingViewObj = null;

    /**
     * 参数设定类
     */
    public static WindowManager.LayoutParams params = new WindowManager.LayoutParams();
    public static int TOOL_BAR_HIGH = 0;
    /**
     * 要显示在窗口最前面的对象
     */
    private static View view_obj = null;

    /**
     * 要显示在窗口最前面的方法
     * 
     * @param context
     *            调用对象Context getApplicationContext()
     * @param window
     *            调用对象 Window getWindow()
     * @param floatingViewObj
     *            要显示的浮动对象 View
     */
    public static void show(Context context, Window window, View floatingViewObj) {
        // 加载xml文件中样式例子代码
        // ********************************Start**************************
        // LayoutInflater inflater =
        // LayoutInflater.from(getApplicationContext());
        // View view = inflater.inflate(R.layout.topframe, null);
        // wm =
        // (WindowManager)context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
        // 加载xml文件中样式例子代码
        // *********************************End***************************
        //
        // 关闭浮动显示对象然后再显示
        close(context);
        FloatingFunc.floatingViewObj = floatingViewObj;

        view_obj = floatingViewObj;
        Rect frame = new Rect();
        // 这一句是关键,让其在top 层显示
        // getWindow()
        window.getDecorView().getWindowVisibleDisplayFrame(frame);
        TOOL_BAR_HIGH = frame.top;

        wm = (WindowManager) context// getApplicationContext()
                .getSystemService(Activity.WINDOW_SERVICE);
        params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
                | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
        params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
                | LayoutParams.FLAG_NOT_FOCUSABLE;

        // 设置悬浮窗口长宽数据
        params.width = WindowManager.LayoutParams.WRAP_CONTENT;
        params.height = WindowManager.LayoutParams.WRAP_CONTENT;
        // 设定透明度
        params.alpha = 80;
        // 设定内部文字对齐方式
        params.gravity = Gravity.LEFT | Gravity.TOP;

        // 以屏幕左上角为原点,设置x、y初始值?
        params.x = (int) x;
        params.y = (int) y;
        // tv = new MyTextView(TopFrame.this);
        wm.addView(floatingViewObj, params);
    }

    /**
     * 跟谁滑动移动
     * 
     * @param event
     *            事件对象
     * @param view
     *            弹出对象实例(View)
     * @return
     */
    public static boolean onTouchEvent(MotionEvent event, View view) {

        // 获取相对屏幕的坐标,即以屏幕左上角为原点
        x = event.getRawX();
        y = event.getRawY() - 25; // 25是系统状态栏的高度
        Log.i("currP", "currX" + x + "====currY" + y);// 调试信息
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            state = MotionEvent.ACTION_DOWN;
            // panTime();
            // 获取相对View的坐标,即以此View左上角为原点
            mTouchStartX = event.getX();
            mTouchStartY = event.getY();
            Log.i("startP", "startX" + mTouchStartX + "====startY"
                    + mTouchStartY);// 调试信息

            break;
        case MotionEvent.ACTION_MOVE:
            state = MotionEvent.ACTION_MOVE;
            updateViewPosition(view);
            break;

        case MotionEvent.ACTION_UP:
            state = MotionEvent.ACTION_UP;
            updateViewPosition(view);
            mTouchStartX = mTouchStartY = 0;
            break;
        }
        return true;
    }

    /**
     * 关闭浮动显示对象
     */
    public static void close(Context context) {

        if (view_obj != null && view_obj.isShown()) {
            WindowManager wm = (WindowManager) context
                    .getSystemService(Activity.WINDOW_SERVICE);
            wm.removeView(view_obj);
        }
    }

    /**
     * 更新弹出窗口位置
     */
    private static void updateViewPosition(View view) {
        // 更新浮动窗口位置参数
        params.x = (int) (x - mTouchStartX);
        params.y = (int) (y - mTouchStartY);
        wm.updateViewLayout(FloatingFunc.floatingViewObj, params);
    }

}


测试代码,放到任意的 Activity 代码里就可以,可以用手拖动位置:

final TextView tv = new TextView(getApplicationContext());
tv.setText("http://www.my400800.cn");
tv.setOnTouchListener(new View.OnTouchListener() {
	
	@Override
	public boolean onTouch(View arg0, MotionEvent arg1) {
		FloatingFunc.onTouchEvent(arg1, tv);
		return true;
	}
});


效果如下:



注意事项:
一定要在AndroidManifest.xml添加
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

系统权限,不然会出错的呀
  • 大小: 44.5 KB
分享到:
评论

相关推荐

    悬浮窗口和半透明实现效果

    以下是一个简单的悬浮窗口实现示例: ```java // 创建布局 LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.float_view, ...

    Android悬浮窗口

    下面是一个简单的悬浮窗口实现示例: ```java WindowManager.LayoutParams params = new WindowManager.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Build....

    JavaScript 悬浮窗口实现代码

    2. JavaScript在悬浮窗口实现中的作用: JavaScript是一种广泛用于前端开发的脚本语言,可以用来控制悬浮窗口的行为和样式。通过JavaScript可以定义悬浮窗口的出现逻辑(比如页面滚动到某个位置时显示),以及悬浮...

    实现窗口悬浮效果

    在本文中,我们将深入探讨如何在Qt环境中实现窗口悬浮效果,以及如何在主窗口与子悬浮窗口之间进行转换。Qt是一个强大的跨平台应用程序开发框架,它提供了丰富的功能和API,使得开发者可以方便地创建出具有高级特性...

    vb类似搜狐输入法的悬浮窗口实现方法.rar

    用vb制作一个类似于搜狐输入法的悬浮式的窗口,本源码向你展示了制作悬浮窗口的方法和完整的实例代码,这个悬浮的窗口显示于其它窗口的最顶层,不被遮挡,窗口中的按钮可调用出对应的操作菜单,和现在的搜狐输入法...

    Android视频悬浮窗口实现的示例代码

    本文例子实现了点击显示悬浮窗口,同时窗口可播放视频,拖动位置,点击关闭及返回 APP 页面,通过例子来讲述悬浮窗口实现原理及细节处理,效果图如下所示: 悬浮窗口.gif 原理  WindowManager 对 View 视图进行添加...

    QFramer带悬浮窗口.7z

    4. **悬浮窗口实现**:通过QWindow或QWidget的子类,结合QGraphicsView和QGraphicsScene进行图形渲染,可以实现浮动窗口的功能。悬浮窗口可以在主窗口上方自由移动,不受父窗口限制。 5. **事件处理与信号槽机制**...

    桌面上的悬浮窗口(类似Flashget)

    标题中的“桌面上的悬浮窗口(类似Flashget)”是指一种在电脑桌面顶部浮动的小窗口,类似于早期...而DeskTopTools这样的压缩包可能包含的就是实现这些功能的软件或脚本,用户解压后安装即可体验到悬浮窗口带来的便利。

    悬浮窗口

    实现悬浮窗口技术涉及到多个编程概念,包括窗口管理、事件处理和多线程。开发者需要利用操作系统提供的API(应用程序接口)来创建和管理这些窗口,确保它们能正确响应用户的触摸或鼠标操作,并与其他应用和平共处。...

    Qt悬浮窗口

    本文将基于提供的标题"Qt悬浮窗口",描述以及相关文件名,详细讲解实现这样一个功能的关键步骤。 首先,让我们了解一下Qt中的窗口去边框。在Qt中,我们可以通过设置窗口的窗口样式(WindowFlags)来移除边框。在`...

    页面悬浮窗口源码

    页面悬浮窗口源码是一种在网页设计中常见的技术,主要用于实现元素在页面滚动时始终保持在屏幕某一位置的效果。这种设计常用于展示重要的通知、广告或工具栏,为用户提供便捷的访问途径,而不会因页面滚动而消失。在...

    WindowManager实现悬浮窗口&可自由移动的悬浮窗口

    在Android开发中,实现一个可自由移动的悬浮窗口通常涉及到`WindowManager`服务的使用。`WindowManager`是Android系统提供的一个接口,允许应用程序在窗口管理器中添加、删除或配置视图。在这个主题中,我们将深入...

    android悬浮窗口 demo

    在Android开发中,"android悬浮窗口 demo"是一个用于展示如何在Android系统上创建并实现悬浮窗口(也称为小部件或浮动视图)的应用实例。悬浮窗口通常被设计为始终显示在用户界面的最顶层,即使在其他应用运行时也...

    android悬浮窗口的实现

    实现Android悬浮窗口涉及到对Android系统的底层API有深入的理解以及对权限管理的掌握。 ### 1. 允许悬浮窗口权限 在Android 4.4 (KitKat)之后,应用需要获取`SYSTEM_ALERT_WINDOW`权限才能显示悬浮窗口。在...

    悬浮窗口(winform)

    为了实现悬浮窗口的效果,我们需要利用`Form`类的一个属性:`TopMost`。`TopMost`属性设置为`true`时,该窗体将始终位于其他非顶级窗口的顶部。在C#中,我们可以这样设置: ```csharp public partial class ...

    Android悬浮窗口demo

    "Android悬浮窗口demo"是一个用于演示如何在Android平台上实现此类功能的应用。 首先,悬浮窗口的实现主要依赖于两个核心组件:`WindowManager`服务和一个特殊的窗口类型。`WindowManager`是Android系统提供的接口...

    VB6.0仿迅雷悬浮窗口(图标)的实现源码.rar

    VB6.0仿迅雷悬浮窗口(图标)的实现源码,迅雷的悬浮窗相信大家很熟悉了,其实就是显示一个图标,悬浮在屏幕上,通过这个悬浮图标可单击右键调出菜单,双击图标则会显示主窗口,本源码模拟了悬浮窗口的实现,另外是...

    javascript悬浮窗口控件

    通过JavaScript,开发者能够创建动态的、可自定义的悬浮窗口,以提高用户体验或实现特定功能。 在JavaScript中,悬浮窗口通常通过以下技术实现: 1. CSS定位:利用CSS的`position`属性(如`fixed`或`absolute`)来...

Global site tag (gtag.js) - Google Analytics