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

這個網誌中的熱門文章

16天記下7000單字

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

nano 文字編輯器

Android Studio 歷代版本下載點

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