|
19 | 19 | import android.content.res.Configuration; |
20 | 20 | import android.content.res.Resources; |
21 | 21 | import android.util.DisplayMetrics; |
22 | | - |
23 | | -import java.util.Map; |
24 | | -import java.util.concurrent.ConcurrentHashMap; |
| 22 | +import android.util.SparseArray; |
25 | 23 |
|
26 | 24 | import me.jessyan.autosize.external.ExternalAdaptInfo; |
27 | 25 | import me.jessyan.autosize.external.ExternalAdaptManager; |
|
39 | 37 | * ================================================ |
40 | 38 | */ |
41 | 39 | public final class AutoSizeCompat { |
42 | | - private static Map<String, DisplayMetricsInfo> mCache = new ConcurrentHashMap<>(); |
| 40 | + private static SparseArray<DisplayMetricsInfo> mCache = new SparseArray<>(); |
| 41 | + private static final int MODE_SHIFT = 30; |
| 42 | + private static final int MODE_MASK = 0x3 << MODE_SHIFT; |
| 43 | + private static final int MODE_ON_WIDTH = 1 << MODE_SHIFT; |
| 44 | + private static final int MODE_DEVICE_SIZE = 2 << MODE_SHIFT; |
43 | 45 |
|
44 | 46 | private AutoSizeCompat() { |
45 | 47 | throw new IllegalStateException("you can't instantiate me!"); |
@@ -134,17 +136,18 @@ public static void autoConvertDensityBaseOnHeight(Resources resources, float des |
134 | 136 | */ |
135 | 137 | public static void autoConvertDensity(Resources resources, float sizeInDp, boolean isBaseOnWidth) { |
136 | 138 | Preconditions.checkNotNull(resources, "resources == null"); |
| 139 | + Preconditions.checkMainThread(); |
137 | 140 |
|
138 | 141 | float subunitsDesignSize = isBaseOnWidth ? AutoSizeConfig.getInstance().getUnitsManager().getDesignWidth() |
139 | 142 | : AutoSizeConfig.getInstance().getUnitsManager().getDesignHeight(); |
140 | 143 | subunitsDesignSize = subunitsDesignSize > 0 ? subunitsDesignSize : sizeInDp; |
141 | 144 |
|
142 | 145 | int screenSize = isBaseOnWidth ? AutoSizeConfig.getInstance().getScreenWidth() |
143 | 146 | : AutoSizeConfig.getInstance().getScreenHeight(); |
144 | | - String key = sizeInDp + "|" + subunitsDesignSize + "|" + isBaseOnWidth + "|" |
145 | | - + AutoSizeConfig.getInstance().isUseDeviceSize() + "|" |
146 | | - + AutoSizeConfig.getInstance().getInitScaledDensity() + "|" |
147 | | - + screenSize; |
| 147 | + |
| 148 | + int key = Math.round(sizeInDp + subunitsDesignSize + AutoSizeConfig.getInstance().getInitScaledDensity() + screenSize) & ~MODE_MASK; |
| 149 | + key = isBaseOnWidth ? (key | MODE_ON_WIDTH) : (key & ~MODE_ON_WIDTH); |
| 150 | + key = AutoSizeConfig.getInstance().isUseDeviceSize() ? (key | MODE_DEVICE_SIZE) : (key & ~MODE_DEVICE_SIZE); |
148 | 151 |
|
149 | 152 | DisplayMetricsInfo displayMetricsInfo = mCache.get(key); |
150 | 153 |
|
@@ -199,6 +202,7 @@ public static void autoConvertDensity(Resources resources, float sizeInDp, boole |
199 | 202 | * @param resources {@link Resources} |
200 | 203 | */ |
201 | 204 | public static void cancelAdapt(Resources resources) { |
| 205 | + Preconditions.checkMainThread(); |
202 | 206 | float initXdpi = AutoSizeConfig.getInstance().getInitXdpi(); |
203 | 207 | switch (AutoSizeConfig.getInstance().getUnitsManager().getSupportSubunits()) { |
204 | 208 | case PT: |
|
0 commit comments