广告
返回顶部
首页 > 资讯 > 精选 >Kotlin如何实现Android系统悬浮窗
  • 915
分享到

Kotlin如何实现Android系统悬浮窗

2023-06-22 02:06:36 915人浏览 八月长安
摘要

本篇内容介绍了“Kotlin如何实现Android系统悬浮窗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Android 弹窗浅谈我们知道

本篇内容介绍了“Kotlin如何实现Android系统悬浮窗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    Android 弹窗浅谈

    我们知道 Android 弹窗中,有一类弹窗会在应用之外也显示,这是因为他被申明成了系统弹窗,除此之外还有2类弹窗分别是:子弹窗应用弹窗

    应用弹窗:就是我们常规使用的 Dialog 之类弹窗,依赖于应用的 Activity;子弹窗:依赖于父窗口,比如 PopupWindow;系统弹窗:比如状态栏、Toast等,本文所讲的系统悬浮窗就是系统弹窗。

    系统悬浮窗具体实现

    权限申请

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

    代码设计

    下面的包结构截图,简单展示了实现系统悬浮窗的代码结构,更复杂的业务需要可在此基础上进行扩展。

    Kotlin如何实现Android系统悬浮窗

    Floatwindowservice:系统悬浮窗在此 Service 中弹出;

    FloatWindowManager:系统悬浮窗管理类;

    FloatLayout:系统悬浮窗布局;

    HomeKeyObserverReceiver:

    监听 Home 键;

    FloatWindowUtils:系统悬浮窗工具类。

    具体实现

    FloatWindowService 类
    class FloatWindowService : Service() {     private val TAG = FloatWindowService::class.java.simpleName    private var mFloatWindowManager: FloatWindowManager? = null    private var mHomeKeyObserverReceiver: HomeKeyObserverReceiver? = null     override fun onCreate() {        TLogUtils.i(TAG, "onCreate: ")        mFloatWindowManager = FloatWindowManager(applicationContext)        mHomeKeyObserverReceiver = HomeKeyObserverReceiver()         reGISterReceiver(mHomeKeyObserverReceiver, IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))        mFloatWindowManager!!.createWindow()    }     override fun onBind(intent: Intent?): IBinder? {        return null    }     override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {        return START_NOT_STICKY    }     override fun onDestroy() {        TLogUtils.i(TAG, "onDestroy: ")        mFloatWindowManager?.removeWindow()        if (mHomeKeyObserverReceiver != null) {            unregisterReceiver(mHomeKeyObserverReceiver)        }    } }
    FloatWindowManager 类

    包括系统悬浮窗的创建、显示、销毁(以及更新)。

     public void addView(View view, ViewGroup.LayoutParams params); // 添加 View 到 Windowpublic void updateViewLayout(View view, ViewGroup.LayoutParams params); //更新 View 在 Window 中的位置public void removeView(View view); //删除 View
    FloatWindowManager 类代码
    class FloatWindowManager constructor(context: Context) {     var isshowing = false    private val TAG = FloatWindowManager::class.java.simpleName    private var mContext: Context = context    private var mFloatLayout = FloatLayout(mContext)    private var mLayoutParams: WindowManager.LayoutParams? = null    private var mWindowManager: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager     fun createWindow() {        TLogUtils.i(TAG, "createWindow: start...")        // 对象配置操作使用apply,额外的处理使用also        mLayoutParams = WindowManager.LayoutParams().apply {            type = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {                // Android 8.0以后需要使用TYPE_APPLICATION_OVERLAY,不允许使用以下窗口类型来在其他应用和窗口上方显示提醒窗口:TYPE_PHONE、TYPE_PRIORITY_PHONE、TYPE_SYSTEM_ALERT、TYPE_SYSTEM_OVERLAY、TYPE_SYSTEM_ERROR。                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY            } else {                // 在Android 8.0之前,悬浮窗口设置可以为TYPE_PHONE,这种类型是用于提供用户交互操作的非应用窗口。                // 在api Level  = 23的时候,需要在Android Manifest.xml文件中声明权限SYSTEM_ALERT_WINDOW才能在其他应用上绘制控件                WindowManager.LayoutParams.TYPE_PHONE            }            // 设置图片格式,效果为背景透明            fORMat = PixelFormat.RGBA_8888            // 设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)            flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE            // 调整悬浮窗显示的停靠位置为右侧置顶            gravity = Gravity.TOP or Gravity.END            width = 800            height = 200            x = 20            y = 40        }         mWindowManager.addView(mFloatLayout, mLayoutParams)        TLogUtils.i(TAG, "createWindow: end...")        isShowing = true    }     fun showWindow() {        TLogUtils.i(TAG, "showWindow: isShowing = $isShowing")        if (!isShowing) {            if (mLayoutParams == null) {                createWindow()            } else {                mWindowManager.addView(mFloatLayout, mLayoutParams)                isShowing = true            }        }    }     fun removeWindow() {        TLogUtils.i(TAG, "removeWindow: isShowing = $isShowing")        mWindowManager.removeView(mFloatLayout)        isShowing = false    } }
    FloatLayout 类及其 Layout

    系统悬浮窗自定义View:FloatLayout

    class FloatLayout @JVMOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0) :    ConstraintLayout(context, attrs, defStyleAttr, defStyleRes) {     private var mTime: TCLTextView    private var mDistance: TCLTextView    private var mSpeed: TCLTextView    private var mCalories: TCLTextView     init {        val view = LayoutInflater.from(context).inflate(R.layout.do_exercise_view_float_layout, this, true)        mTime = view.findViewById(R.id.float_layout_tv_time)        mDistance = view.findViewById(R.id.float_layout_tv_distance)        mSpeed = view.findViewById(R.id.float_layout_tv_speed)        mCalories = view.findViewById(R.id.float_layout_tv_calories)    } }

    布局文件:float_layout_tv_time

    HomeKeyObserverReceiver 类
    class HomeKeyObserverReceiver : BroadcastReceiver() {     override fun onReceive(context: Context?, intent: Intent?) {        try {            val action = intent!!.action            val reason = intent.getStringExtra("reason")            TLogUtils.d(TAG, "HomeKeyObserverReceiver: action = $action,reason = $reason")            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS == action && "homekey" == reason) {                val keyCode = intent.getIntExtra("keycode", KeyEvent.KEYCODE_UNKNOWN)                TLogUtils.d(TAG, "keyCode = $keyCode")                context?.stopService(Intent(context, FloatWindowService::class.java))            }        } catch (ex: Exception) {            ex.printStackTrace()        }    }     compaNIOn object {        private val TAG = HomeKeyObserverReceiver::class.java.simpleName    } }
    FloatWindowUtils 类
    object FloatWindowUtils {     const val REQUEST_FLOAT_CODE = 1000    private val TAG = FloatWindowUtils::class.java.simpleName         fun isServiceRunning(context: Context, ServiceName: String): Boolean {        if (TextUtils.isEmpty(ServiceName)) {            return false        }        val myManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager        val runningService = myManager.getRunningServices(1000) as ArrayList<ActivityManager.RunningServiceInfo>        runningService.forEach {            if (it.service.className == ServiceName) {                return true            }        }        return false    }         @SuppressLint("NewApi")    fun checkSuspendedWindowPermission(context: Activity, block: () -> Unit) {        if (commonROMPermissionCheck(context)) {            block()        } else {            Toast.makeText(context, "请开启悬浮窗权限", Toast.LENGTH_SHORT).show()            context.startActivityForResult(Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION).apply {                data = Uri.parse("package:${context.packageName}")            }, REQUEST_FLOAT_CODE)        }    }         fun commonROMPermissionCheck(context: Context?): Boolean {        var result = true        if (Build.VERSION.SDK_INT >= 23) {            try {                val clazz: Class<*> = Settings::class.java                val canDrawOverlays = clazz.getDeclaredMethod("canDrawOverlays", Context::class.java)                result = canDrawOverlays.invoke(null, context) as Boolean            } catch (e: Exception) {                TLogUtils.e(TAG, e)            }        }        return result    } }

    “Kotlin如何实现Android系统悬浮窗”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: Kotlin如何实现Android系统悬浮窗

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

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

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

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

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

    • 微信公众号

    • 商务合作