`

[转]android 一直在最前面的浮动窗口效果

 
阅读更多

http://ljl-xyf.iteye.com/blog/1207069

 

今天发现一些软件可以在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 ");
                view.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" />

系统权限,不然会出错的呀。。。。。。。。。。。。。

分享到:
评论
3 楼 obehavior 2017-11-24  
view.setOnTouchListener
view是什么
2 楼 wutenghua 2015-05-03  
  
1 楼 allenny 2012-02-10  
Activity退出后还能存在吗?

相关推荐

    android例子 360浮动窗口效果.rar

    在Android开发中,360浮动窗口效果是一种常见的应用功能,尤其在系统工具或辅助类应用中常见。这种效果使得应用程序可以在用户界面的顶部或底部显示一个小窗口,即便用户在其他应用中操作,该窗口仍然可见,从而提供...

    android 360浮动窗口

    在Android开发中,360浮动窗口是一种常见的应用交互设计,它允许用户在主屏幕上进行悬浮操作,提高用户的使用效率和体验。360浮动窗口通常用于即时通讯、音乐播放、视频监控等场景,使用户可以同时处理多个任务。...

    android最前端浮动窗口

    在Android系统中,"最前端浮动窗口"通常指的是悬浮窗(Floating Window)或者叫系统顶层窗口,这种技术常被用于实现各种创新的功能,比如音乐播放器的歌词显示、游戏外挂监控、即时通讯应用的聊天窗口等。在Android...

    android 浮动按钮、浮动窗口、悬浮窗口

    在Android开发中,浮动按钮(Floating Action Button, FAB)、浮动窗口(Floating Window)和悬浮窗口(Floating Window)是常见的用户界面元素,用于提供便捷的操作入口或者实现特殊显示效果。以下将详细介绍这些...

    android 浮动窗口 模拟Home键

    在Android系统中,浮动窗口(Float Window)是一种特殊类型的窗口,它可以在用户界面的顶层显示,允许用户在不离开当前应用的情况下访问或操作其他内容。这种技术常用于各种辅助工具或者快捷方式应用,例如,模拟...

    android 浮动窗口 小窗口

    在Android平台上,浮动窗口(通常称为悬浮窗或小窗口)是一种可以独立于应用程序主界面,在屏幕上方自由移动和缩放的UI元素。这种技术在许多应用中被广泛使用,例如浮动便签、屏幕录制工具或者多任务管理器。在本篇...

    android浮动窗口项目源码

    【标题】"Android浮动窗口项目源码"是一个专注于在Android操作系统上实现类似Windows 7桌面系统的浮动窗口功能的开发资源。这种技术可以让用户在主屏幕上层叠加多个窗口,提高多任务处理的效率和便利性。 【描述】...

    android浮动窗口实现级点击消失例子

    在Android开发中,浮动窗口(通常称为悬浮窗或者小部件)是一种常见的功能,它可以在主屏幕或其他应用之上显示内容,为用户提供便捷的操作或信息展示。本教程将详细讲解如何利用`WindowManager`来创建一个浮动窗口,...

    2021-辅助类库-Android 视频浮动窗口源码.zip

    在Android开发中,实现视频浮动窗口(也称为悬浮窗或浮动播放器)是一项常见的需求,尤其是在需要让用户在使用其他应用的同时观看视频的应用场景下。这个压缩包“2021-辅助类库-Android 视频浮动窗口源码.zip”提供...

    安卓Android源码——浮动窗口播放器.zip

    【标题】"安卓Android源码——浮动窗口播放器"指的是一个专门为Android平台设计的应用程序源代码,它允许视频在屏幕的任何位置以浮动窗口的形式进行播放。这种功能常见于一些多任务处理的应用,如音乐播放器或视频...

    360浮动窗口效果

    在Android开发中,360浮动窗口效果是一种常见的交互设计,它允许应用在屏幕上显示一个悬浮的小窗口,用户可以自由移动、缩放该窗口,同时不影响其他应用的正常运行。这种效果常见于如聊天应用、视频播放器等,提供了...

    Android 视频浮动窗口源码.zip

    在Android开发中,实现视频浮动窗口(又称为悬浮窗或小窗口)是一项有趣且实用的技术。这通常涉及到在用户界面的任何位置展示一个小型的视频播放器,即使用户在使用其他应用时,视频也能继续播放。这样的功能常见于...

    浮动窗口按钮截图

    在Android开发中,浮动窗口按钮截图是一种常见的功能,它允许用户在屏幕上自由移动一个按钮,点击该按钮即可快速截图。这种技术涉及到多个Android系统组件和技术,包括浮动窗口、服务和服务的生命周期管理、权限控制...

    安卓悬浮窗相关-android浮动按钮浮动窗口悬浮窗口.rar

    在安卓平台上,浮动按钮(Floating Action Button,简称FAB)和悬浮窗口(悬浮视图,通常称为FloatWindow或SystemBar)是两种常见的UI元素,它们为用户提供便捷的交互方式。让我们深入探讨这两种技术及其在安卓应用...

    Android高级应用源码-浮动窗口播放器.zip

    【标题】"Android高级应用源码-浮动窗口播放器.zip" 涉及到的是在Android平台上实现一种高级功能——浮动窗口播放器。这种技术通常用于视频或音乐播放应用,允许用户在使用其他应用的同时,视频或音频内容以一个小...

    可自动移动和手动移动的浮动窗口

    在Android开发中,浮动窗口(通常称为悬浮窗或者系统级通知)是一种可以在用户界面上自由移动的小型窗口,常用于实现如聊天头像、音乐播放控制器等应用功能。本项目"可自动移动和手动移动的浮动窗口"提供了一个完整...

    Android 浮动窗口 StandOut

    在Android平台上,浮动窗口(Floating Window)是一种独特的用户界面元素,它允许应用程序在主屏幕或其他应用之上显示内容,提供了一种高效的信息展示和交互方式。"Android 浮动窗口 StandOut"是一个专为此目的设计...

    android视频播放浮动窗口对话框

    在Android开发中,实现视频播放浮动窗口对话框是一项常见的需求,尤其在移动设备上,用户可能希望在使用其他应用的同时观看视频。这个功能通常被称为"悬浮窗"或"小窗口模式",它允许视频在屏幕的任何位置自由移动并...

    浮动窗口动画显示

    在Android开发中,实现浮动窗口动画显示涉及到多个关键知识点,包括自定义视图、窗口权限、动画处理以及触摸事件响应。下面将详细讲解这些概念及其应用。 首先,我们需要理解Android中的浮动窗口,通常称为“悬浮窗...

Global site tag (gtag.js) - Google Analytics