當前位置:首頁 » 安卓系統 » android懸浮窗動畫

android懸浮窗動畫

發布時間: 2024-06-23 17:17:31

⑴ android8.0之懸浮窗和通知欄

懸浮窗:

        使用場景:例如微信在視頻的時候,點擊Home鍵,視頻小窗口仍然會在屏幕上顯示;

        注意事項:

                1、一般需要在後台進行操作的時候才需要懸浮窗,這樣懸浮窗才有意義;

                2、API Level >= 23的時候,需要在AndroidManefest.xml文件中聲明許可權SYSTEM_ALERT_WINDOW才能在其他應用上繪制控制項。

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />;除了這個許可權外,我們還需要在系統設置裡面對本應用進行設置懸浮窗許可權。該許可權在應用中需要啟動Settings.ACTION_MANAGE_OVERLAY_PERMISSION來讓用戶手動設置許可權:startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), REQUEST_CODE);

                3、LayoutParam設置:LayoutParam里的type變數。這個變數是用來指定窗口類型的。在設置這個變數時,需要注意一個坑,那就是需要對不同版本的Android系統進行適配。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

    layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

} else {

    layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;

};在Android 8.0之前,懸浮窗口設置可以為TYPE_PHONE,這種類型是用於提供用戶交互操作的非應用窗口。

而Android 8.0對系統和API行為做了修改,包括使用SYSTEM_ALERT_WINDOW許可權的應用無法再使用一下窗口類型來在其他應用和窗口上方顯示提醒窗口:

- TYPE_PHONE

- TYPE_PRIORITY_PHONE

- TYPE_SYSTEM_ALERT

- TYPE_SYSTEM_OVERLAY

- TYPE_SYSTEM_ERROR

如果需要實現在其他應用和窗口上方顯示提醒窗口,那麼必須該為TYPE_APPLICATION_OVERLAY的新類型;

如果在Android 8.0以上版本仍然使用TYPE_PHONE類型的懸浮窗口,則會出現如下異常信息:

android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@f8ec928 -- permission denied for window type 2002;

        具體實現:

        1、Activity:
        public void startFloatingService(View view) {        

    ...

    if (!Settings.canDrawOverlays(this)) {

        Toast.makeText(this, "當前無許可權,請授權", Toast.LENGTH_SHORT);

        startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), 0);

    } else {

        startService(new Intent(MainActivity.this, FloatingService.class));

    }

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 0) {

        if (!Settings.canDrawOverlays(this)) {

            Toast.makeText(this, "授權失敗", Toast.LENGTH_SHORT).show();

        } else {

            Toast.makeText(this, "授權成功", Toast.LENGTH_SHORT).show();

            startService(new Intent(MainActivity.this, FloatingService.class));

        }

    }

}

2、service:

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

    showFloatingWindow();

    return super.onStartCommand(intent, flags, startId);

}

private void showFloatingWindow() {

    if (Settings.canDrawOverlays(this)) {

        // 獲取WindowManager服務

        WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        // 新建懸浮窗控制項

        Button button = new Button(getApplicationContext());

        button.setText("Floating Window");

        button.setBackgroundColor(Color.BLUE);

        // 設置LayoutParam

        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

        } else {

            layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;

        }

        layoutParams.format = PixelFormat.RGBA_8888;

        layoutParams.width = 500;

        layoutParams.height = 100;

        layoutParams.x = 300;

        layoutParams.y = 300;

        // 將懸浮窗控制項添加到WindowManager

        windowManager.addView(button, layoutParams);

    }

}

        效果展示:

                

熱點內容
GDC伺服器的時間怎麼調 發布:2024-06-28 14:40:32 瀏覽:162
智慧團建初始密碼是多少 發布:2024-06-28 14:27:58 瀏覽:876
編程大獎 發布:2024-06-28 14:26:48 瀏覽:928
充值運行編程 發布:2024-06-28 14:09:04 瀏覽:108
拆手機存儲器 發布:2024-06-28 13:39:06 瀏覽:560
伺服器電腦能同時用嗎 發布:2024-06-28 13:39:01 瀏覽:954
榮耀戰力安卓qq區哪裡最低 發布:2024-06-28 13:36:00 瀏覽:406
java多線程變數 發布:2024-06-28 13:28:38 瀏覽:578
編程貓里元始 發布:2024-06-28 13:19:40 瀏覽:811
apache外網無法訪問 發布:2024-06-28 13:04:27 瀏覽:918