目录

一、目标

二、代码实现

1、获取activity的根布局

(1)activity的根布局是FrameLayout,其id为content

(2)在main_activity.xml中简单写下布局,预期在白绿交界处上层添加一个自定义view

2、自定义布局控件,将其添加至根布局中, 通过唯一标识添加view

1、创建一个名为layout_simple_floating.xml文件,在其中简单添加一个imageview

2、通LayoutInflater.from(context).inflate(int layout, ViewGroup root)方法动态加载布局,并为其添加LayoutParams参数;通过addView(Viiew view)的方式将自定义布局添加到根布局中去

3、添加控制其显示隐藏的方法

3、对自定义布局添加滑动效果

1、重写OnTouchListener:拖动过程为手指按下(ACTION_DOWN) --> 拖动(ACTION_MOBE) --> 手指拿开(ACTION_UP)

2、在之前build的代码中增加touchlistener的语句,回调弹出一个toast

三、效果展示


一、目标

基于当前activity创建浮窗,生命周期与activity绑定,跳转至下一个activity将被遮盖

创建activity浮窗

二、代码实现

1、获取activity的根布局

(1)activity的根布局是FrameLayout,其id为content

FrameLayout rootLayout = getWindow().getDecorView().findViewById(android.R.id.content);

(2)在main_activity.xml中简单写下布局,预期在白绿交界处上层添加一个自定义view

2、自定义布局控件,将其添加至根布局中, 通过唯一标识添加view

1、创建一个名为layout_simple_floating.xml文件,在其中简单添加一个imageview

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/ivFloatingImg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/floating_img" />
</LinearLayout>

2、通LayoutInflater.from(context).inflate(int layout, ViewGroup root)方法动态加载布局,并为其添加LayoutParams参数;通过addView(Viiew view)的方式将自定义布局添加到根布局中去

/*** 分三步走* [1]先判断当前是否已经创建了tag对应的view,如果tag为空或创建了view不做处理* [2]获取activity根布局* [3]自定义控件布局,将其添加至根布局中** @param tag 标识view*/private void buildSimpleFloatingWindow(String tag) {if (TextUtils.isEmpty(tag) || floatingMap == null || floatingMap.containsKey(tag)) {Log.v(TAG, "tag为空或view已创建");return;}FrameLayout rootLayout = getWindow().getDecorView().findViewById(android.R.id.content);View view = LayoutInflater.from(this).inflate(R.layout.layout_simple_floating, null);if (rootLayout == null || view == null) {Log.v(TAG, "根布局或自定义布局为空,无法创建");return;}LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);params.gravity = Gravity.LEFT + Gravity.TOP;params.topMargin = 1000;params.leftMargin = 380;view.setLayoutParams(params);rootLayout.addView(view);floatingMap.put(tag, view);}

3、添加控制其显示隐藏的方法

private void showFloatingView(String tag) {if (TextUtils.isEmpty(tag) || floatingMap == null || !floatingMap.containsKey(tag)) {Log.v(TAG, "tag为空或view未创建,无法显示");return;}floatingMap.get(tag).setVisibility(View.VISIBLE);}private void hideFloatingView(String tag) {if (TextUtils.isEmpty(tag) || floatingMap == null || !floatingMap.containsKey(tag)) {Log.v(TAG, "tag为空或view未创建,无法隐藏");return;}floatingMap.get(tag).setVisibility(View.INVISIBLE);}

3、对自定义布局添加滑动效果

1、重写OnTouchListener:拖动过程为手指按下(ACTION_DOWN) --> 拖动(ACTION_MOBE) --> 手指拿开(ACTION_UP)

public class FloatingTouchListener implements View.OnTouchListener {private static final String TAG = "FloatingTouchListener";private int downX;private int downY;private int downRawX;private int downRawY;private int screenWidth;private int screenHeight;private IFloatingDragListener mListener;public interface IFloatingDragListener {void onFloatingClick();void onFloatingDrag();}public FloatingTouchListener(View view, IFloatingDragListener listener) {WindowManager wm = (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE);this.screenWidth = wm.getDefaultDisplay().getWidth();this.screenHeight = wm.getDefaultDisplay().getHeight();this.mListener = listener;}@Overridepublic boolean onTouch(View v, MotionEvent event) {if (v == null) {return false;}switch (event.getAction()) {case MotionEvent.ACTION_DOWN:downX = (int) event.getX();downY = (int) event.getY();downRawX = (int) event.getRawX();downRawY = (int) event.getRawY();break;case MotionEvent.ACTION_MOVE:int moveX = (int) event.getX() - downX;int moveY = (int) event.getY() - downY;int left, top, right, bottom;left = v.getLeft() + moveX;top = v.getTop() + moveY;right = left + v.getWidth();bottom = top + v.getHeight();//边界处理if (left < 0) {left = 0;right = left + v.getWidth();}if (right > screenWidth) {right = screenWidth;left = right - v.getWidth();}if (top < 0) {top = 0;bottom = top + v.getHeight();}if (bottom > screenHeight) {bottom = screenHeight;top = bottom - v.getHeight();}v.layout(left, top, right, bottom);break;case MotionEvent.ACTION_UP:int upX = (int) event.getRawX();int upY = (int) event.getRawY();if (Math.abs(upX - downRawX) < ViewConfiguration.get(v.getContext()).getScaledTouchSlop() &&Math.abs(upY - downRawY) < ViewConfiguration.get(v.getContext()).getScaledTouchSlop()) {Log.v(TAG, "点击事件");if (mListener != null) {mListener.onFloatingClick();}} else {Log.v(TAG, "拖动事件");if (mListener != null) {mListener.onFloatingDrag();}}break;}return true;}
}

2、在之前build的代码中增加touchlistener的语句,回调弹出一个toast

三、效果展示

创建activity浮窗,控件可滑动

附上demo地址: FloatingWinowDemo.zip_如何将activity制作为固定浮窗-Android文档类资源-CSDN下载

浮窗---创建Activity浮窗(可拖动)相关推荐

  1. 浮窗---创建系统浮窗(可拖动)

    目录​​​​​​​ 一.效果展示 二.代码实现 1.添加权限,动态申请权限 2.创建windowManager服务.windowManager Params配置项 3.动态加载view,添加到wind ...

  2. html效果浮窗效果,网页浮窗成效

    当前位置:我的异常网» Web前端 » 网页浮窗成效 网页浮窗成效 www.myexceptions.net  网友分享于:2014-12-05  浏览:0次 网页浮窗效果 Fixed固定位置的悬浮 ...

  3. Android窗口Window的创建(悬浮窗)

    创建悬浮窗以及基于无障碍服务的窗口 关于悬浮窗的创建 启动悬浮窗 关于前台服务 启动服务 无障碍窗口 知识点 参考链接 关于悬浮窗的创建 首先需要获取WindowManager WindowManag ...

  4. 教你如何在Android 6.0上创建系统悬浮窗

    郭霖大神的文章:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650235949&idx=1&sn=0f7eded ...

  5. Java安卓如何添加悬浮窗_Android桌面悬浮窗效果实现

    360手机卫士我相信大家都知道,好多人手机上都会装这一款软件,那么我们对它的一个桌面悬浮窗效果想必都不会陌生.请看下图: 首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会 ...

  6. Andorid 任意界面悬浮窗,实现悬浮窗如此简单

    FloatWindow 项目地址:yhaolpz/FloatWindow  简介:Andorid 任意界面悬浮窗,实现悬浮窗如此简单 更多:作者   提 Bug   官网 标签: 特性: 1.支持拖动 ...

  7. android悬浮窗组件,Android 悬浮窗,悬浮view功能实现

    写在前面:本文仅个人开发时遇到的问题及个人解决办法的记录. 国内各个手机厂商对ROM魔改的比较严重,还没有做兼容性测试,所以碰到沙雕的机子的时候,请再去寻找适配方法 最近项目开发中,需要实现一个悬浮窗 ...

  8. 安卓股票悬浮窗_Android 实现悬浮窗功能

    前言 我们大多数在两种情况下可以看到悬浮窗,一个是视频通话时的悬浮窗,另一个是360卫士的悬浮球,实现此功能的方式比较多,这里以视频通话悬浮窗中的需求为例.编码实现使用Kotlin.Java版本留言邮 ...

  9. app小窗口悬浮工具_悬浮窗大师下载-悬浮窗大师 v6.6_手机乐园

    软件简介 悬浮窗大师是一款简洁有趣的悬浮窗小助手应用,它支持的功能还是比较的多的,例如时间电量悬浮窗.流量悬浮窗以及自定义悬浮窗等,支持24小时制.电量充电提醒和拖拽等,流量的悬浮窗可以设置刷新的间隔 ...

最新文章

  1. ionic常见问题及解决方案
  2. Java forEach中 Lambda Expr中的 final变量要求
  3. 深入理解编译优化之循环展开和粗化锁
  4. linux统计字符串频数,Linux 统计某个字符串出现的次数
  5. 【题解】HAOI2007分割矩阵
  6. 计算机网络原理(第三章) 传输层 课后习题
  7. 20170513 Python练习册0011过滤敏感词
  8. jinja Evnironment
  9. oracle中注释都是问号?中文显示不出来问题
  10. Leetcode 5182.删除一次得到子数组最大和
  11. python 交换机巡检脚本_Python自动巡检H3C交换机实现过程解析
  12. SQL学习笔记四之MySQL数据操作
  13. Vue设置页面的title
  14. 使用SecureCRT下载服务器日志到本地windows
  15. 【PR】一看就会的常用视频效果
  16. iTextSharp 添加文字内容
  17. JAVA方法重载优先级
  18. 【工具使用】AI帮你写代码
  19. 如何稳定eBay店铺评分
  20. 摄像头ip分享论坛_谁的SIP软交换呼叫中心终端摄像头正在公网裸奔

热门文章

  1. 任何人都有值得学习的地方,横瓜向[水牛党](4618415)请教问题
  2. 推荐一款特别厉害的在线工具,程序员的百宝箱
  3. VMware Workstation16设置共享文件夹
  4. 计算机网络(3)——三种常见的数据交换技术
  5. 数字图像处理成长之路13:SIFT之极值点(子像元插值)
  6. python selenium下载电子书
  7. Visual Paradigm 里什么是复合结构图?
  8. Visual Paradigm在 Windows系统电脑上安装
  9. 微信小程序获取当前页面url
  10. 航程门业:如何选购实木复合门及如何保养