本文实例讲述了android编程实现悬浮窗体的方法。分享给大家供大家参考,具体如下:
突然对悬浮窗体感兴趣,查资料做了个小demo,效果是点击按钮后,关闭当前activity,显示悬浮窗口,窗口可以拖动,双击后消失。效果图如下:
它的使用原理很简单,就是借用了windowmanager这个管理类来实现的。
1.首先在androidmanifest.xml中添加使用权限:
复制代码 代码如下:
<uses-permission android:name="android.permission.system_alert_window" />
2.悬浮窗口布局实现
1
2
3
4
5
6
7
8
9
10
11
|
public class desktoplayout extends linearlayout {
public desktoplayout(context context) {
super (context);
setorientation(linearlayout.vertical); // 水平排列
//设置宽高
this .setlayoutparams( new layoutparams(layoutparams.wrap_content,
layoutparams.wrap_content));
view view = layoutinflater.from(context).inflate(
r.layout.desklayout, null );
this .addview(view);
}
|
3.在activity中让它显示出来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 取得系统窗体
mwindowmanager = (windowmanager) getapplicationcontext()
.getsystemservice( "window" );
// 窗体的布局样式
mlayout = new windowmanager.layoutparams();
// 设置窗体显示类型——type_system_alert(系统提示)
mlayout.type = windowmanager.layoutparams.type_system_alert;
// 设置窗体焦点及触摸:
// flag_not_focusable(不能获得按键输入焦点)
mlayout.flags = windowmanager.layoutparams.flag_not_focusable;
// 设置显示的模式
mlayout.format = pixelformat.rgba_8888;
// 设置对齐的方法
mlayout.gravity = gravity.top | gravity.left;
// 设置窗体宽度和高度
mlayout.width = windowmanager.layoutparams.wrap_content;
mlayout.height = windowmanager.layoutparams.wrap_content;
|
详细 mainactivity 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
package com.yc.yc_suspendingform;
import android.app.activity;
import android.graphics.pixelformat;
import android.graphics.rect;
import android.os.bundle;
import android.util.log;
import android.view.gravity;
import android.view.motionevent;
import android.view.view;
import android.view.view.onclicklistener;
import android.view.view.ontouchlistener;
import android.view.windowmanager;
import android.widget.button;
import com.yc.yc_floatingform.r;
public class mainactivity extends activity {
private windowmanager mwindowmanager;
private windowmanager.layoutparams mlayout;
private desktoplayout mdesktoplayout;
private long starttime;
// 声明屏幕的宽高
float x, y;
int top;
@override
protected void oncreate(bundle savedinstancestate) {
super .oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
createwindowmanager();
createdesktoplayout();
button btn = (button) findviewbyid(r.id.btn);
btn.setonclicklistener( new onclicklistener() {
public void onclick(view v) {
showdesk();
}
});
}
/**
* 创建悬浮窗体
*/
private void createdesktoplayout() {
mdesktoplayout = new desktoplayout( this );
mdesktoplayout.setontouchlistener( new ontouchlistener() {
float mtouchstartx;
float mtouchstarty;
@override
public boolean ontouch(view v, motionevent event) {
// 获取相对屏幕的坐标,即以屏幕左上角为原点
x = event.getrawx();
y = event.getrawy() - top; // 25是系统状态栏的高度
log.i( "startp" , "startx" + mtouchstartx + "====starty"
+ mtouchstarty);
switch (event.getaction()) {
case motionevent.action_down:
// 获取相对view的坐标,即以此view左上角为原点
mtouchstartx = event.getx();
mtouchstarty = event.gety();
log.i( "startp" , "startx" + mtouchstartx + "====starty"
+ mtouchstarty);
long end = system.currenttimemillis() - starttime;
// 双击的间隔在 300ms以下
if (end < 300 ) {
closedesk();
}
starttime = system.currenttimemillis();
break ;
case motionevent.action_move:
// 更新浮动窗口位置参数
mlayout.x = ( int ) (x - mtouchstartx);
mlayout.y = ( int ) (y - mtouchstarty);
mwindowmanager.updateviewlayout(v, mlayout);
break ;
case motionevent.action_up:
// 更新浮动窗口位置参数
mlayout.x = ( int ) (x - mtouchstartx);
mlayout.y = ( int ) (y - mtouchstarty);
mwindowmanager.updateviewlayout(v, mlayout);
// 可以在此记录最后一次的位置
mtouchstartx = mtouchstarty = 0 ;
break ;
}
return true ;
}
});
}
@override
public void onwindowfocuschanged( boolean hasfocus) {
super .onwindowfocuschanged(hasfocus);
rect rect = new rect();
// /取得整个视图部分,注意,如果你要设置标题样式,这个必须出现在标题样式之后,否则会出错
getwindow().getdecorview().getwindowvisibledisplayframe(rect);
top = rect.top; //状态栏的高度,所以rect.height,rect.width分别是系统的高度的宽度
log.i( "top" , "" +top);
}
/**
* 显示desktoplayout
*/
private void showdesk() {
mwindowmanager.addview(mdesktoplayout, mlayout);
finish();
}
/**
* 关闭desktoplayout
*/
private void closedesk() {
mwindowmanager.removeview(mdesktoplayout);
finish();
}
/**
* 设置windowmanager
*/
private void createwindowmanager() {
// 取得系统窗体
mwindowmanager = (windowmanager) getapplicationcontext()
.getsystemservice( "window" );
// 窗体的布局样式
mlayout = new windowmanager.layoutparams();
// 设置窗体显示类型——type_system_alert(系统提示)
mlayout.type = windowmanager.layoutparams.type_system_alert;
// 设置窗体焦点及触摸:
// flag_not_focusable(不能获得按键输入焦点)
mlayout.flags = windowmanager.layoutparams.flag_not_focusable;
// 设置显示的模式
mlayout.format = pixelformat.rgba_8888;
// 设置对齐的方法
mlayout.gravity = gravity.top | gravity.left;
// 设置窗体宽度和高度
mlayout.width = windowmanager.layoutparams.wrap_content;
mlayout.height = windowmanager.layoutparams.wrap_content;
}
}
|
完整实例代码代码点击此处本站下载。
希望本文所述对大家android程序设计有所帮助。