android实现桌面移动悬浮窗口

现在很多应用都有这样的功能,比如360等安全卫士,手机管家之内的应用。

效果图:

一、实现原理及移动思路

调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了。比如创建系统顶级窗口,实现悬浮窗口效果!然后通过覆写悬浮View中onTouchEvent方法来改变windowMananager.LayoutParams中x和y的值来实现自由移动悬浮窗口。

二、示例代码

先看看悬浮View的代码把

package com.example.suspend;

import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.ImageView;

public class MyFloatView extends ImageView {
 private float mTouchStartX;
 private float mTouchStartY;
 private float x;
 private float y;

 private WindowManager wm = (WindowManager) getContext()
  .getApplicationContext().getSystemService("window");
 // 此wmParams变量为获取的全局变量,用以保存悬浮窗口的属性
 private WindowManager.LayoutParams wmParams = ((MyApplication) getContext()
  .getApplicationContext()).getMywmParams();

 public MyFloatView(Context context) {
 super(context);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
 // TODO Auto-generated method stub
 // 获取相对屏幕的坐标,即以屏幕左上角为原点
 x = event.getRawX();
 y = event.getRawY() - 25; // 25是系统状态栏的高度
 Log.i("currP", "currX" + x + "====currY" + y);

 switch (event.getAction()) {
 case MotionEvent.ACTION_DOWN: // 捕获手指触摸按下动作
  // 获取相对View的坐标,即以此View左上角为原点
  mTouchStartX = event.getX();
  mTouchStartY = event.getY();
  Log.i("startP", "startX" + mTouchStartX + "====startY"
   + mTouchStartY);
  break;
 case MotionEvent.ACTION_MOVE://捕获手指触摸移动动作
  updateViewPosition();
  break;
 case MotionEvent.ACTION_UP://捕获手指触摸离开动作
  updateViewPosition();
  mTouchStartX=mTouchStartY=0;
  break;
 default:
  break;
 }
 return true;
 }

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

上面的wmParams变量(即WindowManager.LayoutParams)的存储采用了extends Application的方式来创建全局变量,
示例代码如下:

package com.example.suspend;

import android.app.Application;
import android.view.WindowManager;

public class MyApplication extends Application {
 private WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();

 @Override
 public void onCreate() {
 // TODO Auto-generated method stub
 super.onCreate();
 }

 public WindowManager.LayoutParams getMywmParams() {
 return wmParams;

 }

}

再来看一看Activity中的代码:

package com.example.suspend;

import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.Gravity;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;

public class MainActivity extends Activity {
 private WindowManager wm;
 private WindowManager.LayoutParams wmParams;
 private MyFloatView myFV;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 // 创建悬浮窗口
 createFloatView();
 }

 private void createFloatView() {
 myFV = new MyFloatView(getApplicationContext());
 myFV.setImageResource(R.drawable.ic_launcher);
 // 获取WindowManager
 wm = (WindowManager) getApplicationContext().getSystemService("window");
 // 设置LayoutParams(全局变量)相关参数
 wmParams = ((MyApplication) getApplication()).getMywmParams();

 wmParams.type = LayoutParams.TYPE_PHONE;// 设置window type
 wmParams.format = PixelFormat.RGBA_8888;// 设置图片格式,效果为背景透明
 // 设置Window flag
 wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
  | LayoutParams.FLAG_NOT_FOCUSABLE;
 /*
  *
  * 下面的flags属性的效果形同“锁定”。
  *
  * 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
  *
  * wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
  *
  * | LayoutParams.FLAG_NOT_FOCUSABLE
  *
  * | LayoutParams.FLAG_NOT_TOUCHABLE;
  */
 wmParams.gravity = Gravity.LEFT | Gravity.TOP;// 调整悬浮窗口至左上角,便于调整坐标
 // 以屏幕左上角为原点,设置x、y初始值
 wmParams.x = 0;
 wmParams.y = 0;
 // 设置悬浮窗口长宽数据
 wmParams.width = 40;
 wmParams.height = 40;
 // 显示myFloatView图像
 wm.addView(myFV, wmParams);
 }

 @Override
 protected void onDestroy() {
 // TODO Auto-generated method stub
 super.onDestroy();
 // 在程序退出(Activity销毁)时销毁悬浮窗口
 wm.removeView(myFV);
 }
}

最后,别忘了在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
  <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现类似360,QQ管家那样的悬浮窗

    一.前言: 我手机从来不装这些东西,不过,有次看到同事的android手机上,有个QQ管家在桌面上浮着,同事拖动管家时,管家就变成一只鸟,桌面下方还有个弹弓,桌面顶部有只乌鸦,把管家也就是鸟拖动到弹弓那,然后,松手,鸟就飞出去.这个过程是动画过程,做的事,实际上是清楚内存. 二:原理: 其实,没什么原理,用到的就是WindowManager以及WindowManager.LayoutParams,对这个LayoutParams做文章,当设置为属性后,然后,创建一个View,将这个View添加到W

  • Android实现桌面悬浮窗、蒙板效果实例代码

    现在很多安全类的软件,比如360手机助手,百度手机助手等等,都有一个悬浮窗,可以飘浮在桌面上,方便用户使用一些常用的操作. 今天这篇文章,就是介绍如何实现桌面悬浮窗效果的. 首先,看一下效果图. 悬浮窗一共分为两个部分,一个是平常显示的小窗口,另外一个是点击小窗口显示出来的二级悬浮窗口. 首先,先看一下这个项目的目录结构. 最关键的就是红框内的四个类. 首先,FloatWindowService是一个后台的服务类,主要负责在后台不断的刷新桌面上的小悬浮窗口,否则会导致更换界面之后,悬浮窗口也会随

  • Android快速实现触摸移动的悬浮窗

    本文实例为大家分享了Android实现触摸移动的悬浮窗的具体代码,供大家参考,具体内容如下 1.触摸移动的悬浮窗的快速实现 UI 2. 悬浮窗实现 2.1 悬浮窗权限 为了偷懒,我SDK选择比较低的17,如果不配置权限,则应用会运行报错 正规流程,查询是否有悬浮窗权限,如果没有需要提示,并跳转到悬浮窗设置界面"即是否允许运行在其他应用上面" <uses-sdk android:minSdkVersion="17" android:targetSdkVersio

  • Android中悬浮窗口的实现原理实例分析

    本文实例讲述了Android中悬浮窗口的实现原理.分享给大家供大家参考.具体如下: 用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下: 调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了.比如创建系统顶级窗口,实现悬浮

  • android编程实现悬浮窗体的方法

    本文实例讲述了android编程实现悬浮窗体的方法.分享给大家供大家参考,具体如下: 突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失.效果图如下: 它的使用原理很简单,就是借用了WindowManager这个管理类来实现的. 1.首先在AndroidManifest.xml中添加使用权限: 复制代码 代码如下: <uses-permission android:name="android.permission

  • 不依赖于Activity的Android全局悬浮窗的实现

    前言 当我们在手机上使用360安全卫士时,手机屏幕上时刻都会出现一个小浮动窗口,点击该浮动窗口可跳转到安全卫士的操作界面,而且该浮动窗口不受其他activity的覆盖影响仍然可见(多米音乐也有相关的和主界面交互的悬浮小窗口).那么这种不受Activity界面影响的悬浮窗口是怎么实现的呢? Android悬浮窗实现 实现基础 Android悬浮窗实现使用WindowManager WindowManager介绍 通过Context.getSystemService(Context.WINDOW_S

  • android 添加随意拖动的桌面悬浮窗口

    用过新版本android 360手机助手都人都对 360中只在桌面显示一个小小悬浮窗口羡慕不已吧? 其实实现这种功能,主要有两步: 1.判断当前显示的是为桌面.这个内容我在前面的帖子里面已经有过介绍,如果还没看过的赶快稳步看一下哦. 2.使用windowManager往最顶层添加一个View .这个知识点就是为本文主要讲解的内容哦.在本文的讲解中,我们还会讲到下面的知识点: a.如果获取到状态栏的高度 b.悬浮窗口的拖动 c.悬浮窗口的点击事件 有开始之前,我们先来看一下效果图:  接下来我们来

  • Android 悬浮窗权限各机型各系统适配大全(总结)

    这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时. 悬浮窗适配 悬浮窗适配有两种方法:第一种是按照正规的流程,如果系统没有赋予 APP 弹出悬浮窗的权限,就先跳转到权限授权界面,等用户打开该权限之后,再去弹出悬浮窗,比如 QQ 等一些主流应用就是这么做得:第二种就是利用系统的漏洞,绕过权限的申请,简单粗暴,这种方法我不是特别建议,但是现在貌似有些

  • Android手机悬浮窗口小案例

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 –主页面--– //布局中就一个Button public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

  • android实现桌面移动悬浮窗口

    现在很多应用都有这样的功能,比如360等安全卫士,手机管家之内的应用. 效果图: 一.实现原理及移动思路 调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了.比如创建系统顶级窗口,实现悬浮窗口效果!然后通过覆写悬浮View中onTouchEvent方法来改变windowManana

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

    前言 本文例子实现了点击显示悬浮窗口,同时窗口可播放视频,拖动位置,点击关闭及返回 APP 页面,通过例子来讲述悬浮窗口实现原理及细节处理,效果图如下所示: 悬浮窗口.gif 原理 WindowManager 对 View 视图进行添加.移除.更新处理: WindowManager.LayoutParams 对窗口参数进行一系列设置. 实现 首先,需要添加相对应悬浮窗权限: <uses-permission android:name="android.permission.SYSTEM_A

  • Android实现触摸移动的悬浮窗口功能

    代码比较简单.不会有详细的讲解,这个功能我之前是用来做实时音视频小窗口悬浮的,所以说最外层是FrameLayout,可以根据自己的需求变成图片,或者功能界面,都可以的. 准备工作:AndroidManifest添加权限 <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" /> <uses-permission android:name="android.permis

  • 基于Android实现桌面悬浮清内存app概述

    今天闲来无事写了一个清内存的小东西,类似360,在桌面上悬浮,点击后清除后台无用程序,清除后台程序是通过调用ActivityManger.killBackgroundProcesses的方式来进行的,这样的方式有个不好的地方,就是重要性级别设置的高的应用杀不掉.关键代码如下所示 ActivityManager mActivityManager = MyManager.getActivityManager(mContext); List<ActivityManager.RunningAppProc

  • Android实现系统级悬浮按钮

    本文实例为大家分享了Android系统级悬浮按钮的具体代码,供大家参考,具体内容如下 具体的需求 1.就是做一个系统级的悬浮按钮,就像iPhone 桌面的那个悬浮按钮效果一样,能随意拖动,并且手一放开,悬浮按钮就自动靠边. 2.可以点击并且可以随意拖动. 3.悬浮按钮自动靠边的时候,或者移动到边上的时候,自动隐藏半边. 4.横竖屏切换都兼容 1.就在WindowManager 里面添加View,这个View通过自定义控件来实现. 2.在onTouch里的MotionEvent.ACTION_MO

  • Android利用WindowManager实现悬浮窗

    前言 你会发现QQ视频的时候,就算手机回到主页,视频小模块依旧能悬浮在桌面上.还有当年很火的各种手机杀毒软件的桌面小助手,总能在呆在桌面.这种悬浮窗的操作就需要用到Window. 效果 gif图看着有点儿卡,其实实际上还是很流畅的. Window Window即窗口,是个抽象类,具体实现就是PhoneWindow,对就是那个装着DecorView的PhoneWindow. Window整体分三种类型:应用Window.子Window.系统Window. 应用Window:对应一个Activity

  • 使用electron实现百度网盘悬浮窗口功能的示例代码

    相关依赖 里面使用了vuex vue vue-route storeJs storeJs 用来持久化vuex状态 展示 介绍说明 没有使用electron内置的-webkit-app-region: drag 因为使用他那个有很多问题 比如事件无法使用 右键无法使用 以及不能使用手型等! 安装 安装的时候没有截图 所以就参考下我其他的文章吧 storeJs 安装 npm install storejs 准备写代码 配置路由文件 export default new Router({ routes

随机推荐