react-native-navigation的迁移库

ViewUtils.java 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package com.reactnativenavigation.utils;
  2. import android.content.Context;
  3. import android.graphics.PorterDuff;
  4. import android.graphics.PorterDuffColorFilter;
  5. import android.graphics.drawable.Drawable;
  6. import android.os.Build;
  7. import android.util.DisplayMetrics;
  8. import android.view.View;
  9. import android.view.ViewTreeObserver;
  10. import android.view.WindowManager;
  11. import com.reactnativenavigation.NavigationApplication;
  12. import com.reactnativenavigation.params.AppStyle;
  13. import java.util.concurrent.atomic.AtomicInteger;
  14. public class ViewUtils {
  15. private static final AtomicInteger viewId = new AtomicInteger(1);
  16. public static void runOnPreDraw(final View view, final Runnable task) {
  17. view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
  18. @Override
  19. public boolean onPreDraw() {
  20. if (!view.getViewTreeObserver().isAlive()) {
  21. return true;
  22. }
  23. view.getViewTreeObserver().removeOnPreDrawListener(this);
  24. task.run();
  25. return true;
  26. }
  27. });
  28. }
  29. public static void tintDrawable(Drawable drawable, int tint, boolean enabled) {
  30. drawable.setColorFilter(new PorterDuffColorFilter(enabled ? tint :
  31. AppStyle.appStyle.titleBarDisabledButtonColor.getColor(),
  32. PorterDuff.Mode.SRC_IN));
  33. }
  34. public static float convertDpToPixel(float dp) {
  35. float scale = NavigationApplication.instance.getResources().getDisplayMetrics().density;
  36. return dp * scale + 0.5f;
  37. }
  38. public static int generateViewId() {
  39. if (Build.VERSION.SDK_INT >= 17) {
  40. return View.generateViewId();
  41. } else {
  42. return compatGenerateViewId();
  43. }
  44. }
  45. public static float getScreenHeight() {
  46. WindowManager wm = (WindowManager) NavigationApplication.instance.getSystemService(Context.WINDOW_SERVICE);
  47. DisplayMetrics metrics = new DisplayMetrics();
  48. wm.getDefaultDisplay().getMetrics(metrics);
  49. return metrics.heightPixels;
  50. }
  51. private static int compatGenerateViewId() {
  52. for (; ; ) {
  53. final int result = viewId.get();
  54. // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
  55. int newValue = result + 1;
  56. if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
  57. if (viewId.compareAndSet(result, newValue)) {
  58. return result;
  59. }
  60. }
  61. }
  62. }