getMetrics is deprecated 已廢棄替代解決方式

 

前言

getMetrics 在 Android API level 30 (Android 11) 已廢棄,官方建議可以改用 WindowMetrics 替代。

HKT 講師,相關課程

HKT 講師,相關課程:
🎬 從零開始學 Swift 程式設計 免費講義
https://bit.ly/3ekjsEP
🎬 從零開始學 SwiftUI 程式設計 免費講義
https://bit.ly/3xCbUUp
🎬Android 入門開發實戰:口罩地圖(Kotlin) 免費講義
https://bit.ly/2KKZcju
🎬從零開始學 Dart 程式設計 免費講義
https://bit.ly/2OJW6hl
🎬 Flutter 程式設計入門實戰 免費講義
https://bit.ly/37L47Ij
🎬從零開始學 Java 程式設計 免費講義
https://bit.ly/2WlCn6y
🎬 從零開始學 kotlin 程式設計 免費講義
https://bit.ly/2Kx7GrM

替代解決方式

public static int getScreenWidth() {
    WindowManager wm = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        WindowMetrics windowMetrics = wm.getCurrentWindowMetrics();
        return windowMetrics.getBounds().width();
    } else {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics.widthPixels;
    }
}

而 density 官方建議可以改採用 Configuration 的 densityDpi 替代。

public static float getDensity() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        Configuration config = getApplication().getResources().getConfiguration();
        return (config.densityDpi) / 160f;
    } else {
        DisplayMetrics metrics = getApplication().getResources().getDisplayMetrics();
        return metrics.density;
    }
}

完整 ViewUtil 範例

import android.app.Application;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Build;
import android.util.DisplayMetrics;
import android.view.WindowManager;
import android.view.WindowMetrics;

public class ViewUtil {

    private static Application application;

    public static void init(Application app) {
        ViewUtil.application = app;
    }

    private static Application getApplication() {
        if (application == null) {
            throw new IllegalStateException("You must call init() method at first!");
        }
        return application;
    }

    public static int getScreenWidth() {
        WindowManager wm = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            WindowMetrics windowMetrics = wm.getCurrentWindowMetrics();
            return windowMetrics.getBounds().width();
        } else {
            DisplayMetrics displayMetrics = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(displayMetrics);
            return displayMetrics.widthPixels;
        }
    }

    public static float getDensity() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            Configuration config = getApplication().getResources().getConfiguration();
            return (config.densityDpi) / 160f;
        } else {
            DisplayMetrics metrics = getApplication().getResources().getDisplayMetrics();
            return metrics.density;
        }
    }

    public static float dpToPx(float dpValue){
        return (int)(getDensity() * dpValue);
    }
}

使用方式

ViewUtil.init(getApplication());//初始化
        
ViewUtil.getScreenWidth();//獲取螢幕寬度
ViewUtil.getDensity();//獲取解析度
ViewUtil.dpToPx(100);//dp 轉 px 單位

參考資料

Android Developers - getMetrics
https://developer.android.com/reference/android/view/Display#getMetrics(android.util.DisplayMetrics)

Android Developers - getBounds
https://developer.android.com/reference/android/view/WindowMetrics#getBounds()

Android Developers - densityDpi
https://developer.android.com/reference/android/content/res/Configuration#densityDpi

贊助我們

創作不易,知識無價,免費線上教學就像顆種子,希望藉由您的支持與贊助,能夠無後顧之憂的日漸茁壯,努力前行堅持下去。不論捐贈金額的大小,我們都由衷的感謝每位贊助者,都是我們推廣知識、開放共享知識最大的動力!

您的捐贈將用於:請作者喝杯咖啡,鼓勵繼續創作,持續上傳教學影片與更多新技術文章。

Line Pay 打賞


(由 Line Pay 支付平台,提供轉帳服務)

街口打賞


(由街口行動支付平台,提供轉帳服務)

超商代碼繳費打賞

(由綠界科技支付平台,提供超商繳費代碼)

相關連結

HKT 線上教室 每週六日 更新影片
▶ YouTube 頻道
https://goo.gl/3f2pJi
▶ KT 線上教室 臉書粉絲團
https://goo.gl/27H9Li
▶ Udemy 頻道
http://bit.ly/2ZNdnrt
▶ 贊助我們
https://goo.gl/FiKXAu

AndroidStudio / Xcode
Java / Kotlin / Dart / Flutter
APP / AppDevloper
Android / AndroidDevloper
iOS / iOSDeveloper / Swift / SwiftUI
Programer

這個網誌中的熱門文章

2023 最新入門零基礎 Kotlin教學【從零開始學 Kotlin 程式設計】Kotlin 教學課程目錄 (Android Kotlin, IntelliJ IDEA, Android Studio, Android APP 開發教學)

2023 最新 Android 教學【開發 Android APP 手機應用程式:使用 kotlin 程式語言】教學課程目錄 (Android Kotlin, Android Studio, Android APP 開發教學)

2022 最新入門零基礎 Flutter教學 【Flutter 程式設計入門實戰 30 天】Flutter 教學課程目錄 (IntelliJ IDEA 開發教學)

nano 文字編輯器