react-native-navigation的迁移库

UiUtils.java 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package com.reactnativenavigation.utils;
  2. import android.content.Context;
  3. import android.content.res.Resources;
  4. import android.os.Handler;
  5. import android.os.Looper;
  6. import android.util.DisplayMetrics;
  7. import android.view.View;
  8. import android.view.ViewTreeObserver;
  9. import android.view.WindowManager;
  10. import androidx.annotation.NonNull;
  11. import androidx.annotation.Nullable;
  12. public class UiUtils {
  13. private static final int DEFAULT_TOOLBAR_HEIGHT = 56;
  14. private static int topBarHeight = -1;
  15. public static <T extends View> void runOnPreDrawOnce(@Nullable final T view, final Functions.Func1<T> task) {
  16. if (view == null) return;
  17. runOnPreDrawOnce(view, () -> task.run(view));
  18. }
  19. public static void runOnPreDrawOnce(@Nullable final View view, final Runnable task) {
  20. if (view == null) return;
  21. view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
  22. @Override
  23. public boolean onPreDraw() {
  24. view.getViewTreeObserver().removeOnPreDrawListener(this);
  25. task.run();
  26. return true;
  27. }
  28. });
  29. }
  30. public static void doOnLayout(@Nullable final View view, final Runnable task) {
  31. if (view == null) return;
  32. view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
  33. @Override
  34. public void onGlobalLayout() {
  35. view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
  36. task.run();
  37. }
  38. });
  39. }
  40. public static void runOnMeasured(View view, Runnable task) {
  41. if (view.getHeight() > 0 && view.getWidth() > 0) {
  42. task.run();
  43. } else {
  44. view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
  45. @Override
  46. public void onGlobalLayout() {
  47. if (view.getHeight() > 0 && view.getWidth() > 0) {
  48. view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
  49. task.run();
  50. }
  51. }
  52. });
  53. }
  54. }
  55. public static void runOnMainThread(Runnable runnable) {
  56. new Handler(Looper.getMainLooper()).post(runnable);
  57. }
  58. public static float getWindowHeight(Context context) {
  59. return getDisplayMetrics(context).heightPixels;
  60. }
  61. public static float getWindowWidth(Context context) {
  62. return getDisplayMetrics(context).widthPixels;
  63. }
  64. @NonNull
  65. private static DisplayMetrics getDisplayMetrics(Context context) {
  66. DisplayMetrics metrics = new DisplayMetrics();
  67. WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
  68. if (windowManager != null) {
  69. windowManager.getDefaultDisplay().getMetrics(metrics);
  70. }
  71. return metrics;
  72. }
  73. public static int getTopBarHeightDp(Context context) {
  74. return (int) UiUtils.pxToDp(context, getTopBarHeight(context));
  75. }
  76. public static int getTopBarHeight(Context context) {
  77. if (topBarHeight > 0) {
  78. return topBarHeight;
  79. }
  80. final Resources resources = context.getResources();
  81. final int resourceId = resources.getIdentifier("action_bar_size", "dimen", "android");
  82. topBarHeight = resourceId > 0 ?
  83. resources.getDimensionPixelSize(resourceId) :
  84. dpToPx(context, DEFAULT_TOOLBAR_HEIGHT);
  85. return topBarHeight;
  86. }
  87. public static float dpToPx(Context context, float dp) {
  88. Resources resources = context.getResources();
  89. DisplayMetrics metrics = resources.getDisplayMetrics();
  90. return dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
  91. }
  92. public static int dpToPx(Context context, int dp) {
  93. if (dp <= 0) return dp;
  94. Resources resources = context.getResources();
  95. DisplayMetrics metrics = resources.getDisplayMetrics();
  96. return (int) (dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT));
  97. }
  98. public static float pxToDp(Context context, float px) {
  99. return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
  100. }
  101. public static float dpToSp(Context context, float dp) {
  102. return dpToPx(context, dp) / context.getResources().getDisplayMetrics().density;
  103. }
  104. }