diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/utils/ContextHolder.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/utils/ContextHolder.java index c2b7701489e..9291c8f1b42 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/utils/ContextHolder.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/utils/ContextHolder.java @@ -19,15 +19,16 @@ public class ContextHolder { - private static Context appContext; + private static Context sAppContext; public static void initAppContext(Context context) { - if (context != null && appContext == null) { - appContext = context.getApplicationContext(); + if (context != null && sAppContext == null) { + sAppContext = context.getApplicationContext(); + PixelUtil.initDisplayMetrics(sAppContext); } } public static Context getAppContext() { - return appContext; + return sAppContext; } } diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/utils/DimensionsUtil.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/utils/DimensionsUtil.java index d23ed7f47b1..d881dd86110 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/utils/DimensionsUtil.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/utils/DimensionsUtil.java @@ -175,7 +175,10 @@ public static HippyMap getDimensions(int windowWidth, int windowHeight, Context return null; } - DisplayMetrics windowDisplayMetrics = context.getResources().getDisplayMetrics(); + DisplayMetrics windowDisplayMetrics = PixelUtil.getMetrics(); + if (windowDisplayMetrics == null) { + windowDisplayMetrics = context.getResources().getDisplayMetrics(); + } DisplayMetrics screenDisplayMetrics = new DisplayMetrics(); screenDisplayMetrics.setTo(windowDisplayMetrics); WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/utils/PixelUtil.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/utils/PixelUtil.java index f8992a7da98..937d20dff04 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/utils/PixelUtil.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/utils/PixelUtil.java @@ -15,44 +15,62 @@ */ package com.tencent.mtt.hippy.utils; +import android.content.Context; import android.util.DisplayMetrics; import android.util.TypedValue; +import android.view.Display; +import android.view.WindowManager; @SuppressWarnings({"unused"}) public class PixelUtil { + private static DisplayMetrics sDisplayMetrics = null; - static DisplayMetrics sMetrics = null; - + public static void initDisplayMetrics(Context appContext) { + if (appContext == null) { + return; + } - private static DisplayMetrics getMetrics() { - if (sMetrics == null) { - sMetrics = ContextHolder.getAppContext().getResources().getDisplayMetrics(); + if (sDisplayMetrics == null) { + sDisplayMetrics = new DisplayMetrics(); + WindowManager windowManager = (WindowManager) appContext + .getSystemService(Context.WINDOW_SERVICE); + Display defaultDisplay = windowManager.getDefaultDisplay(); + defaultDisplay.getRealMetrics(sDisplayMetrics); } - return sMetrics; } + public static DisplayMetrics getMetrics() { + return sDisplayMetrics; + } + + /** Set display metrics, call by host app */ + @SuppressWarnings("unused") + public static void setDisplayMetrics(DisplayMetrics metrics) { + sDisplayMetrics = metrics; + } + /** Convert from dp to px impl */ public static float dp2px(float value) { - return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, getMetrics()); + if (sDisplayMetrics == null) { + return value; + } + return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, sDisplayMetrics); } + /** Convert from dp to px */ public static float dp2px(double value) { return dp2px((float) value); } + /** Convert from px to dp */ public static float px2dp(float value) { - return value / getMetrics().density; - } - - public static float sp2px(float value) { - return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, value, getMetrics()); - } - - public static float px2sp(float value) { - return value / getMetrics().scaledDensity; + return value / getDensity(); } public static float getDensity() { - return getMetrics().density; + if (sDisplayMetrics == null) { + return 1.0f; + } + return sDisplayMetrics.density; } }