22
33import android .content .res .Resources ;
44import android .util .DisplayMetrics ;
5+ import android .util .Log ;
6+
7+ import java .lang .reflect .Field ;
58
69
710public final class AdaptScreenUtils {
811
12+ private static boolean firstFlag = true ;
13+ private static Field mTmpMetrics ;
14+
915 private static DisplayMetrics appDm ;
1016
1117 /**
1218 * Adapt for the horizontal screen, and call it in [android.app.Activity.getResources].
1319 */
1420 public static Resources adaptWidth (Resources resources , int designWidth ) {
15- DisplayMetrics dm = resources . getDisplayMetrics ();
21+ DisplayMetrics dm = getDisplayMetrics (resources );
1622 float newXdpi = dm .xdpi = (dm .widthPixels * 72f ) / designWidth ;
1723 setAppDmXdpi (newXdpi );
1824 return resources ;
@@ -22,7 +28,7 @@ public static Resources adaptWidth(Resources resources, int designWidth) {
2228 * Adapt for the vertical screen, and call it in [android.app.Activity.getResources].
2329 */
2430 public static Resources adaptHeight (Resources resources , int designHeight ) {
25- DisplayMetrics dm = resources . getDisplayMetrics ();
31+ DisplayMetrics dm = getDisplayMetrics (resources );
2632 float newXdpi = dm .xdpi = (dm .heightPixels * 72f ) / designHeight ;
2733 setAppDmXdpi (newXdpi );
2834 return resources ;
@@ -33,7 +39,7 @@ public static Resources adaptHeight(Resources resources, int designHeight) {
3339 * @return the resource
3440 */
3541 public static Resources closeAdapt (Resources resources ) {
36- DisplayMetrics dm = resources . getDisplayMetrics ();
42+ DisplayMetrics dm = getDisplayMetrics (resources );
3743 float newXdpi = dm .xdpi = dm .density * 72 ;
3844 setAppDmXdpi (newXdpi );
3945 return resources ;
@@ -67,4 +73,34 @@ private static void setAppDmXdpi(final float xdpi) {
6773 }
6874 appDm .xdpi = xdpi ;
6975 }
76+
77+ private static DisplayMetrics getDisplayMetrics (Resources resources ) {
78+ DisplayMetrics miuiDisplayMetrics = getMiuiTmpMetrics (resources );
79+ if (miuiDisplayMetrics == null ) return resources .getDisplayMetrics ();
80+ return miuiDisplayMetrics ;
81+ }
82+
83+ private static DisplayMetrics getMiuiTmpMetrics (Resources resources ) {
84+ if (firstFlag ) {
85+ DisplayMetrics ret = null ;
86+ String simpleName = resources .getClass ().getSimpleName ();
87+ if ("MiuiResources" .equals (simpleName ) || "XResources" .equals (simpleName )) {
88+ try {
89+ mTmpMetrics = Resources .class .getDeclaredField ("mTmpMetrics" );
90+ mTmpMetrics .setAccessible (true );
91+ ret = (DisplayMetrics ) mTmpMetrics .get (resources );
92+ } catch (Exception e ) {
93+ Log .e ("AdaptScreenUtils" , "no field of mTmpMetrics in resources." );
94+ }
95+ }
96+ firstFlag = false ;
97+ return ret ;
98+ }
99+ if (mTmpMetrics == null ) return null ;
100+ try {
101+ return (DisplayMetrics ) mTmpMetrics .get (resources );
102+ } catch (Exception e ) {
103+ return null ;
104+ }
105+ }
70106}
0 commit comments