5
5
import android .util .Log ;
6
6
7
7
import java .lang .reflect .Field ;
8
+ import java .util .ArrayList ;
9
+ import java .util .List ;
8
10
9
11
10
12
public final class AdaptScreenUtils {
11
13
12
- private static boolean sIsInit ;
13
- private static Field sMetricsField ;
14
+ private static List <Field > sMetricsFields ;
14
15
15
16
/**
16
17
* Adapt for the horizontal screen, and call it in [android.app.Activity.getResources].
17
18
*/
18
- public static Resources adaptWidth (Resources resources , int designWidth ) {
19
- DisplayMetrics dm = getDisplayMetrics (resources );
20
- float newXdpi = dm .xdpi = (dm .widthPixels * 72f ) / designWidth ;
21
- setAppDmXdpi (newXdpi );
19
+ public static Resources adaptWidth (final Resources resources , final int designWidth ) {
20
+ float newXdpi = (Resources .getSystem ().getDisplayMetrics ().widthPixels * 72f ) / designWidth ;
21
+ applyDisplayMetrics (resources , newXdpi );
22
22
return resources ;
23
23
}
24
24
25
25
/**
26
26
* Adapt for the vertical screen, and call it in [android.app.Activity.getResources].
27
27
*/
28
- public static Resources adaptHeight (Resources resources , int designHeight ) {
29
- DisplayMetrics dm = getDisplayMetrics (resources );
30
- float newXdpi = dm .xdpi = (dm .heightPixels * 72f ) / designHeight ;
31
- setAppDmXdpi (newXdpi );
28
+ public static Resources adaptHeight (final Resources resources , final int designHeight ) {
29
+ float newXdpi = (Resources .getSystem ().getDisplayMetrics ().heightPixels * 72f ) / designHeight ;
30
+ applyDisplayMetrics (resources , newXdpi );
32
31
return resources ;
33
32
}
34
33
35
34
/**
36
35
* @param resources The resources.
37
36
* @return the resource
38
37
*/
39
- public static Resources closeAdapt (Resources resources ) {
40
- DisplayMetrics dm = getDisplayMetrics (resources );
41
- float newXdpi = dm .xdpi = dm .density * 72 ;
42
- setAppDmXdpi (newXdpi );
38
+ public static Resources closeAdapt (final Resources resources ) {
39
+ float newXdpi = Resources .getSystem ().getDisplayMetrics ().density * 72f ;
40
+ applyDisplayMetrics (resources , newXdpi );
43
41
return resources ;
44
42
}
45
43
@@ -49,7 +47,7 @@ public static Resources closeAdapt(Resources resources) {
49
47
* @param ptValue The value of pt.
50
48
* @return value of px
51
49
*/
52
- public static int pt2Px (float ptValue ) {
50
+ public static int pt2Px (final float ptValue ) {
53
51
DisplayMetrics metrics = Utils .getApp ().getResources ().getDisplayMetrics ();
54
52
return (int ) (ptValue * metrics .xdpi / 72f + 0.5 );
55
53
}
@@ -60,33 +58,31 @@ public static int pt2Px(float ptValue) {
60
58
* @param pxValue The value of px.
61
59
* @return value of pt
62
60
*/
63
- public static int px2Pt (float pxValue ) {
61
+ public static int px2Pt (final float pxValue ) {
64
62
DisplayMetrics metrics = Utils .getApp ().getResources ().getDisplayMetrics ();
65
63
return (int ) (pxValue * 72 / metrics .xdpi + 0.5 );
66
64
}
67
65
68
- private static void setAppDmXdpi (final float xdpi ) {
69
- Utils .getApp ().getResources ().getDisplayMetrics ().xdpi = xdpi ;
66
+ private static void applyDisplayMetrics (final Resources resources , final float newXdpi ) {
67
+ resources .getDisplayMetrics ().xdpi = newXdpi ;
68
+ Utils .getApp ().getResources ().getDisplayMetrics ().xdpi = newXdpi ;
69
+ applyOtherDisplayMetrics (resources , newXdpi );
70
70
}
71
71
72
- private static DisplayMetrics getDisplayMetrics (Resources resources ) {
73
- DisplayMetrics realMetrics = getRealMetrics (resources );
74
- if (realMetrics != null ) return realMetrics ;
75
- return resources .getDisplayMetrics ();
76
- }
77
-
78
- private static DisplayMetrics getRealMetrics (final Resources resources ) {
79
- if (!sIsInit ) {
80
- DisplayMetrics ret = null ;
72
+ private static void applyOtherDisplayMetrics (final Resources resources , final float newXdpi ) {
73
+ if (sMetricsFields == null ) {
74
+ sMetricsFields = new ArrayList <>();
81
75
Class resCls = resources .getClass ();
82
76
Field [] declaredFields = resCls .getDeclaredFields ();
83
- while (ret == null && declaredFields != null && declaredFields .length > 0 ) {
77
+ while (declaredFields != null && declaredFields .length > 0 ) {
84
78
for (Field field : declaredFields ) {
85
79
if (field .getType ().isAssignableFrom (DisplayMetrics .class )) {
86
80
field .setAccessible (true );
87
- sMetricsField = field ;
88
- ret = getMetricsFromField (resources );
89
- if (ret != null ) break ;
81
+ DisplayMetrics tmpDm = getMetricsFromField (resources , field );
82
+ if (tmpDm != null ) {
83
+ sMetricsFields .add (field );
84
+ tmpDm .xdpi = newXdpi ;
85
+ }
90
86
}
91
87
}
92
88
resCls = resCls .getSuperclass ();
@@ -96,16 +92,25 @@ private static DisplayMetrics getRealMetrics(final Resources resources) {
96
92
break ;
97
93
}
98
94
}
99
- sIsInit = true ;
100
- return ret ;
95
+ } else {
96
+ applyMetricsFields (resources , newXdpi );
97
+ }
98
+ }
99
+
100
+ private static void applyMetricsFields (final Resources resources , final float newXdpi ) {
101
+ for (Field metricsField : sMetricsFields ) {
102
+ try {
103
+ DisplayMetrics dm = (DisplayMetrics ) metricsField .get (resources );
104
+ if (dm != null ) dm .xdpi = newXdpi ;
105
+ } catch (Exception e ) {
106
+ Log .e ("AdaptScreenUtils" , "applyMetricsFields: " + e );
107
+ }
101
108
}
102
- if (sMetricsField == null ) return null ;
103
- return getMetricsFromField (resources );
104
109
}
105
110
106
- private static DisplayMetrics getMetricsFromField (final Resources resources ) {
111
+ private static DisplayMetrics getMetricsFromField (final Resources resources , final Field field ) {
107
112
try {
108
- return (DisplayMetrics ) sMetricsField .get (resources );
113
+ return (DisplayMetrics ) field .get (resources );
109
114
} catch (Exception e ) {
110
115
Log .e ("AdaptScreenUtils" , "getMetricsFromField: " + e );
111
116
return null ;
0 commit comments