关于android沉浸式状态栏功能

关于android 沉浸式状态栏网上有很多介绍,但是基本都是一些自己随手写一写的东西,我也不多说了,直接把项目里的代码拿过来给大家用


/**
 * Utils for status bar
 * Created by qiu on 3/29/16.
 */
public class StatusBarCompat {

    public static void setStatusBarColor(boolean isSetPadding, Activity activity, int statusColor) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            StatusBarCompatLollipop.setStatusBarColor(activity, statusColor);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            StatusBarCompatKitKat.setStatusBarColor(isSetPadding,activity, statusColor);
        }
    }
    public static void translucentStatusBar(Activity activity) {
        translucentStatusBar(activity, false);
    }

    /**
     * change to full screen mode
     * @param hideStatusBarBackground hide status bar alpha Background when SDK > 21, true if hide it
     */
    public static void translucentStatusBar(Activity activity, boolean hideStatusBarBackground) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            StatusBarCompatLollipop.translucentStatusBar(activity, hideStatusBarBackground);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            StatusBarCompatKitKat.translucentStatusBar(activity);
        }
    }
}

提供给外部调用的utils  调用方法简单   此方法必须在setContentView 之后调用  例如

setContentView(R.layout.activity_main);
StatusBarCompat.setStatusBarColor(false,this,getColor(R.color.blue));
这个是蓝色的状态栏


如果想要透明状态栏的话调用

setContentView(R.layout.activity_main);
StatusBarCompat.translucentStatusBar(this,true);


下面是一些相应的工具类


/**
 * After kitkat add fake status bar
 * Created by qiu on 8/27/16.
 */
@TargetApi(Build.VERSION_CODES.KITKAT)
public class StatusBarCompatKitKat {

    private static final String TAG_FAKE_STATUS_BAR_VIEW = "statusBarView";
    private static final String TAG_MARGIN_ADDED = "marginAdded";

    /**
     * return statusBar's Height in pixels
     */
    private static int getStatusBarHeight(Context context) {
        int result = 0;
        int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resId > 0) {
            result = context.getResources().getDimensionPixelOffset(resId);
        }
        return result;
    }

    /**
     * 1. Add fake statusBarView.
     * 2. set tag to statusBarView.
     */
    private static View addFakeStatusBarView(Activity activity, int statusBarColor, int statusBarHeight) {
        Window window = activity.getWindow();
        ViewGroup mDecorView = (ViewGroup) window.getDecorView();

        View mStatusBarView = new View(activity);
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight);
        layoutParams.gravity = Gravity.TOP;
        mStatusBarView.setLayoutParams(layoutParams);
        mStatusBarView.setBackgroundColor(statusBarColor);
        mStatusBarView.setTag(TAG_FAKE_STATUS_BAR_VIEW);

        mDecorView.addView(mStatusBarView);
        return mStatusBarView;
    }

    /**
     * add marginTop to simulate set FitsSystemWindow true
     */
    private static void addMarginTopToContentChild(View mContentChild, int statusBarHeight) {
        if (mContentChild == null) {
            return;
        }
        if (!TAG_MARGIN_ADDED.equals(mContentChild.getTag())) {
            FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mContentChild.getLayoutParams();
            lp.topMargin += statusBarHeight;
            mContentChild.setLayoutParams(lp);
            mContentChild.setTag(TAG_MARGIN_ADDED);
        }
    }

    /**
     * remove marginTop to simulate set FitsSystemWindow false
     */
    private static void removeMarginTopOfContentChild(View mContentChild, int statusBarHeight) {
        if (mContentChild == null) {
            return;
        }
        if (TAG_MARGIN_ADDED.equals(mContentChild.getTag())) {
            FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mContentChild.getLayoutParams();
            lp.topMargin -= statusBarHeight;
            mContentChild.setLayoutParams(lp);
            mContentChild.setTag(null);
        }
    }

    /**
     * use reserved order to remove is more quickly.
     */
    private static void removeFakeStatusBarViewIfExist(Activity activity) {
        Window window = activity.getWindow();
        ViewGroup mDecorView = (ViewGroup) window.getDecorView();

        View fakeView = mDecorView.findViewWithTag(TAG_FAKE_STATUS_BAR_VIEW);
        if (fakeView != null) {
            mDecorView.removeView(fakeView);
        }
    }

    /**
     * set StatusBarColor
     * 1. set Window Flag : WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
     * 2. removeFakeStatusBarViewIfExist
     * 3. addFakeStatusBarView
     * 4. addMarginTopToContentChild
     * 5. cancel ContentChild's fitsSystemWindow
     */
    public static void setStatusBarColor(boolean isSetPadding,Activity activity, int statusColor) {
        Window window = activity.getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);


        ViewGroup mContentView = (ViewGroup) window.findViewById(Window.ID_ANDROID_CONTENT);
        View mContentChild = mContentView.getChildAt(0);
        int statusBarHeight = getStatusBarHeight(activity);

        removeFakeStatusBarViewIfExist(activity);
        addFakeStatusBarView(activity, statusColor, statusBarHeight);
        addMarginTopToContentChild(mContentChild, statusBarHeight);

        if (mContentChild != null) {
            ViewCompat.setFitsSystemWindows(mContentChild, false);
        }
        SystemBarTintManager tintManager = new SystemBarTintManager(activity,0x00000000);
        tintManager.setStatusBarTintEnabled(true);
        SystemBarTintManager.SystemBarConfig config = tintManager.getConfig();
        if (isSetPadding) {
            activity.findViewById(android.R.id.content).setPadding(0, config.getActionBarHeight(), 0, 0);
        } else {
            activity.findViewById(android.R.id.content).setPadding(0, 0, 0, 0);
        }
    }

    /**
     * translucentStatusBar
     * 1. set Window Flag : WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
     * 2. removeFakeStatusBarViewIfExist
     * 3. removeMarginTopOfContentChild
     * 4. cancel ContentChild's fitsSystemWindow
     */
    public static void translucentStatusBar(Activity activity) {
        Window window = activity.getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

        ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);
        View mContentChild = mContentView.getChildAt(0);

        removeFakeStatusBarViewIfExist(activity);
        removeMarginTopOfContentChild(mContentChild, getStatusBarHeight(activity));
        if (mContentChild != null) {
            ViewCompat.setFitsSystemWindows(mContentChild, false);
        }
        ViewGroup decorViewGroup = (ViewGroup) window.getDecorView();
        View mStatusBarTintView = decorViewGroup.findViewWithTag("mStatusBarTintView");
        if (null!=mStatusBarTintView) {
            decorViewGroup.removeView(mStatusBarTintView);
        }
    }

}



/**
 * After Lollipop use system method.
 * Created by qiu on 8/27/16.
 */
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class StatusBarCompatLollipop {

    /**
     * set StatusBarColor
     */
    public static void setStatusBarColor(Activity activity, int statusColor) {
        Window window = activity.getWindow();

        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(statusColor);
        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);

        ViewGroup mContentView = (ViewGroup) window.findViewById(Window.ID_ANDROID_CONTENT);
        View mChildView = mContentView.getChildAt(0);
        if (mChildView != null) {
            ViewCompat.setOnApplyWindowInsetsListener(mChildView, new OnApplyWindowInsetsListener() {
                @Override
                public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
                    return insets;
                }
            });
            ViewCompat.setFitsSystemWindows(mChildView, true);
            ViewCompat.requestApplyInsets(mChildView);
        }
    }

    /**
     * translucentStatusBar(full-screen)
     * @param hideStatusBarBackground hide statusBar's shadow
     */
    public static void translucentStatusBar(Activity activity, boolean hideStatusBarBackground) {
        Window window = activity.getWindow();

        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        if (hideStatusBarBackground) {
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.setStatusBarColor(Color.TRANSPARENT);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        } else {
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
        }

        ViewGroup mContentView = (ViewGroup) window.findViewById(Window.ID_ANDROID_CONTENT);
        View mChildView = mContentView.getChildAt(0);
        if (mChildView != null) {
            ViewCompat.setOnApplyWindowInsetsListener(mChildView, new OnApplyWindowInsetsListener() {
                @Override
                public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
                    return insets;
                }
            });
            ViewCompat.setFitsSystemWindows(mChildView, false);
            ViewCompat.requestApplyInsets(mChildView);
        }
    }

}




/**
 * Class to manage status and navigation bar tint effects when using KitKat
 * translucent system UI modes.
 * 
 */
@SuppressWarnings({ "unchecked", "rawtypes" })
public class SystemBarTintManager {

   static {
      // Android allows a system property to override the presence of the
      // navigation bar.
      // Used by the emulator.
      // See
      // https://github.com/android/platform_frameworks_base/blob/master/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java#L1076
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
         try {
            Class c = Class.forName("android.os.SystemProperties");
            Method m = c.getDeclaredMethod("get", String.class);
            m.setAccessible(true);
            sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");
         } catch (Throwable e) {
            sNavBarOverride = null;
         }
      }
   }

   /**
    * The default system bar tint color value.
    */

   public static final int DEFAULT_TINT_COLOR = 0x80000000;

   private static String sNavBarOverride;

   private final SystemBarConfig mConfig;
   private boolean mStatusBarAvailable;
   private boolean mNavBarAvailable;
   private boolean mStatusBarTintEnabled;
   private boolean mNavBarTintEnabled;
   private View mStatusBarTintView;
   private View mNavBarTintView;

   /**
    * Constructor. Call this in the host activity onCreate method after its
    * content view has been set. You should always create new instances when
    * the host activity is recreated.
    * 
    * @param activity
    *            The host activity.
    */
   @TargetApi(19)
   public SystemBarTintManager(Activity activity, int color) {

      Window win = activity.getWindow();
      ViewGroup decorViewGroup = (ViewGroup) win.getDecorView();

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
         // check theme attrs
         int[] attrs = { android.R.attr.windowTranslucentStatus,
               android.R.attr.windowTranslucentNavigation };
         TypedArray a = activity.obtainStyledAttributes(attrs);
         try {
            mStatusBarAvailable = a.getBoolean(0, false);
            mNavBarAvailable = a.getBoolean(1, false);
         } finally {
            a.recycle();
         }

         // check window flags
         WindowManager.LayoutParams winParams = win.getAttributes();
         int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
         if ((winParams.flags & bits) != 0) {
            mStatusBarAvailable = true;
         }
         bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
         if ((winParams.flags & bits) != 0) {
            mNavBarAvailable = true;
         }
      }

      mConfig = new SystemBarConfig(activity, mStatusBarAvailable,
            mNavBarAvailable);
      // device might not have virtual navigation keys
      if (!mConfig.hasNavigtionBar()) {
         mNavBarAvailable = false;
      }

      if (mStatusBarAvailable) {
         View mStatusBarTintView = decorViewGroup.findViewWithTag("mStatusBarTintView");
         if ( null!= mStatusBarTintView) {
            decorViewGroup.removeView(mStatusBarTintView);
         }
         setupStatusBarView(activity, decorViewGroup, color);
      }
      if (mNavBarAvailable) {
         setupNavBarView(activity, decorViewGroup);
      }

   }

   /**
    * Enable tinting of the system status bar.
    * 
    * If the platform is running Jelly Bean or earlier, or translucent system
    * UI modes have not been enabled in either the theme or via window flags,
    * then this method does nothing.
    * 
    * @param enabled
    *            True to enable tinting, false to disable it (default).
    */
   public void setStatusBarTintEnabled(boolean enabled) {
      mStatusBarTintEnabled = enabled;
      if (mStatusBarAvailable && null!=mStatusBarTintView ) {
         mStatusBarTintView
               .setVisibility(enabled ? View.VISIBLE : View.GONE);
      }
   }

   /**
    * Enable tinting of the system navigation bar.
    * 
    * If the platform does not have soft navigation keys, is running Jelly Bean
    * or earlier, or translucent system UI modes have not been enabled in
    * either the theme or via window flags, then this method does nothing.
    * 
    * @param enabled
    *            True to enable tinting, false to disable it (default).
    */
   public void setNavigationBarTintEnabled(boolean enabled) {
      mNavBarTintEnabled = enabled;
      if (mNavBarAvailable) {
         mNavBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);
      }
   }

   /**
    * Apply the specified color tint to all system UI bars.
    * 
    * @param color
    *            The color of the background tint.
    */
   public void setTintColor(int color) {
      setStatusBarTintColor(color);
      setNavigationBarTintColor(color);
   }

   /**
    * Apply the specified drawable or color resource to all system UI bars.
    * 
    * @param res
    *            The identifier of the resource.
    */
   public void setTintResource(int res) {
      setStatusBarTintResource(res);
      setNavigationBarTintResource(res);
   }

   /**
    * Apply the specified drawable to all system UI bars.
    * 
    * @param drawable
    *            The drawable to use as the background, or null to remove it.
    */
   public void setTintDrawable(Drawable drawable) {
      setStatusBarTintDrawable(drawable);
      setNavigationBarTintDrawable(drawable);
   }

   /**
    * Apply the specified alpha to all system UI bars.
    * 
    * @param alpha
    *            The alpha to use
    */
   public void setTintAlpha(float alpha) {
      setStatusBarAlpha(alpha);
      setNavigationBarAlpha(alpha);
   }

   /**
    * Apply the specified color tint to the system status bar.
    * 
    * @param color
    *            The color of the background tint.
    */
   public void setStatusBarTintColor(int color) {
      if (mStatusBarAvailable) {
         mStatusBarTintView.setBackgroundColor(color);
      }
   }

   /**
    * Apply the specified drawable or color resource to the system status bar.
    * 
    * @param res
    *            The identifier of the resource.
    */
   public void setStatusBarTintResource(int res) {
      if (mStatusBarAvailable) {
         mStatusBarTintView.setBackgroundResource(res);
      }
   }

   /**
    * Apply the specified drawable to the system status bar.
    * 
    * @param drawable
    *            The drawable to use as the background, or null to remove it.
    */
   @SuppressWarnings("deprecation")
   public void setStatusBarTintDrawable(Drawable drawable) {
      if (mStatusBarAvailable) {
         mStatusBarTintView.setBackgroundDrawable(drawable);
      }
   }

   /**
    * Apply the specified alpha to the system status bar.
    * 
    * @param alpha
    *            The alpha to use
    */
   @TargetApi(11)
   public void setStatusBarAlpha(float alpha) {
      if (mStatusBarAvailable
            && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
         mStatusBarTintView.setAlpha(alpha);
      }
   }

   /**
    * Apply the specified color tint to the system navigation bar.
    * 
    * @param color
    *            The color of the background tint.
    */
   public void setNavigationBarTintColor(int color) {
      if (mNavBarAvailable) {
         mNavBarTintView.setBackgroundColor(color);
      }
   }

   /**
    * Apply the specified drawable or color resource to the system navigation
    * bar.
    * 
    * @param res
    *            The identifier of the resource.
    */
   public void setNavigationBarTintResource(int res) {
      if (mNavBarAvailable) {
         mNavBarTintView.setBackgroundResource(res);
      }
   }

   /**
    * Apply the specified drawable to the system navigation bar.
    * 
    * @param drawable
    *            The drawable to use as the background, or null to remove it.
    */
   @SuppressWarnings("deprecation")
   public void setNavigationBarTintDrawable(Drawable drawable) {
      if (mNavBarAvailable) {
         mNavBarTintView.setBackgroundDrawable(drawable);
      }
   }

   /**
    * Apply the specified alpha to the system navigation bar.
    * 
    * @param alpha
    *            The alpha to use
    */
   @TargetApi(11)
   public void setNavigationBarAlpha(float alpha) {
      if (mNavBarAvailable
            && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
         mNavBarTintView.setAlpha(alpha);
      }
   }

   /**
    * Get the system bar configuration.
    * 
    * @return The system bar configuration for the current device
    *         configuration.
    */
   public SystemBarConfig getConfig() {
      return mConfig;
   }

   /**
    * Is tinting enabled for the system status bar?
    * 
    * @return True if enabled, False otherwise.
    */
   public boolean isStatusBarTintEnabled() {
      return mStatusBarTintEnabled;
   }

   /**
    * Is tinting enabled for the system navigation bar?
    * 
    * @return True if enabled, False otherwise.
    */
   public boolean isNavBarTintEnabled() {
      return mNavBarTintEnabled;
   }

   private void setupStatusBarView(Context context, ViewGroup decorViewGroup, int color) {
      mStatusBarTintView = new View(context);
      LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,
            mConfig.getStatusBarHeight());
      mStatusBarTintView.setTag("mStatusBarTintView");
      params.gravity = Gravity.TOP;
      if (mNavBarAvailable && !mConfig.isNavigationAtBottom()) {
         params.rightMargin = mConfig.getNavigationBarWidth();
      }
      mStatusBarTintView.setLayoutParams(params);
      mStatusBarTintView.setBackgroundColor(color);
      mStatusBarTintView.setVisibility(View.GONE);
      decorViewGroup.addView(mStatusBarTintView);
   }

   @SuppressLint("RtlHardcoded") 
   private void setupNavBarView(Context context, ViewGroup decorViewGroup) {
      mNavBarTintView = new View(context);
      LayoutParams params;
      if (mConfig.isNavigationAtBottom()) {
         params = new LayoutParams(LayoutParams.MATCH_PARENT,
               mConfig.getNavigationBarHeight());
         params.gravity = Gravity.BOTTOM;
      } else {
         params = new LayoutParams(mConfig.getNavigationBarWidth(),
               LayoutParams.MATCH_PARENT);
         params.gravity = Gravity.RIGHT;
      }
      mNavBarTintView.setLayoutParams(params);
      mNavBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
      mNavBarTintView.setVisibility(View.GONE);
      decorViewGroup.addView(mNavBarTintView);
   }

   /**
    * Class which describes system bar sizing and other characteristics for the
    * current device configuration.
    * 
    */
   public static class SystemBarConfig {

      private static final String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height";
      private static final String NAV_BAR_HEIGHT_RES_NAME = "navigation_bar_height";
      private static final String NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME = "navigation_bar_height_landscape";
      private static final String NAV_BAR_WIDTH_RES_NAME = "navigation_bar_width";
      private static final String SHOW_NAV_BAR_RES_NAME = "config_showNavigationBar";

      private final boolean mTranslucentStatusBar;
      private final boolean mTranslucentNavBar;
      private final int mStatusBarHeight;
      private final int mActionBarHeight;
      private final boolean mHasNavigationBar;
      private final int mNavigationBarHeight;
      private final int mNavigationBarWidth;
      private final boolean mInPortrait;
      private final float mSmallestWidthDp;

      private SystemBarConfig(Activity activity,
            boolean translucentStatusBar, boolean traslucentNavBar) {
         Resources res = activity.getResources();
         mInPortrait = (res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);
         mSmallestWidthDp = getSmallestWidthDp(activity);
         mStatusBarHeight = getInternalDimensionSize(res,
               STATUS_BAR_HEIGHT_RES_NAME);
         mActionBarHeight = getActionBarHeight(activity);
         mNavigationBarHeight = getNavigationBarHeight(activity);
         mNavigationBarWidth = getNavigationBarWidth(activity);
         mHasNavigationBar = (mNavigationBarHeight > 0);
         mTranslucentStatusBar = translucentStatusBar;
         mTranslucentNavBar = traslucentNavBar;
      }

      @TargetApi(14)
      private int getActionBarHeight(Context context) {
         int result = 0;
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            TypedValue tv = new TypedValue();
            context.getTheme().resolveAttribute(
                  android.R.attr.actionBarSize, tv, true);
            result = TypedValue.complexToDimensionPixelSize(tv.data,
                  context.getResources().getDisplayMetrics());
         }
         return result;
      }

      @TargetApi(14)
      private int getNavigationBarHeight(Context context) {
         Resources res = context.getResources();
         int result = 0;
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            if (hasNavBar(context)) {
               String key;
               if (mInPortrait) {
                  key = NAV_BAR_HEIGHT_RES_NAME;
               } else {
                  key = NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME;
               }
               return getInternalDimensionSize(res, key);
            }
         }
         return result;
      }

      @TargetApi(14)
      private int getNavigationBarWidth(Context context) {
         Resources res = context.getResources();
         int result = 0;
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            if (hasNavBar(context)) {
               return getInternalDimensionSize(res, NAV_BAR_WIDTH_RES_NAME);
            }
         }
         return result;
      }

      @TargetApi(14)
      private boolean hasNavBar(Context context) {
         Resources res = context.getResources();
         int resourceId = res.getIdentifier(SHOW_NAV_BAR_RES_NAME, "bool",
               "android");
         if (resourceId != 0) {
            boolean hasNav = res.getBoolean(resourceId);
            // check override flag (see static block)
            if ("1".equals(sNavBarOverride)) {
               hasNav = false;
            } else if ("0".equals(sNavBarOverride)) {
               hasNav = true;
            }
            return hasNav;
         } else { // fallback
            return !ViewConfiguration.get(context).hasPermanentMenuKey();
         }
      }

      private int getInternalDimensionSize(Resources res, String key) {
         int result = 0;
         int resourceId = res.getIdentifier(key, "dimen", "android");
         if (resourceId > 0) {
            result = res.getDimensionPixelSize(resourceId);
         }
         return result;
      }

      @SuppressLint("NewApi")
      private float getSmallestWidthDp(Activity activity) {
         DisplayMetrics metrics = new DisplayMetrics();
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            activity.getWindowManager().getDefaultDisplay()
                  .getRealMetrics(metrics);
         } else {
            // TODO this is not correct, but we don't really care pre-kitkat
            activity.getWindowManager().getDefaultDisplay()
                  .getMetrics(metrics);
         }
         float widthDp = metrics.widthPixels / metrics.density;
         float heightDp = metrics.heightPixels / metrics.density;
         return Math.min(widthDp, heightDp);
      }

      /**
       * Should a navigation bar appear at the bottom of the screen in the
       * current device configuration? A navigation bar may appear on the
       * right side of the screen in certain configurations.
       * 
       * @return True if navigation should appear at the bottom of the screen,
       *         False otherwise.
       */
      public boolean isNavigationAtBottom() {
         return (mSmallestWidthDp >= 600 || mInPortrait);
      }

      /**
       * Get the height of the system status bar.
       * 
       * @return The height of the status bar (in pixels).
       */
      public int getStatusBarHeight() {
         return mStatusBarHeight;
      }

      /**
       * Get the height of the action bar.
       * 
       * @return The height of the action bar (in pixels).
       */
      public int getActionBarHeight() {
         return mActionBarHeight;
      }

      /**
       * Does this device have a system navigation bar?
       * 
       * @return True if this device uses soft key navigation, False
       *         otherwise.
       */
      public boolean hasNavigtionBar() {
         return mHasNavigationBar;
      }

      /**
       * Get the height of the system navigation bar.
       * 
       * @return The height of the navigation bar (in pixels). If the device
       *         does not have soft navigation keys, this will always return
       *         0.
       */
      public int getNavigationBarHeight() {
         return mNavigationBarHeight;
      }

      /**
       * Get the width of the system navigation bar when it is placed
       * vertically on the screen.
       * 
       * @return The width of the navigation bar (in pixels). If the device
       *         does not have soft navigation keys, this will always return
       *         0.
       */
      public int getNavigationBarWidth() {
         return mNavigationBarWidth;
      }

      /**
       * Get the layout inset for any system UI that appears at the top of the
       * screen.
       * 
       * @param withActionBar
       *            True to include the height of the action bar, False
       *            otherwise.
       * @return The layout inset (in pixels).
       */
      public int getPixelInsetTop(boolean withActionBar) {
         return (mTranslucentStatusBar ? mStatusBarHeight : 0)
               + (withActionBar ? mActionBarHeight : 0);
      }

      /**
       * Get the layout inset for any system UI that appears at the bottom of
       * the screen.
       * 
       * @return The layout inset (in pixels).
       */
      public int getPixelInsetBottom() {
         if (mTranslucentNavBar && isNavigationAtBottom()) {
            return mNavigationBarHeight;
         } else {
            return 0;
         }
      }

      /**
       * Get the layout inset for any system UI that appears at the right of
       * the screen.
       * 
       * @return The layout inset (in pixels).
       */
      public int getPixelInsetRight() {
         if (mTranslucentNavBar && !isNavigationAtBottom()) {
            return mNavigationBarWidth;
         } else {
            return 0;
         }
      }

   }

}




最后资源位置:http://download.csdn.net/detail/qq_22256027/9804262





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值