Android中怎么实现一个可移动的悬浮窗

介绍

这期内容当中小编将会给大家带来有关Android中怎么实现一个可移动的悬浮窗,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。


首先我们先建一个windowmangerdemo的项目

在activity_main里面增加一个按钮的按钮

 Android中怎么实现一个可移动的悬浮窗

然后在布局布局里面增加window_small.xml和window_big.xml两个布局文件,用于点击小窗口后展开大窗口

window_small。xml

 Android中怎么实现一个可移动的悬浮窗

我们在线性布局管理嚣中直接加上一个相对布局管理嚣。然后设上背景图片即可

<人力资源/>

FloatWindowSmallView

我们的FloatWindowSmallView继承自LinearLayout

重写onTouchEvent事件,我们用于可以随时点击移动和展开我们的悬浮框

,,,公共布尔alt=" Android中怎么实现一个可移动的悬浮窗">

我们设了三个垂直的ImageButton,代表点击小窗体后展开的大的窗体

 Android中怎么实现一个可移动的悬浮窗

<人力资源/>

FloatWindowBigView

代码比较简单,直接写对应的事件即可

公共类FloatWindowBigView延伸LinearLayout {

,,,公共静态int viewWidth;
,,,公共静态int viewHeight;

,,,公共FloatWindowBigView(最终上下文语境){
,,,,,,,超级(上下文);

,,,,,,,LayoutInflater.from(上下文).inflate (R.layout.window_big,这);
,,,,,,,视图视图=findViewById (R.id.big_window_layout);
//,,,,,,,viewWidth=view.getLayoutParams () .width;
//,,,,,,,viewHeight=view.getLayoutParams () .height;
,,,,,,,viewWidth=120;
,,,,,,,viewHeight=370;
,,,,,,,ImageButton imgbig=(ImageButton) findViewById (R.id.imgbig);
,,,,,,,ImageButton imgcamera=findViewById (R.id.imgcamera);
,,,,,,,ImageButton imgvoice=findViewById (R.id.imgvoice);

,,,,,,,imgcamera。setOnClickListener(新alt=" Android中怎么实现一个可移动的悬浮窗">

我们把大小悬浮穿的参数分别对应不同的LayoutParams,都在这里处理

<人力资源/>
 FloatWindow 

做一个FloatWindow继承自服务

通过处理程序和时间控件来刷新悬浮窗是否一直存在

 <代码>/* * 
*判断当前界面是否是扫码界面
*/
私人布尔isForeground (String[]一会){
,如果(类名。长度& lt;=0) {
,,,,返回false。
,,}

,上午,ActivityManager=(ActivityManager) getSystemService (Context.ACTIVITY_SERVICE);
,,//判断当前进程
,,ListappProcesses=我
,,,,,,.getRunningAppProcesses ();
,(ActivityManager。RunningAppProcessInfo appProcess: appProcesses) {
,,,,如果(appProcess.processName.equals (getPackageName ())) {
,,,,,,//判断程序是否处于前台,如果是后台则不显示悬浮框
,,,,,如果(appProcess。重要性!=ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
,,,,,,,,Log.i (getPackageName(),“处于后台“
,,,,,,,,,,,,+ appProcess.processName);
,,,,,,,,返回false。
,,,,,}
大敌;,,}
大敌;,}

,,//判断顶层活动
,,List列表=am.getRunningTasks (1);
,,如果列表!=零,,list.size()比;0){
,,,,ComponentName尼共=list.get (0) .topActivity;
,,,,(字符串名称:类名){
,,,,,,如果(className.equals (cpn.getClassName ())) {
,,,,,,,,返回true;
,,,,,}
大敌;,,}
大敌;}
大敌;,返回false。
}
 <代码>类RefreshTask延伸TimerTask {

,,@Override
,,公共空间run () {
,,,,//当前界面是要显示的界面,且没有悬浮窗显示,则创建悬浮窗。
,,,,如果(isForeground (activityname),,! MyWindowManager.isWindowShowing ()) {
,,,,,处理程序。邮报》(新Runnable () {
,,,,,,,,@Override
,,,,,,,,公共空间run () {
,,,,,,,,,,MyWindowManager.createSmallWindow (getApplicationContext ());
,,null

Android中怎么实现一个可移动的悬浮窗