悬浮窗在安卓中实现起来还是比较容易的,这几天在网上温习了相关资料,运行在我安卓6.0手机上才发现,原来在6.0手机上不是行的。

第一反应肯定是权限相关问题,做了相关处理后,果然让悬浮窗原形毕露了。直接贴代码。
public class MainActivity extends AppCompatActivity {
private static final int ALERT_WINDOW_PERMISSION_CODE = 100;
private Button start_float;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start_float = (Button) findViewById(R.id.start_float);
this.start_float.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (Build.VERSION.SDK_INT > 22) {
sdk23Permission();
} else {
startService(new Intent(MainActivity.this, FloatService.class));
finish();
}
}
});
}
/**
* @description 安卓6.0下权限处理
* @author ldm
* @time 2017/3/20 15:00
*/
public void sdk23Permission() {
if (!Settings.canDrawOverlays(this)) {
Toast.makeText(MainActivity.this, "当前无权限使用悬浮窗,请授权!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, ALERT_WINDOW_PERMISSION_CODE);
} else {
startService(new Intent(MainActivity.this, FloatService.class));
finish();
}
}
/**
* 用户返回
*/
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ALERT_WINDOW_PERMISSION_CODE) {
if (!Settings.canDrawOverlays(this)) {
Toast.makeText(MainActivity.this, "权限授予失败,无法开启悬浮窗", Toast.LENGTH_SHORT).show();
} else {
startService(new Intent(MainActivity.this, FloatService.class));
finish();
}
}
}
}
对应Service:
public class FloatService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
FloatViewUtils.getInstance(this).addFloatView();
super.onCreate();
}
}
简单地FloatView:
public class FloatView extends View {
public static final int WIDTH = 150;
public static final int HEIGHT = 150;
private Paint circlePaint;
private Paint textPaint;
private static final String text = "50%";
public FloatView(Context context) {
this(context, null, 0);
}
public FloatView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public FloatView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaints();
}
/**
* @description 初始化相关画笔Paint
* @author ldm
* @time 2017/3/20
*/
private void initPaints() {
circlePaint = new Paint();
circlePaint.setAntiAlias(true);
circlePaint.setColor(Color.GRAY);
textPaint = new Paint();
//设置抗锯齿
textPaint.setAntiAlias(true);
//设置字体大小
textPaint.setTextSize(30);
//设置颜色
textPaint.setColor(Color.WHITE);
//设置(仿)粗体
textPaint.setFakeBoldText(true);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(WIDTH, HEIGHT);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(WIDTH / 2, HEIGHT / 2, WIDTH / 2, circlePaint);
float textWidth = textPaint.measureText(text);
float x = WIDTH / 2 - textWidth / 2;
Paint.FontMetrics fms = textPaint.getFontMetrics();
float dy = -(fms.descent + fms.ascent) / 2;
float y = HEIGHT / 2 + dy;
canvas.drawText(text, x, y, textPaint);
}
}
以及FloatView管理工具类:
public class FloatViewUtils {
private static FloatViewUtils instance;
private Context mContext;
private WindowManager manager;
private FloatView floatView;
private FloatViewUtils(Context mContext) {
this.mContext = mContext;
manager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
floatView = new FloatView(mContext);
}
public static FloatViewUtils getInstance(Context mContext) {
if (null == instance) {
synchronized (FloatViewUtils.class) {
if (null == instance) {
instance = new FloatViewUtils(mContext);
}
}
}
return instance;
}
public void addFloatView() {
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
//悬浮窗口大小
lp.width = floatView.WIDTH;
lp.height = floatView.HEIGHT;
// 调整悬浮窗口位置
lp.gravity = Gravity.LEFT | Gravity.CENTER;
// 以屏幕左上角为原点,设置x、y初始值
// lp.x = 0;
// lp.y = 0;
//设置悬浮窗口类型
lp.type = WindowManager.LayoutParams.TYPE_PHONE;
//设置悬浮窗口不接受焦点及触摸事件
lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
//设置图片格式,效果为背景透明
lp.format = PixelFormat.RGBA_8888;
manager.addView(floatView, lp);
}
}
最后不要忘记在AndroidManifest.xml中添加权限(当然还有注册Service):
复制代码 代码如下:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# android
# 悬浮窗实现
# android实现悬浮窗口
# 安卓6.0悬浮窗
# android 添加随意拖动的桌面悬浮窗口
# Android实现桌面悬浮窗、蒙板效果实例代码
# 不依赖于Activity的Android全局悬浮窗的实现
# Android实现类似360
# QQ管家那样的悬浮窗
# Android 悬浮窗权限各机型各系统适配大全(总结)
# android编程实现悬浮窗体的方法
# Android应用内悬浮窗的实现方案示例
# Android悬浮窗屏蔽悬浮窗外部所有的点击事件的实例代码
# Android中悬浮窗口的实现原理实例分析
# android实现可自由移动、监听点击事件的悬浮窗
# 机上
# 在我
# 原形毕露
# 才发现
# 这几天
# 相关资料
# 不接受
# 比较容易
# 大家多多
# 不要忘记
# 粗体
# 在网上
# 抗锯齿
# author
# ldm
# description
# time
# sdk23Permission
# SDK_INT
# gt
相关文章:
如何自定义建站之星网站的导航菜单样式?
如何实现建站之星域名转发设置?
制作网页的网站有哪些,电脑上怎么做网页?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
建站主机是否等同于虚拟主机?
PHP正则匹配日期和时间(时间戳转换)的实例代码
实例解析Array和String方法
已有域名建站全流程解析:网站搭建步骤与建站工具选择
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
如何在腾讯云服务器快速搭建个人网站?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
如何用PHP快速搭建CMS系统?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
建站之星安装需要哪些步骤及注意事项?
如何在阿里云虚拟服务器快速搭建网站?
建站主机空间推荐 高性价比配置与快速部署方案解析
建站主机类型有哪些?如何正确选型
如何在Windows服务器上快速搭建网站?
想学网站制作怎么学,建立一个网站要花费多少?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
武清网站制作公司,天津武清个人营业执照注销查询系统网站?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
如何在Tomcat中配置并部署网站项目?
宝塔建站无法访问?如何排查配置与端口问题?
建站之星后台密码如何安全设置与找回?
长沙做网站要多少钱,长沙国安网络怎么样?
如何通过VPS建站实现广告与增值服务盈利?
h5在线制作网站电脑版下载,h5网页制作软件?
建站主机选哪家性价比最高?
建站三合一如何选?哪家性价比更高?
高防服务器租用指南:配置选择与快速部署攻略
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
建站之星如何保障用户数据免受黑客入侵?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
建站ABC备案流程中有哪些关键注意事项?
建站之星如何一键生成手机站?
Python文件管理规范_工程实践说明【指导】
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
如何在万网ECS上快速搭建专属网站?
江苏网站制作公司有哪些,江苏书法考级官方网站?
C#怎么使用委托和事件 C# delegate与event编程方法
建站主机选购指南:核心配置与性价比推荐解析
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
常州企业建站如何选择最佳模板?
深入理解Android中的xmlns:tools属性
智能起名网站制作软件有哪些,制作logo的软件?
高防服务器如何保障网站安全无虞?
建站之星微信建站一键生成小程序+多端营销系统
*请认真填写需求信息,我们会在24小时内与您取得联系。