返回顶部
首页 > 资讯 > 精选 >Android 项目必备(四十四)-->Android 实现悬浮窗
  • 884
分享到

Android 项目必备(四十四)-->Android 实现悬浮窗

androidjava开发语言 2023-08-16 21:08:51 884人浏览 八月长安
摘要

前言 悬浮窗是一种比较常见的需求。例如把视频通话界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情。 本文将讲解悬浮窗实现步骤、原理、实例代码等 实现原理 1. WindowMananger 接口 Android 的界面绘制,都是通过

前言

悬浮窗是一种比较常见的需求。例如把视频通话界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情。

本文将讲解悬浮窗实现步骤、原理、实例代码等

实现原理

1. WindowMananger 接口

Android 的界面绘制,都是通过 WindowMananger 的服务来实现的。那么,既然要实现一个能够在自身应用以外的界面上的悬浮窗,我们就要利用 WindowManager 来实现。

(frameworks/base/core/java/android/view/WindowMananger.java)@SystemService(Context.WINDOW_SERVICE)public interface WindowManager extends ViewManager {...}

WindowManager 实现了 ViewManager 接口,可以通过获取 WINDOW_SERVICE 系统服务得到。而ViewManager 接口有 addView 方法,我们就是通过这个方法将悬浮窗控件加入到屏幕中去。

2. LayoutParam 设置

这里需要着重说明的是 LayoutParam 里的 type 变量。这个变量是用来指定窗口类型的。

if (Build.VERSION.SDK_INT >= Build.VERSioN_CODES.O) {layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;} else {    layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;}

具体实现

实现一个自动轮播图的悬浮窗。

1. 效果图

在这里插入图片描述

2. 声明及申请权限

@Requiresapi(api = Build.VERSION_CODES.M)public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (requestCode == 1) {            if (!Settings.canDrawOverlays(this)) {                Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();            } else {                Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();                startService(new Intent(MainActivity.this, FloatingImageDisplayService.class));            }        }     }        public void startFloatingImageDisplayService(View view) {        if (FloatingImageDisplayService.isStarted) {            return;        }        if (!Settings.canDrawOverlays(this)) {            Toast.makeText(this, "当前无权限,请授权", Toast.LENGTH_SHORT);            startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), 1);        } else {            startService(new Intent(MainActivity.this, FloatingImageDisplayService.class));        }    }}

3. 构建悬浮窗需要的控件

image_display.xml

    

4. 将控件添加到WindowManager

@RequiresApi(api = Build.VERSION_CODES.M)public class FloatingImageDisplayService extends Service {    public static boolean isStarted = false;    private WindowManager windowManager;    private WindowManager.LayoutParams layoutParams;    private View displayView;    private int[] images;    private int imageIndex = 0;    private Handler changeImageHandler;    @Override    public void onCreate() {        super.onCreate();        isStarted = true;        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);        layoutParams = new WindowManager.LayoutParams();        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {            layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;        } else {            layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;        }        layoutParams.fORMat = PixelFormat.RGBA_8888;        layoutParams.gravity = Gravity.LEFT | Gravity.TOP;        layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;        layoutParams.width = 500;        layoutParams.height = 500;        layoutParams.x = 300;        layoutParams.y = 300;        images = new int[] {                R.mipmap.image_01,                R.mipmap.image_02,                R.mipmap.image_03,                R.mipmap.image_04,                R.mipmap.image_05        };        changeImageHandler = new Handler(this.getMainLooper(), changeImageCallback);    }    @Override    public IBinder onBind(Intent intent) {        return null;    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        showFloatingWindow();        return super.onStartCommand(intent, flags, startId);    }    private void showFloatingWindow() {        if (Settings.canDrawOverlays(this)) {            LayoutInflater layoutInflater = LayoutInflater.from(this);            displayView = layoutInflater.inflate(R.layout.image_display, null);            displayView.setOnTouchListener(new FloatinGonTouchListener());            ImageView imageView = displayView.findViewById(R.id.image_display_imageview);            imageView.setImageResource(images[imageIndex]);            windowManager.addView(displayView, layoutParams);            changeImageHandler.sendEmptyMessageDelayed(0, 2000);        }    }    private Handler.Callback changeImageCallback = new Handler.Callback() {        @Override        public boolean handleMessage(Message msg) {            if (msg.what == 0) {                imageIndex++;                if (imageIndex >= 5) {                    imageIndex = 0;                }                if (displayView != null) {                    ((ImageView) displayView.findViewById(R.id.image_display_imageview)).setImageResource(images[imageIndex]);                }                changeImageHandler.sendEmptyMessageDelayed(0, 2000);            }            return false;        }    };    private class FloatingOnTouchListener implements View.OnTouchListener {        private int x;        private int y;        @Override        public boolean onTouch(View view, MotionEvent event) {            switch (event.getAction()) {                case MotionEvent.ACTION_DOWN:                    x = (int) event.getRawX();                    y = (int) event.getRawY();                    break;                case MotionEvent.ACTION_MOVE:                    int nowX = (int) event.getRawX();                    int nowY = (int) event.getRawY();                    int movedX = nowX - x;                    int movedY = nowY - y;                    x = nowX;                    y = nowY;                    layoutParams.x = layoutParams.x + movedX;                    layoutParams.y = layoutParams.y + movedY;                    windowManager.updateViewLayout(view, layoutParams);                    break;                default:                    break;            }            return false;        }    }}

来源地址:https://blog.csdn.net/duoduo_11011/article/details/130031272

--结束END--

本文标题: Android 项目必备(四十四)-->Android 实现悬浮窗

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

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

猜你喜欢
  • Android 项目必备(四十四)-->Android 实现悬浮窗
    前言 悬浮窗是一种比较常见的需求。例如把视频通话界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情。 本文将讲解悬浮窗实现步骤、原理、实例代码等 实现原理 1. WindowMananger 接口 Android 的界面绘制,都是通过 ...
    99+
    2023-08-16
    android java 开发语言
  • Android实现悬浮窗效果
    本文实例为大家分享了Android实现悬浮窗效果的具体代码,供大家参考,具体内容如下 一、权限: <uses-permission android:name="android....
    99+
    2024-04-02
  • Android悬浮窗如何实现
    小编给大家分享一下Android悬浮窗如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果如下:显示浮窗原生ViewManager接口提供了向窗口添加并操纵...
    99+
    2023-06-04
  • Android悬浮窗效果怎么实现
    要实现Android的悬浮窗效果,可以采用以下几种方法: 使用系统提供的WindowManager类来创建一个悬浮窗口。可以通过...
    99+
    2023-10-22
    Android
  • Android实现圆形菜单悬浮窗
    序言 Android悬浮窗的实现,主要有四个步骤: 1. 声明及申请权限2. 构建悬浮窗需要的控件3. 将控件添加到WindowManager4. 必要时更新WindowManage...
    99+
    2024-04-02
  • Android项目中项目实现一个控件悬浮效果
    今天就跟大家聊聊有关Android项目中项目实现一个控件悬浮效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。效果图:新建一个Android项目,取名MeiTuanDemo,先看立即...
    99+
    2023-05-31
    android roi 目中
  • Kotlin如何实现Android系统悬浮窗
    本篇内容介绍了“Kotlin如何实现Android系统悬浮窗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Android 弹窗浅谈我们知道 ...
    99+
    2023-06-22
  • Android WindowManger实现桌面悬浮窗功能
    目录效果图使用WindowManager实现分析问题参考如果想实现一个在桌面显示的悬浮窗,用Dialog、PopupWindow、Toast等已经不能实现了,他们基本都是在Activ...
    99+
    2023-05-18
    Android桌面悬浮窗 Android WindowManger悬浮窗
  • Kotlin实现Android系统悬浮窗详解
    目录Android 弹窗浅谈系统悬浮窗具体实现权限申请代码设计具体实现FloatWindowService 类FloatWindowManager 类FloatWindowManag...
    99+
    2024-04-02
  • Android可拖动悬浮窗怎么实现
    要实现在Android中可拖动的悬浮窗,可以按照以下步骤进行:1. 创建一个自定义的`FloatingView`类来实现悬浮窗的视图...
    99+
    2023-08-16
    Android
  • android编程实现悬浮窗体的方法
    本文实例讲述了android编程实现悬浮窗体的方法。分享给大家供大家参考,具体如下: 突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,...
    99+
    2022-06-06
    方法 窗体 Android
  • Android应用内悬浮窗Activity如何实现
    这篇文章主要介绍Android应用内悬浮窗Activity如何实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!缩放方法缩放activity需要使用WindowManager.LayoutParams,控制windo...
    99+
    2023-06-22
  • Android实现悬浮窗的简单方法实例
    目录1. 前言2.原理3.具体实现3.1浮窗布局3.2 悬浮窗的实现1. 使用服务Service2. 获取WindowManager并设置LayoutParams3. 创建View并...
    99+
    2024-04-02
  • Android项目实战之ListView悬浮头部展现效果实现
    目录实现效果:我们先分析要解决的问题:解决:代码实现:总结实现效果: 先看下效果:需求是 滑动列表 ,其中一部分视图(粉丝数,关注数这一部分)在滑动到顶端的时候不消失,而是停留在整个...
    99+
    2024-04-02
  • Android实现带磁性的悬浮窗体效果
    本文实例讲述了Android实现带磁性的悬浮窗体效果。分享给大家供大家参考,具体如下: 带磁性的悬浮窗体,类似于360绿色小人 主要实现的是: 1.悬浮所有窗体之上 2.有吸引...
    99+
    2022-06-06
    窗体 Android
  • 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视频悬浮窗口实现的示例代码
    前言 本文例子实现了点击显示悬浮窗口,同时窗口可播放视频,拖动位置,点击关闭及返回 APP 页面,通过例子来讲述悬浮窗口实现原理及细节处理,效果图如下所示: 悬浮窗口.gif...
    99+
    2022-06-06
    悬浮窗口 示例 Android
  • Android应用内悬浮窗的实现方案示例
    1、悬浮窗的基本介绍悬浮窗,大家应该也不陌生,凌驾于应用之上的一个小弹窗,实现上很简单,就是添加一个系统级别的窗口,Android中通过WindowManagerService( WMS)来管理所有的窗口,对于WMS来说,管你是Activi...
    99+
    2023-05-30
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作