22
33import android .app .Activity ;
44import android .app .KeyguardManager ;
5+ import android .content .ComponentCallbacks ;
56import android .content .Context ;
67import android .content .pm .ActivityInfo ;
78import android .content .res .Configuration ;
1314import android .support .annotation .NonNull ;
1415import android .support .annotation .RequiresPermission ;
1516import android .util .DisplayMetrics ;
17+ import android .util .Log ;
1618import android .view .Surface ;
1719import android .view .View ;
1820import android .view .Window ;
@@ -303,7 +305,7 @@ public static boolean isTablet() {
303305 * the designWidthInDp = 720 / 2.
304306 */
305307 public static void adaptScreen4VerticalSlide (final Activity activity ,
306- final int designWidthInDp ) {
308+ final float designWidthInDp ) {
307309 adaptScreen (activity , designWidthInDp , true );
308310 }
309311
@@ -315,7 +317,7 @@ public static void adaptScreen4VerticalSlide(final Activity activity,
315317 * the designHeightInDp = 1080 / 3.
316318 */
317319 public static void adaptScreen4HorizontalSlide (final Activity activity ,
318- final int designHeightInDp ) {
320+ final float designHeightInDp ) {
319321 adaptScreen (activity , designHeightInDp , false );
320322 }
321323
@@ -325,27 +327,55 @@ public static void adaptScreen4HorizontalSlide(final Activity activity,
325327 * @param activity The activity.
326328 */
327329 public static void cancelAdaptScreen (final Activity activity ) {
328- final DisplayMetrics appDm = Utils .getApp ().getResources ().getDisplayMetrics ();
329330 final DisplayMetrics activityDm = activity .getResources ().getDisplayMetrics ();
330- activityDm .density = appDm .density ;
331- activityDm .scaledDensity = appDm .scaledDensity ;
332- activityDm .densityDpi = appDm .densityDpi ;
331+ if (UDM .densityDpi != -1 ) {
332+ activityDm .density = UDM .density ;
333+ activityDm .scaledDensity = UDM .scaledDensity ;
334+ activityDm .densityDpi = UDM .densityDpi ;
335+ } else {
336+ Log .i ("ScreenUtils" , "U should adapt screen first." );
337+ }
333338 }
334339
340+
335341 /**
336342 * Reference from: https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA
337343 */
338344 private static void adaptScreen (final Activity activity ,
339345 final float sizeInDp ,
340346 final boolean isVerticalSlide ) {
341- final DisplayMetrics appDm = Utils .getApp ().getResources ().getDisplayMetrics ();
342347 final DisplayMetrics activityDm = activity .getResources ().getDisplayMetrics ();
348+ if (UDM .densityDpi == -1 ) {
349+ UDM .density = activityDm .density ;
350+ UDM .scaledDensity = activityDm .scaledDensity ;
351+ UDM .densityDpi = activityDm .densityDpi ;
352+ Utils .getApp ().registerComponentCallbacks (new ComponentCallbacks () {
353+ @ Override
354+ public void onConfigurationChanged (Configuration newConfig ) {
355+ if (newConfig != null && newConfig .fontScale > 0 ) {
356+ UDM .scaledDensity =
357+ Utils .getApp ().getResources ().getDisplayMetrics ().scaledDensity ;
358+ }
359+ }
360+
361+ @ Override
362+ public void onLowMemory () {/**/ }
363+ });
364+ }
343365 if (isVerticalSlide ) {
344366 activityDm .density = activityDm .widthPixels / sizeInDp ;
345367 } else {
346368 activityDm .density = activityDm .heightPixels / sizeInDp ;
347369 }
348- activityDm .scaledDensity = activityDm .density * (appDm .scaledDensity / appDm .density );
370+ activityDm .scaledDensity = activityDm .density * (UDM .scaledDensity / UDM .density );
349371 activityDm .densityDpi = (int ) (160 * activityDm .density );
350372 }
373+
374+ private static final UtilDisplayMetrics UDM = new UtilDisplayMetrics ();
375+
376+ private static class UtilDisplayMetrics {
377+ float density ;
378+ float scaledDensity ;
379+ int densityDpi = -1 ;
380+ }
351381}
0 commit comments