浮窗---创建Activity浮窗(可拖动)
目录
一、目标
二、代码实现
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.添加权限,动态申请权限 2.创建windowManager服务.windowManager Params配置项 3.动态加载view,添加到wind ...
- html效果浮窗效果,网页浮窗成效
当前位置:我的异常网» Web前端 » 网页浮窗成效 网页浮窗成效 www.myexceptions.net 网友分享于:2014-12-05 浏览:0次 网页浮窗效果 Fixed固定位置的悬浮 ...
- Android窗口Window的创建(悬浮窗)
创建悬浮窗以及基于无障碍服务的窗口 关于悬浮窗的创建 启动悬浮窗 关于前台服务 启动服务 无障碍窗口 知识点 参考链接 关于悬浮窗的创建 首先需要获取WindowManager WindowManag ...
- 教你如何在Android 6.0上创建系统悬浮窗
郭霖大神的文章:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650235949&idx=1&sn=0f7eded ...
- Java安卓如何添加悬浮窗_Android桌面悬浮窗效果实现
360手机卫士我相信大家都知道,好多人手机上都会装这一款软件,那么我们对它的一个桌面悬浮窗效果想必都不会陌生.请看下图: 首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会 ...
- Andorid 任意界面悬浮窗,实现悬浮窗如此简单
FloatWindow 项目地址:yhaolpz/FloatWindow 简介:Andorid 任意界面悬浮窗,实现悬浮窗如此简单 更多:作者 提 Bug 官网 标签: 特性: 1.支持拖动 ...
- android悬浮窗组件,Android 悬浮窗,悬浮view功能实现
写在前面:本文仅个人开发时遇到的问题及个人解决办法的记录. 国内各个手机厂商对ROM魔改的比较严重,还没有做兼容性测试,所以碰到沙雕的机子的时候,请再去寻找适配方法 最近项目开发中,需要实现一个悬浮窗 ...
- 安卓股票悬浮窗_Android 实现悬浮窗功能
前言 我们大多数在两种情况下可以看到悬浮窗,一个是视频通话时的悬浮窗,另一个是360卫士的悬浮球,实现此功能的方式比较多,这里以视频通话悬浮窗中的需求为例.编码实现使用Kotlin.Java版本留言邮 ...
- app小窗口悬浮工具_悬浮窗大师下载-悬浮窗大师 v6.6_手机乐园
软件简介 悬浮窗大师是一款简洁有趣的悬浮窗小助手应用,它支持的功能还是比较的多的,例如时间电量悬浮窗.流量悬浮窗以及自定义悬浮窗等,支持24小时制.电量充电提醒和拖拽等,流量的悬浮窗可以设置刷新的间隔 ...
最新文章
- ionic常见问题及解决方案
- Java forEach中 Lambda Expr中的 final变量要求
- 深入理解编译优化之循环展开和粗化锁
- linux统计字符串频数,Linux 统计某个字符串出现的次数
- 【题解】HAOI2007分割矩阵
- 计算机网络原理(第三章) 传输层 课后习题
- 20170513 Python练习册0011过滤敏感词
- jinja Evnironment
- oracle中注释都是问号?中文显示不出来问题
- Leetcode 5182.删除一次得到子数组最大和
- python 交换机巡检脚本_Python自动巡检H3C交换机实现过程解析
- SQL学习笔记四之MySQL数据操作
- Vue设置页面的title
- 使用SecureCRT下载服务器日志到本地windows
- 【PR】一看就会的常用视频效果
- iTextSharp 添加文字内容
- JAVA方法重载优先级
- 【工具使用】AI帮你写代码
- 如何稳定eBay店铺评分
- 摄像头ip分享论坛_谁的SIP软交换呼叫中心终端摄像头正在公网裸奔