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