在日常Android
開發(fā)當(dāng)中怕膛,我們可能要實(shí)現(xiàn)全局懸浮窗的需求朴上。這里分享一個(gè)快速實(shí)現(xiàn)的框架,希望能幫小伙伴們提高開發(fā)效率懂鸵。
FloatWindow
一個(gè)全局懸浮窗的框架偏螺,主要特性如下:
1.支持拖動(dòng),提供自動(dòng)貼邊等動(dòng)畫
2.內(nèi)部自動(dòng)進(jìn)行權(quán)限申請(qǐng)操作
3.可自由指定要顯示懸浮窗的界面
4.應(yīng)用退到后臺(tái)時(shí)匆光,懸浮窗會(huì)自動(dòng)隱藏
5.除小米外砖茸,4.4~7.0 無需權(quán)限申請(qǐng)
6.位置及寬高可設(shè)置百分比值,輕松適配各分辨率
7.支持權(quán)限申請(qǐng)結(jié)果殴穴、位置等狀態(tài)監(jiān)聽
8.鏈?zhǔn)秸{(diào)用凉夯,簡潔清爽
集成到項(xiàng)目
項(xiàng)目的build.gradle
:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
應(yīng)用的build.gradle
:
dependencies {
implementation 'com.github.yhaolpz:FloatWindow:1.0.9'
}
截止我發(fā)布博客,開源庫版本是1.0.9
采幌。如果想要查看最新版本劲够,請(qǐng)看開源庫wiki
需要權(quán)限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
基礎(chǔ)使用
FloatWindow
.with(getApplicationContext())
.setView(view)
.setWidth(100) //設(shè)置控件寬高
.setHeight(Screen.width,0.2f)
.setX(100) //設(shè)置控件初始位置
.setY(Screen.height,0.3f)
.setDesktopShow(true) //桌面顯示
.setViewStateListener(mViewStateListener) //監(jiān)聽?wèi)腋】丶顟B(tài)改變
.setPermissionListener(mPermissionListener) //監(jiān)聽權(quán)限申請(qǐng)結(jié)果
.build();
可以指定界面顯示
.setFilter(true, A_Activity.class, C_Activity.class)
部分界面不展示
.setFilter(false, B_Activity.class)
可拖動(dòng)懸浮窗以及回彈動(dòng)畫
.setMoveType(MoveType.slide)
.setMoveStyle(500, new AccelerateInterpolator()) //貼邊動(dòng)畫時(shí)長為500ms,加速插值器
主要有4種MoveType
:
- MoveType.slide : 可拖動(dòng)休傍,釋放后自動(dòng)貼邊 (默認(rèn))
- MoveType.back : 可拖動(dòng)征绎,釋放后自動(dòng)回到原位置
- MoveType.active : 可拖動(dòng)
- MoveType.inactive : 不可拖動(dòng)
setMoveStyle 方法可設(shè)置動(dòng)畫效果,只在 MoveType.slide 或 MoveType.back 模式下設(shè)置此項(xiàng)才有意義磨取。默認(rèn)減速插值器人柿,默認(rèn)動(dòng)畫時(shí)長為 300ms。
多個(gè)懸浮窗
FloatWindow
.with(getApplicationContext())
.setView(imageView)
.build();
FloatWindow
.with(getApplicationContext())
.setView(button)
.setTag("new")
.build();
FloatWindow.get("new").show();
FloatWindow.get("new").hide();
FloatWindow.destroy("new");