2
2
3
3
import android .content .res .Resources ;
4
4
import android .util .DisplayMetrics ;
5
+ import android .util .Log ;
6
+
7
+ import java .lang .reflect .Field ;
5
8
6
9
7
10
public final class AdaptScreenUtils {
8
11
12
+ private static boolean firstFlag = true ;
13
+ private static Field mTmpMetrics ;
14
+
9
15
private static DisplayMetrics appDm ;
10
16
11
17
/**
12
18
* Adapt for the horizontal screen, and call it in [android.app.Activity.getResources].
13
19
*/
14
20
public static Resources adaptWidth (Resources resources , int designWidth ) {
15
- DisplayMetrics dm = resources . getDisplayMetrics ();
21
+ DisplayMetrics dm = getDisplayMetrics (resources );
16
22
float newXdpi = dm .xdpi = (dm .widthPixels * 72f ) / designWidth ;
17
23
setAppDmXdpi (newXdpi );
18
24
return resources ;
@@ -22,7 +28,7 @@ public static Resources adaptWidth(Resources resources, int designWidth) {
22
28
* Adapt for the vertical screen, and call it in [android.app.Activity.getResources].
23
29
*/
24
30
public static Resources adaptHeight (Resources resources , int designHeight ) {
25
- DisplayMetrics dm = resources . getDisplayMetrics ();
31
+ DisplayMetrics dm = getDisplayMetrics (resources );
26
32
float newXdpi = dm .xdpi = (dm .heightPixels * 72f ) / designHeight ;
27
33
setAppDmXdpi (newXdpi );
28
34
return resources ;
@@ -33,7 +39,7 @@ public static Resources adaptHeight(Resources resources, int designHeight) {
33
39
* @return the resource
34
40
*/
35
41
public static Resources closeAdapt (Resources resources ) {
36
- DisplayMetrics dm = resources . getDisplayMetrics ();
42
+ DisplayMetrics dm = getDisplayMetrics (resources );
37
43
float newXdpi = dm .xdpi = dm .density * 72 ;
38
44
setAppDmXdpi (newXdpi );
39
45
return resources ;
@@ -67,4 +73,34 @@ private static void setAppDmXdpi(final float xdpi) {
67
73
}
68
74
appDm .xdpi = xdpi ;
69
75
}
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
+ }
70
106
}
0 commit comments