iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >详解android6.0版本下悬浮窗实现
  • 454
分享到

详解android6.0版本下悬浮窗实现

版本Android 2022-06-06 01:06:11 454人浏览 八月长安
摘要

悬浮窗在安卓中实现起来还是比较容易的,这几天在网上温习了相关资料,运行在我安卓6.0手机上才发现,原来在6.0手机上不是行的。 第一反应肯定是权限相关问题,做了相关处理后,果

悬浮窗在安卓中实现起来还是比较容易的,这几天在网上温习了相关资料,运行在我安卓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();
        }
      }
    });
  }
  
  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();
  }
  
  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实现桌面悬浮窗、蒙板效果实例代码不依赖于Activity的Android全局悬浮窗的实现Android实现类似360,QQ管家那样的悬浮窗Android 悬浮窗权限各机型各系统适配大全(总结)android编程实现悬浮窗体的方法Android应用内悬浮窗的实现方案示例Android悬浮窗屏蔽悬浮窗外部所有的点击事件的实例代码Android中悬浮窗口的实现原理实例分析android实现可自由移动、监听点击事件的悬浮窗


--结束END--

本文标题: 详解android6.0版本下悬浮窗实现

本文链接: https://www.lsjlt.com/news/22002.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • android6.0版本中怎么实现一个悬浮窗口
    这篇文章将为大家详细讲解有关android6.0版本中怎么实现一个悬浮窗口,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。代码如下:public class MainAct...
    99+
    2023-05-31
    android roi 悬浮窗口
  • Kotlin实现Android系统悬浮窗详解
    目录Android 弹窗浅谈系统悬浮窗具体实现权限申请代码设计具体实现FloatWindowService 类FloatWindowManager 类FloatWindowManag...
    99+
    2024-04-02
  • C#实现悬浮窗口的方法详解
    目录一 悬浮窗口二 创建悬浮窗口1 实现细节2 细节三 圆形背景一 悬浮窗口 特点: ① 窗口一般较小,有时为不规则背景; ② 置顶显示; ③ 窗口支持拖动; ④ 一般用于程序状态显...
    99+
    2022-12-21
    C#悬浮窗口 C# 窗口
  • Android悬浮窗如何实现
    小编给大家分享一下Android悬浮窗如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果如下:显示浮窗原生ViewManager接口提供了向窗口添加并操纵...
    99+
    2023-06-04
  • Android实现悬浮窗效果
    本文实例为大家分享了Android实现悬浮窗效果的具体代码,供大家参考,具体内容如下 一、权限: <uses-permission android:name="android....
    99+
    2024-04-02
  • js如何实现悬浮窗效果
    小编给大家分享一下js如何实现悬浮窗效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果图:代码如下:<!DOCTYPE...
    99+
    2024-04-02
  • Android悬浮窗效果怎么实现
    要实现Android的悬浮窗效果,可以采用以下几种方法: 使用系统提供的WindowManager类来创建一个悬浮窗口。可以通过...
    99+
    2023-10-22
    Android
  • Android实现圆形菜单悬浮窗
    序言 Android悬浮窗的实现,主要有四个步骤: 1. 声明及申请权限2. 构建悬浮窗需要的控件3. 将控件添加到WindowManager4. 必要时更新WindowManage...
    99+
    2024-04-02
  • Android WindowManger实现桌面悬浮窗功能
    目录效果图使用WindowManager实现分析问题参考如果想实现一个在桌面显示的悬浮窗,用Dialog、PopupWindow、Toast等已经不能实现了,他们基本都是在Activ...
    99+
    2023-05-18
    Android桌面悬浮窗 Android WindowManger悬浮窗
  • Android可拖动悬浮窗怎么实现
    要实现在Android中可拖动的悬浮窗,可以按照以下步骤进行:1. 创建一个自定义的`FloatingView`类来实现悬浮窗的视图...
    99+
    2023-08-16
    Android
  • Kotlin如何实现Android系统悬浮窗
    本篇内容介绍了“Kotlin如何实现Android系统悬浮窗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Android 弹窗浅谈我们知道 ...
    99+
    2023-06-22
  • Android实现悬浮窗的简单方法实例
    目录1. 前言2.原理3.具体实现3.1浮窗布局3.2 悬浮窗的实现1. 使用服务Service2. 获取WindowManager并设置LayoutParams3. 创建View并...
    99+
    2024-04-02
  • Android应用内悬浮窗Activity如何实现
    这篇文章主要介绍Android应用内悬浮窗Activity如何实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!缩放方法缩放activity需要使用WindowManager.LayoutParams,控制windo...
    99+
    2023-06-22
  • Android仿腾讯视频实现悬浮窗效果
    前言 相信大家对Android悬浮窗应该是很熟悉了,比如说腾讯视频、爱奇艺等APP都有悬浮窗功能。在你打游戏的同时还可以看视频,充分利用屏幕空间。还有微信,360手机卫士等APP也有...
    99+
    2024-04-02
  • Android无障碍全局悬浮窗实现示例
    目录无障碍添加 UI配置分析TypeFlagLayoutInDisplayCutoutModeAndroid 无障碍的全局悬浮窗可以在屏幕上添加 UI 供用户进行快捷操作,可以展示在...
    99+
    2024-04-02
  • Android应用内悬浮窗Activity的简单实现
    目录前言缩放方法悬浮样式点击穿透空白移动悬浮窗例子的完整代码styles.xmllayoutactivity运行效果小结前言 悬浮窗是一种比较常见的需求。例如把视频通话界面缩小成一个...
    99+
    2024-04-02
  • Android应用内悬浮窗的实现方案示例
    1、悬浮窗的基本介绍悬浮窗,大家应该也不陌生,凌驾于应用之上的一个小弹窗,实现上很简单,就是添加一个系统级别的窗口,Android中通过WindowManagerService( WMS)来管理所有的窗口,对于WMS来说,管你是Activi...
    99+
    2023-05-30
    android
  • Android 项目必备(四十四)-->Android 实现悬浮窗
    前言 悬浮窗是一种比较常见的需求。例如把视频通话界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情。 本文将讲解悬浮窗实现步骤、原理、实例代码等 实现原理 1. WindowMananger 接口 Android 的界面绘制,都是通过 ...
    99+
    2023-08-16
    android java 开发语言
  • Vue悬浮窗和聚焦登录组件功能实现
    目录前言1 悬浮窗1.1 使用display1.2 使用visibility(☆)2 全屏只能点击登录组件原理代码前言 ​ 本文整理了实现悬浮窗以及聚焦登录组件的功能。 ​ 为的是方...
    99+
    2022-11-13
    vue悬浮窗 vue聚焦登录组件
  • JS如何实现百度地图搜索悬浮窗功能
    这篇文章将为大家详细讲解有关JS如何实现百度地图搜索悬浮窗功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。这个需求的效果类似下面的截图,主要还是利用百度地图中自定义控件...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作