安卓java开悬浮窗代码 androidstudio悬浮窗

Android桌面悬浮窗效果怎么实现可以模仿360手机卫士悬浮窗的那份代码的基础上继续开发 。
打开手机卫士主界面 , 然后上拉,然后点击快捷设置,然后点击桌面悬浮窗,就可以将360手机卫士安卓版桌面浮窗调出来了,具体步骤如下:
1、安装最新的360手机卫士 。
2、点开隐私保护,打开右上角的三个点 。
3、点开卫士设置,点开悬浮窗 。
4、开启内存清理悬浮窗 , 选择显示样式,安仔样式或是加速球 。
5、可以选择仅在桌面显示,若开启则悬浮窗只出现在桌面,若关闭则悬浮窗会跟随打开页面一直出现 。
6、可以同时开启拖动清理内存,这样直接拖动悬浮窗图标,就可以轻松清理内存了 。
android 怎么设置 悬浮activityAndroid悬浮窗实现
下面实现来自于android学习手册 , 里面有实现的可运行的例子还有源码 。android学习手册包含9个章节 , 108个例子,源码文档随便看,例子都是可交互 , 可运行 , 源码采用android studio目录结构,高亮显示代码 , 文档都采用文档结构图显示,可以快速定位 。360手机助手中下载,图标上有贝壳
实现基础
Android悬浮窗实现使用WindowManager,WindowManager介绍
通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 WindowManager对象 。
每一个WindowManager对象都和一个特定的 Display绑定 。
想要获取一个不同的display的WindowManager,可以用 createDisplayContext(Display)来获取那个display的 Context,之后再使用:Context.getSystemService(Context.WINDOW_SERVICE)来获取WindowManager 。
使用WindowManager可以在其他应用最上层,甚至手机桌面最上层显示窗口 。
调用的是WindowManager继承自基类的addView方法和removeView方法来显示和隐藏窗口 。具体见后面的实例 。
另:API 17推出了Presentation , 它将自动获取display的Context和WindowManager,可以方便地在另一个display上显示窗口 。
WindowManager实现悬浮窗需要声明权限
首先在manifest中添加如下权限:
!-- 显示顶层浮窗 --uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /
注意:在MIUI上需要在设置中打开本应用的”显示悬浮窗”开关,并且重启应用,否则悬浮窗只能显示在本应用界面内,不能显示在手机桌面上 。
服务获取和基本参数设置
[java] view plain copy print?
// 获取应用的Context
mContext = context.getApplicationContext();
// 获取WindowManager
mWindowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
参数设置:
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
// 类型
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
// WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
// 设置flag
int flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
// 如果设置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE , 弹出的View收不到Back键的事件
params.flags = flags;
// 不设置这个弹出框的透明遮罩显示为黑色
params.format = PixelFormat.TRANSLUCENT;
// FLAG_NOT_TOUCH_MODAL不阻塞事件传递到后面的窗口
// 设置 FLAG_NOT_FOCUSABLE 悬浮窗口较小时,后面的应用图标由不可长按变为可长按
// 不设置这个flag的话,home页的划屏会有问题
params.width = LayoutParams.MATCH_PARENT;
params.height = LayoutParams.MATCH_PARENT;
params.gravity = Gravity.CENTER;
// 获取应用的Context
mContext = context.getApplicationContext();
// 获取WindowManager
mWindowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
//参数设置:
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
// 类型
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
// WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
// 设置flag
int flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
// 如果设置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,弹出的View收不到Back键的事件
params.flags = flags;
// 不设置这个弹出框的透明遮罩显示为黑色
params.format = PixelFormat.TRANSLUCENT;
// FLAG_NOT_TOUCH_MODAL不阻塞事件传递到后面的窗口
// 设置 FLAG_NOT_FOCUSABLE 悬浮窗口较小时,后面的应用图标由不可长按变为可长按
// 不设置这个flag的话,home页的划屏会有问题
params.width = LayoutParams.MATCH_PARENT;
params.height = LayoutParams.MATCH_PARENT;
params.gravity = Gravity.CENTER;
点击和按键事件
除了View中的各个控件的点击事件之外 , 弹窗View的消失控制需要一些处理 。
点击弹窗外部可隐藏弹窗的效果,首先,悬浮窗是全屏的,只不过最外层的是透明或者半透明的:
具体实现
[java] view plain copy print?
package com.robert.floatingwindow;
import android.content.Context;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
/**
* 弹窗辅助类
*
* @ClassName WindowUtils
*
*
*/
public class WindowUtils {
private static final String LOG_TAG = "WindowUtils";
private static View mView = null;
private static WindowManager mWindowManager = null;
private static Context mContext = null;
public static Boolean isShown = false;
/**
* 显示弹出框
*
* @param context
* @param view
*/
public static void showPopupWindow(final Context context) {
if (isShown) {
LogUtil.i(LOG_TAG, "return cause already shown");
return;
}
isShown = true;
LogUtil.i(LOG_TAG, "showPopupWindow");
// 获取应用的Context
mContext = context.getApplicationContext();
// 获取WindowManager
mWindowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
mView = setUpView(context);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
// 类型
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
// WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
// 设置flag
int flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
// 如果设置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE , 弹出的View收不到Back键的事件
params.flags = flags;
// 不设置这个弹出框的透明遮罩显示为黑色
params.format = PixelFormat.TRANSLUCENT;
// FLAG_NOT_TOUCH_MODAL不阻塞事件传递到后面的窗口
// 设置 FLAG_NOT_FOCUSABLE 悬浮窗口较小时,后面的应用图标由不可长按变为可长按
// 不设置这个flag的话,home页的划屏会有问题
params.width = LayoutParams.MATCH_PARENT;
params.height = LayoutParams.MATCH_PARENT;
params.gravity = Gravity.CENTER;
mWindowManager.addView(mView, params);
LogUtil.i(LOG_TAG, "add view");
}
/**
* 隐藏弹出框
*/
public static void hidePopupWindow() {
LogUtil.i(LOG_TAG, "hide "isShown", "mView);
if (isShownnull != mView) {
LogUtil.i(LOG_TAG, "hidePopupWindow");
mWindowManager.removeView(mView);
isShown = false;
}
}
private static View setUpView(final Context context) {
LogUtil.i(LOG_TAG, "setUp view");
View view = LayoutInflater.from(context).inflate(R.layout.popupwindow,
null);
Button positiveBtn = (Button) view.findViewById(R.id.positiveBtn);
positiveBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LogUtil.i(LOG_TAG, "ok on click");
// 打开安装包
// 隐藏弹窗
WindowUtils.hidePopupWindow();
}
});
Button negativeBtn = (Button) view.findViewById(R.id.negativeBtn);
negativeBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LogUtil.i(LOG_TAG, "cancel on click");
WindowUtils.hidePopupWindow();
}
});
// 点击窗口外部区域可消除
// 这点的实现主要将悬浮窗设置为全屏大?。獠阌懈鐾该鞅尘?,中间一部分视为内容区域
// 所以点击内容区域外部视为点击悬浮窗外部
final View popupWindowView = view.findViewById(R.id.popup_window);// 非透明的内容区域
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
LogUtil.i(LOG_TAG, "onTouch");
int x = (int) event.getX();
int y = (int) event.getY();
Rect rect = new Rect();
popupWindowView.getGlobalVisibleRect(rect);
if (!rect.contains(x, y)) {
WindowUtils.hidePopupWindow();
}
LogUtil.i(LOG_TAG, "onTouch : "x", "y", rect: "
rect);
return false;
}
});
// 点击back键可消除
view.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
WindowUtils.hidePopupWindow();
return true;
default:
return false;
}
}
});
return view;
}
}
android java 怎么设置悬浮窗(悬浮窗是一个activity)上组件的属性,和按钮的点击@Override
public void onClick(View v) {
finalEditText et = new EditText(context) ;
new AlertDialog.Builder(context)
.setTitle("说明")
.setMessage("单个页卡内按钮事件测试")
.setView(et)
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "单击确定按钮", Toast.LENGTH_LONG).show() ;
}
}).setNegativeButton("取消",null).show();
}
基于 EasyFloat 实现应用内全局悬浮窗由于项目需求 , 需要实现一个应用内悬浮窗功能,要求是:
经过搜索,我发现了一个第三方库EasyFloat(),功能相当强大 。
EasyFloat支持四种悬浮窗:
那么问题来了,我要实现的功能是应用内的悬浮窗,回到桌面后没必要继续显示悬浮窗 。所以我并不想申请悬浮窗权限 。何况由于不同安卓手机系统的限制,悬浮窗权限没有一个统一的申请方式 , 需要针对不同手机系统做单独适配 , 测试起来也麻烦 。
既然 CURRENT_ACTIVITY 不需要权限,那么有没有办法通过 CURRENT_ACTIVITY来实现应用内全局悬浮窗呢?
思路:
经过测试,这个方案完全可行 。以下是实现步骤:
App.java:
layout_float_window.xml:
实现效果:
期间遇到一个编译错误:
查询资料得知,这是由于EasyFloat是kotlin实现的,而我的工程是java开发的,根据,加上kotlin相关支持即可 。
效果图:
App.java:
Utils.java:
最终实现效果:
完整源码地址:
【安卓java开悬浮窗代码 androidstudio悬浮窗】安卓java开悬浮窗代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于androidstudio悬浮窗、安卓java开悬浮窗代码的信息别忘了在本站进行查找喔 。

    推荐阅读