Android使用WindowManager构造悬浮view
程序员文章站
2024-03-01 21:33:40
一般在android显示一个view都是通过activity的setcontentview设置的,但是还有一种方法,可以直接使用windowmanager在整个应用的最上层...
一般在android显示一个view都是通过activity的setcontentview设置的,但是还有一种方法,可以直接使用windowmanager在整个应用的最上层绘制我们需要显示的view,总体的效果类似于alertdialog的弹出效果。
使用windowmanager构造这样的一个悬浮view也比较简单,直接通过windowmanager.addview()方法即可。
package com.gearmotion.app.windowmanagermotion; import android.content.context; import android.graphics.pixelformat; import android.graphics.rect; import android.support.v7.app.appcompatactivity; import android.os.bundle; import android.view.gravity; import android.view.layoutinflater; import android.view.motionevent; import android.view.view; import android.view.viewgroup; import android.view.windowmanager; import android.widget.button; public class mainactivity extends appcompatactivity implements view.onclicklistener, view.ontouchlistener { button mshowbtn; button mhidebtn; windowmanager mwm; layoutinflater mlayoutinflater; view mwindowview; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mshowbtn = (button) this.findviewbyid(r.id.showbtn); mhidebtn = (button) this.findviewbyid(r.id.hidebtn); mshowbtn.setonclicklistener(this); mhidebtn.setonclicklistener(this); init(); } private void init() { mwm = (windowmanager) this.getapplicationcontext().getsystemservice(context.window_service); mlayoutinflater = layoutinflater.from(this); } @override public void onclick(view v) { if (mshowbtn.hashcode() == v.hashcode()) { //显示windowmanager show(); } if (mhidebtn.hashcode() == v.hashcode()) { //隐藏windowmanager hide(); } } private void show() { mwindowview = mlayoutinflater.inflate(r.layout.item_layout, null); view popview = mwindowview.findviewbyid(r.id.root); //设置popview的触摸事件,以便点击空白区域的时候使悬浮view消失 popview.setontouchlistener(this); windowmanager.layoutparams lp = new windowmanager.layoutparams(); //窗口类型同系统弹出框 lp.type = windowmanager.layoutparams.type_system_alert; //响应输入法 //lp.flags = windowmanager.layoutparams.flag_alt_focusable_im; //透明层 lp.format = pixelformat.transparent; lp.width = windowmanager.layoutparams.match_parent; lp.height = windowmanager.layoutparams.match_parent; lp.gravity = gravity.center_vertical; mwm.addview(mwindowview, lp); } private void hide() { if (mwindowview != null && mwindowview.getparent() != null) { mwm.removeview(mwindowview); } } @override public boolean ontouch(view v, motionevent event) { int x = (int) event.getx(); int y = (int) event.gety(); //获取主view的可视区域 rect globalrect = new rect(); //获取悬浮view的可视区域 rect tmprect = new rect(); v.getglobalvisiblerect(globalrect); view child = ((viewgroup) v).getchildat(0); child.gethitrect(tmprect); if (!tmprect.contains(x, y) && globalrect.contains(x, y)) { hide(); } return true; } }
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".mainactivity"> <button android:id="@+id/showbtn" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:text="show" /> <button android:id="@+id/hidebtn" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:text="hide" /> </linearlayout>
item_layout.xml:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:id="@+id/root" android:orientation="vertical"> <textview android:layout_width="match_parent" android:layout_height="50dp" android:text="i am windowmanager layout view" android:textsize="20sp" android:gravity="center" android:layout_gravity="center" android:background="#fff8dc" android:textcolor="#7ac5cd"/> </linearlayout>
实现效果如下:
以上就是本文的全部内容,希望对大家学习android有所帮助,也希望大家多多支持。
上一篇: Ajax实现搜索引擎自动补全功能
推荐阅读
-
Android使用WindowManager构造悬浮view
-
Android 自定义View时使用TypedArray配置样式属性详细介绍
-
Android 自定义View的构造函数详细介绍
-
详解android使用ItemDecoration 悬浮导航栏效果
-
Android编程使用自定义View实现水波进度效果示例
-
在当前Activity之上创建悬浮view之WindowManager悬浮窗效果
-
Android利用WindowManager生成悬浮按钮及悬浮菜单
-
详解android使用ItemDecoration 悬浮导航栏效果
-
Android编程使用自定义View实现水波进度效果示例
-
Android中使用ScrollView指定view的顶部悬停效果