Andorid 任意介面懸浮窗,實現懸浮窗如此簡單

weixin_34205826發表於2017-12-24

懸浮按鈕圖

特性:

1.支援拖動,提供自動貼邊等動畫

2.內部自動進行許可權申請操作

3.可自由指定要顯示懸浮窗的介面

4.應用退到後臺時,懸浮窗會自動隱藏

5.位置不可變的懸浮窗無需許可權申請

6.位置及寬高可設定百分比值,輕鬆適配各解析度

7.鏈式呼叫,簡潔清爽

整合:

第 1 步、在工程的 build.gradle 中新增:

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

第 2 步、在應用的 build.gradle 中新增:

    dependencies {
            compile 'com.github.yhaolpz:FloatWindow:1.0.6'
    }

使用:

0.宣告許可權


     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

1.建立懸浮控制元件

        FloatWindow
              .with(getApplicationContext())
              .setView(view)
              .build();

setView 方法可設定 View 子類或 xml 佈局。

2.控制元件寬高

        FloatWindow
              .with(getApplicationContext())
              .setView(view)
              .setWidth(100)                   //100px
              .setHeight(Screen.width,0.2f)    //螢幕寬度的 20%
              .build();

可設定具體數值或螢幕寬/高百分比,預設為 wrap_content。

3.顯示位置

        FloatWindow
              .with(getApplicationContext())
              .setView(view)
              .setX(100)                      //100px
              .setY(Screen.width,0.2f)        //螢幕寬度的 20%
              .build();

可設定具體數值或螢幕寬/高百分比,預設為 0,以螢幕左上角為原點。

4.指定介面顯示

        FloatWindow
              .with(getApplicationContext())
              .setView(view)
              .setFilter(true, A_Activity.class, C_Activity.class)
              .build();

此方法表示 A_Activity、C_Activity 顯示懸浮窗,其他介面隱藏。

              .setFilter(false, B_Activity.class)

此方法表示 B_Activity 隱藏懸浮窗,其他介面顯示。

注意:setFilter 方法引數可以識別該 Activity 的子類

也就是說,如果 A_Activity、C_Activity 繼承自 BaseActivity,你可以這樣設定:

              .setFilter(true, BaseActivity.class)

5.可拖動懸浮窗

        FloatWindow
              .with(getApplicationContext())
              .setView(view)
              .setMoveType(MoveType.slide)         //可拖動,釋放後自動貼邊
              .build();

共提供 4 種 MoveType :

MoveType.slide : 可拖動,釋放後自動貼邊

MoveType.back : 可拖動,釋放後自動回到原位置

MoveType.active : 可拖動

MoveType.free : 不可拖動,但可改變位置

如不設定,則為 fixed 模式,不可改變位置。

6.懸浮窗動畫

        FloatWindow
              .with(getApplicationContext())
              .setView(view)
              .setMoveType(MoveType.slide)
              .setMoveStyle(500, new AccelerateInterpolator())  //貼邊動畫時長為500ms,加速插值器
              .build();

自定義貼邊或回到原位置過程的動畫效果,只在 MoveType.slide 或 MoveType.back 模式下設定此項才有意義。預設減速插值器,預設動畫時長為 300ms。

7.後續操作

        //手動控制
        FloatWindow.get().show();
        FloatWindow.get().hide();

        //修改顯示位置
        FloatWindow.get().updateX(100);
        FloatWindow.get().updateY(100);

        //銷燬
        FloatWindow.destroy();

以上操作應待懸浮窗初始化後進行,注意不能對 fixed 模式懸浮窗修改顯示位置。

8.多個懸浮窗


        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");

建立第一個懸浮窗不需加 tag,之後再建立就需指定唯一 tag ,以此區分,方便進行後續操作。

舉個例子:

懸浮按鈕圖

此效果實現全部程式碼為下:


        FloatWindow
                .with(getApplicationContext())
                .setView(imageView)
                .setWidth(Screen.width,0.2f)
                .setHeight(Screen.width,0.2f)
                .setX(Screen.width,0.7f)
                .setY(Screen.height,0.2f)
                .setMoveType(MoveType.back)
                .setMoveStyle(300,null)
                .setFilter(true,A_Activity.class,C_Activity.class)
                .build();

sample 中也有示例程式碼。

更新日誌

v1.0.6

1.支援懸浮窗拖動及相關動效

2.位置及寬高可設定百分比值

3.更改相關類名及使用方法

v1.0.5

1.修復未呼叫show顯示懸浮窗bug

v1.0.4

1.返回桌面將會自動隱藏控制元件,無需再監聽應用退到後臺等操作

2.新增 Activity 過濾器,可自由指定哪些介面顯示,哪些介面不顯示

3.FixedFloatWindow 類改為 FFWindow

v1.0.3

1.修復已知 bug

2.新增 dismiss 方法

3.新增其他方案,如:所有版本都申請許可權

相關文章