Android 系统状态栏一体化实现

自上周更新了QQ手机客户端,对于新版本的QQ,系统状态栏也有蓝色色调,看起来有种清爽感觉。于是想自已也实现这种效果,随查阅资料,自已调试实现这种效果。Android 系统4.4以上都可以具备这种效果。所以测试时候,需要测试手机Android系统版本为4.4以上,才会出现这个效果。附上本文源码以及效果图。

源码下载:点击

一、效果图


二、看MainActivity实现类

[java]  view plain  copy
  1. package com.example.systemstatusdemo;  
  2.   
  3. import android.os.Build;  
  4. import android.os.Bundle;  
  5. import android.annotation.TargetApi;  
  6. import android.app.Activity;  
  7. import android.view.Menu;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.view.Window;  
  11. import android.view.WindowManager;  
  12. import android.widget.TextView;  
  13.   
  14. public class MainActivity extends Activity implements OnClickListener{  
  15.   
  16.     @Override  
  17.     protected void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.activity_main);  
  20.         setTranslucentStatus();  
  21.         InitView();  
  22.     }  
  23.   
  24.     private void InitView() {  
  25.         //标题栏控件  
  26.         TextView mTitle = (TextView) findViewById(R.id.ivTitleName);  
  27.         mTitle.setText("默默笙箫");  
  28.         TextView mTitleLeftBtn = (TextView) findViewById(R.id.ivTitleBtnLeft);  
  29.         mTitleLeftBtn.setVisibility(View.VISIBLE);  
  30.         mTitleLeftBtn.setOnClickListener(this);  
  31.           
  32.     }  
  33.   
  34.     //设置系统状态栏  
  35.     @TargetApi(Build.VERSION_CODES.HONEYCOMB)  
  36.     private void setTranslucentStatus()   
  37.     {  
  38.         //判断版本是4.4以上  
  39.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)  
  40.         {  
  41.             Window win = getWindow();  
  42.             WindowManager.LayoutParams winParams = win.getAttributes();  
  43.             final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;  
  44.             winParams.flags |= bits;  
  45.             win.setAttributes(winParams);  
  46.               
  47.             SystemStatusManager tintManager = new SystemStatusManager(this);  
  48.             //打开系统状态栏控制  
  49.             tintManager.setStatusBarTintEnabled(true);  
  50.             tintManager.setStatusBarTintResource(R.drawable.chat_title_bg_repeat);//设置背景  
  51.               
  52.             View layoutAll = findViewById(R.id.layoutAll);  
  53.             //设置系统栏需要的内偏移  
  54.             layoutAll.setPadding(0, ScreenUtils.getStatusHeight(this), 00);  
  55.         }  
  56.     }  
  57.       
  58.     @Override  
  59.     public boolean onCreateOptionsMenu(Menu menu) {  
  60.         // Inflate the menu; this adds items to the action bar if it is present.  
  61.         getMenuInflater().inflate(R.menu.main, menu);  
  62.         return true;  
  63.     }  
  64.   
  65.     @Override  
  66.     public void onClick(View v) {  
  67.         switch (v.getId()) {  
  68.         case R.id.ivTitleBtnLeft:  
  69.             finish();  
  70.             break;  
  71.   
  72.         default:  
  73.             break;  
  74.         }  
  75.           
  76.     }  
  77.   
  78. }  
三、系统状态栏管理类SystemStatusManager
[java]  view plain  copy
  1. package com.example.systemstatusdemo;  
  2.   
  3. import android.annotation.SuppressLint;  
  4. import android.annotation.TargetApi;  
  5. import android.app.Activity;  
  6. import android.content.Context;  
  7. import android.content.res.Configuration;  
  8. import android.content.res.Resources;  
  9. import android.content.res.TypedArray;  
  10. import android.graphics.drawable.Drawable;  
  11. import android.os.Build;  
  12. import android.util.DisplayMetrics;  
  13. import android.util.TypedValue;  
  14. import android.view.Gravity;  
  15. import android.view.View;  
  16. import android.view.ViewConfiguration;  
  17. import android.view.ViewGroup;  
  18. import android.view.Window;  
  19. import android.view.WindowManager;  
  20. import android.widget.FrameLayout.LayoutParams;  
  21.   
  22. import java.lang.reflect.Method;  
  23.   
  24. /** 
  25.  * 系统状态栏和导航栏管理类 
  26.  * 可以使用KitKat设置状态栏和导航栏的背景效果 
  27.  * 注:支持Android4.4以上版本  
  28.  */  
  29. @SuppressWarnings({ "unchecked""rawtypes" })  
  30. public class SystemStatusManager   
  31. {  
  32.     static   
  33.     {  
  34.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
  35.             try {  
  36.                 Class c = Class.forName("android.os.SystemProperties");  
  37.                 Method m = c.getDeclaredMethod("get", String.class);  
  38.                 m.setAccessible(true);  
  39.                 sNavBarOverride = (String) m.invoke(null"qemu.hw.mainkeys");  
  40.             } catch (Throwable e) {  
  41.                 sNavBarOverride = null;  
  42.             }  
  43.         }  
  44.     }  
  45.   
  46.     /** 
  47.      * The default system bar tint color value. 
  48.      */  
  49.     public static final int DEFAULT_TINT_COLOR = 0x99000000;  
  50.     private static String sNavBarOverride;  
  51.     private final SystemBarConfig mConfig;  
  52.     private boolean mStatusBarAvailable;  
  53.     private boolean mNavBarAvailable;  
  54.     private boolean mStatusBarTintEnabled;  
  55.     private boolean mNavBarTintEnabled;  
  56.     private View mStatusBarTintView;  
  57.     private View mNavBarTintView;  
  58.   
  59.     /** 
  60.      * Constructor. Call this in the host activity onCreate method after its 
  61.      * content view has been set. You should always create new instances when 
  62.      * the host activity is recreated. 
  63.      * 
  64.      * @param activity The host activity. 
  65.      */  
  66.     @TargetApi(19)  
  67.     public SystemStatusManager(Activity activity) {  
  68.   
  69.         Window win = activity.getWindow();  
  70.         ViewGroup decorViewGroup = (ViewGroup) win.getDecorView();  
  71.   
  72.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
  73.             // check theme attrs  
  74.             int[] attrs = {android.R.attr.windowTranslucentStatus,  
  75.                     android.R.attr.windowTranslucentNavigation};  
  76.             TypedArray a = activity.obtainStyledAttributes(attrs);  
  77.             try {  
  78.                 mStatusBarAvailable = a.getBoolean(0false);  
  79.                 mNavBarAvailable = a.getBoolean(1false);  
  80.             } finally {  
  81.                 a.recycle();  
  82.             }  
  83.   
  84.             // check window flags  
  85.             WindowManager.LayoutParams winParams = win.getAttributes();  
  86.             int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;  
  87.             if ((winParams.flags & bits) != 0) {  
  88.                 mStatusBarAvailable = true;  
  89.             }  
  90.             bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;  
  91.             if ((winParams.flags & bits) != 0) {  
  92.                 mNavBarAvailable = true;  
  93.             }  
  94.         }  
  95.   
  96.         mConfig = new SystemBarConfig(activity, mStatusBarAvailable, mNavBarAvailable);  
  97.         // device might not have virtual navigation keys  
  98.         if (!mConfig.hasNavigtionBar()) {  
  99.             mNavBarAvailable = false;  
  100.         }  
  101.   
  102.         if (mStatusBarAvailable) {  
  103.             setupStatusBarView(activity, decorViewGroup);  
  104.         }  
  105.         if (mNavBarAvailable) {  
  106.             setupNavBarView(activity, decorViewGroup);  
  107.         }  
  108.   
  109.     }  
  110.   
  111.     /** 
  112.      * Enable tinting of the system status bar. 
  113.      * 
  114.      * If the platform is running Jelly Bean or earlier, or translucent system 
  115.      * UI modes have not been enabled in either the theme or via window flags, 
  116.      * then this method does nothing. 
  117.      * 
  118.      * @param enabled True to enable tinting, false to disable it (default). 
  119.      */  
  120.     public void setStatusBarTintEnabled(boolean enabled) {  
  121.         mStatusBarTintEnabled = enabled;  
  122.         if (mStatusBarAvailable) {  
  123.             mStatusBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);  
  124.         }  
  125.     }  
  126.   
  127.     /** 
  128.      * Enable tinting of the system navigation bar. 
  129.      * 
  130.      * If the platform does not have soft navigation keys, is running Jelly Bean 
  131.      * or earlier, or translucent system UI modes have not been enabled in either 
  132.      * the theme or via window flags, then this method does nothing. 
  133.      * 
  134.      * @param enabled True to enable tinting, false to disable it (default). 
  135.      */  
  136.     public void setNavigationBarTintEnabled(boolean enabled) {  
  137.         mNavBarTintEnabled = enabled;  
  138.         if (mNavBarAvailable) {  
  139.             mNavBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);  
  140.         }  
  141.     }  
  142.   
  143.     /** 
  144.      * Apply the specified color tint to all system UI bars. 
  145.      * 
  146.      * @param color The color of the background tint. 
  147.      */  
  148.     public void setTintColor(int color) {  
  149.         setStatusBarTintColor(color);  
  150.         setNavigationBarTintColor(color);  
  151.     }  
  152.   
  153.     /** 
  154.      * Apply the specified drawable or color resource to all system UI bars. 
  155.      * 
  156.      * @param res The identifier of the resource. 
  157.      */  
  158.     public void setTintResource(int res) {  
  159.         setStatusBarTintResource(res);  
  160.         setNavigationBarTintResource(res);  
  161.     }  
  162.   
  163.     /** 
  164.      * Apply the specified drawable to all system UI bars. 
  165.      * 
  166.      * @param drawable The drawable to use as the background, or null to remove it. 
  167.      */  
  168.     public void setTintDrawable(Drawable drawable) {  
  169.         setStatusBarTintDrawable(drawable);  
  170.         setNavigationBarTintDrawable(drawable);  
  171.     }  
  172.   
  173.     /** 
  174.      * Apply the specified alpha to all system UI bars. 
  175.      * 
  176.      * @param alpha The alpha to use 
  177.      */  
  178.     public void setTintAlpha(float alpha) {  
  179.         setStatusBarAlpha(alpha);  
  180.         setNavigationBarAlpha(alpha);  
  181.     }  
  182.   
  183.     /** 
  184.      * Apply the specified color tint to the system status bar. 
  185.      * 
  186.      * @param color The color of the background tint. 
  187.      */  
  188.     public void setStatusBarTintColor(int color) {  
  189.         if (mStatusBarAvailable) {  
  190.             mStatusBarTintView.setBackgroundColor(color);  
  191.         }  
  192.     }  
  193.   
  194.     /** 
  195.      * Apply the specified drawable or color resource to the system status bar. 
  196.      * 
  197.      * @param res The identifier of the resource. 
  198.      */  
  199.     public void setStatusBarTintResource(int res) {  
  200.         if (mStatusBarAvailable) {  
  201.             mStatusBarTintView.setBackgroundResource(res);  
  202.         }  
  203.     }  
  204.   
  205.     /** 
  206.      * Apply the specified drawable to the system status bar. 
  207.      * 
  208.      * @param drawable The drawable to use as the background, or null to remove it. 
  209.      */  
  210.     @SuppressWarnings("deprecation")  
  211.     public void setStatusBarTintDrawable(Drawable drawable) {  
  212.         if (mStatusBarAvailable) {  
  213.             mStatusBarTintView.setBackgroundDrawable(drawable);  
  214.         }  
  215.     }  
  216.   
  217.     /** 
  218.      * Apply the specified alpha to the system status bar. 
  219.      * 
  220.      * @param alpha The alpha to use 
  221.      */  
  222.     @TargetApi(11)  
  223.     public void setStatusBarAlpha(float alpha) {  
  224.         if (mStatusBarAvailable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {  
  225.             mStatusBarTintView.setAlpha(alpha);  
  226.         }  
  227.     }  
  228.   
  229.     /** 
  230.      * Apply the specified color tint to the system navigation bar. 
  231.      * 
  232.      * @param color The color of the background tint. 
  233.      */  
  234.     public void setNavigationBarTintColor(int color) {  
  235.         if (mNavBarAvailable) {  
  236.             mNavBarTintView.setBackgroundColor(color);  
  237.         }  
  238.     }  
  239.   
  240.     /** 
  241.      * Apply the specified drawable or color resource to the system navigation bar. 
  242.      * 
  243.      * @param res The identifier of the resource. 
  244.      */  
  245.     public void setNavigationBarTintResource(int res) {  
  246.         if (mNavBarAvailable) {  
  247.             mNavBarTintView.setBackgroundResource(res);  
  248.         }  
  249.     }  
  250.   
  251.     /** 
  252.      * Apply the specified drawable to the system navigation bar. 
  253.      * 
  254.      * @param drawable The drawable to use as the background, or null to remove it. 
  255.      */  
  256.     @SuppressWarnings("deprecation")  
  257.     public void setNavigationBarTintDrawable(Drawable drawable) {  
  258.         if (mNavBarAvailable) {  
  259.             mNavBarTintView.setBackgroundDrawable(drawable);  
  260.         }  
  261.     }  
  262.   
  263.     /** 
  264.      * Apply the specified alpha to the system navigation bar. 
  265.      * 
  266.      * @param alpha The alpha to use 
  267.      */  
  268.     @TargetApi(11)  
  269.     public void setNavigationBarAlpha(float alpha) {  
  270.         if (mNavBarAvailable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {  
  271.             mNavBarTintView.setAlpha(alpha);  
  272.         }  
  273.     }  
  274.   
  275.     /** 
  276.      * Get the system bar configuration. 
  277.      * 
  278.      * @return The system bar configuration for the current device configuration. 
  279.      */  
  280.     public SystemBarConfig getConfig() {  
  281.         return mConfig;  
  282.     }  
  283.   
  284.     /** 
  285.      * Is tinting enabled for the system status bar? 
  286.      * 
  287.      * @return True if enabled, False otherwise. 
  288.      */  
  289.     public boolean isStatusBarTintEnabled() {  
  290.         return mStatusBarTintEnabled;  
  291.     }  
  292.   
  293.     /** 
  294.      * Is tinting enabled for the system navigation bar? 
  295.      * 
  296.      * @return True if enabled, False otherwise. 
  297.      */  
  298.     public boolean isNavBarTintEnabled() {  
  299.         return mNavBarTintEnabled;  
  300.     }  
  301.   
  302.     private void setupStatusBarView(Context context, ViewGroup decorViewGroup) {  
  303.         mStatusBarTintView = new View(context);  
  304.         LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getStatusBarHeight());  
  305.         params.gravity = Gravity.TOP;  
  306.         if (mNavBarAvailable && !mConfig.isNavigationAtBottom()) {  
  307.             params.rightMargin = mConfig.getNavigationBarWidth();  
  308.         }  
  309.         mStatusBarTintView.setLayoutParams(params);  
  310.         mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);  
  311.         mStatusBarTintView.setVisibility(View.GONE);  
  312.         decorViewGroup.addView(mStatusBarTintView);  
  313.     }  
  314.   
  315.     private void setupNavBarView(Context context, ViewGroup decorViewGroup) {  
  316.         mNavBarTintView = new View(context);  
  317.         LayoutParams params;  
  318.         if (mConfig.isNavigationAtBottom()) {  
  319.             params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getNavigationBarHeight());  
  320.             params.gravity = Gravity.BOTTOM;  
  321.         } else {  
  322.             params = new LayoutParams(mConfig.getNavigationBarWidth(), LayoutParams.MATCH_PARENT);  
  323.             params.gravity = Gravity.RIGHT;  
  324.         }  
  325.         mNavBarTintView.setLayoutParams(params);  
  326.         mNavBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);  
  327.         mNavBarTintView.setVisibility(View.GONE);  
  328.         decorViewGroup.addView(mNavBarTintView);  
  329.     }  
  330.   
  331.     /** 
  332.      * Class which describes system bar sizing and other characteristics for the current 
  333.      * device configuration. 
  334.      * 
  335.      */  
  336.     public static class SystemBarConfig {  
  337.   
  338.         private static final String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height";  
  339.         private static final String NAV_BAR_HEIGHT_RES_NAME = "navigation_bar_height";  
  340.         private static final String NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME = "navigation_bar_height_landscape";  
  341.         private static final String NAV_BAR_WIDTH_RES_NAME = "navigation_bar_width";  
  342.         private static final String SHOW_NAV_BAR_RES_NAME = "config_showNavigationBar";  
  343.   
  344.         private final boolean mTranslucentStatusBar;  
  345.         private final boolean mTranslucentNavBar;  
  346.         private final int mStatusBarHeight;  
  347.         private final int mActionBarHeight;  
  348.         private final boolean mHasNavigationBar;  
  349.         private final int mNavigationBarHeight;  
  350.         private final int mNavigationBarWidth;  
  351.         private final boolean mInPortrait;  
  352.         private final float mSmallestWidthDp;  
  353.   
  354.         private SystemBarConfig(Activity activity, boolean translucentStatusBar, boolean traslucentNavBar) {  
  355.             Resources res = activity.getResources();  
  356.             mInPortrait = (res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);  
  357.             mSmallestWidthDp = getSmallestWidthDp(activity);  
  358.             mStatusBarHeight = getInternalDimensionSize(res, STATUS_BAR_HEIGHT_RES_NAME);  
  359.             mActionBarHeight = getActionBarHeight(activity);  
  360.             mNavigationBarHeight = getNavigationBarHeight(activity);  
  361.             mNavigationBarWidth = getNavigationBarWidth(activity);  
  362.             mHasNavigationBar = (mNavigationBarHeight > 0);  
  363.             mTranslucentStatusBar = translucentStatusBar;  
  364.             mTranslucentNavBar = traslucentNavBar;  
  365.         }  
  366.   
  367.         @TargetApi(14)  
  368.         private int getActionBarHeight(Context context) {  
  369.             int result = 0;  
  370.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {  
  371.                 TypedValue tv = new TypedValue();  
  372.                 context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);  
  373.                 result = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());  
  374.             }  
  375.             return result;  
  376.         }  
  377.   
  378.         @TargetApi(14)  
  379.         private int getNavigationBarHeight(Context context) {  
  380.             Resources res = context.getResources();  
  381.             int result = 0;  
  382.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {  
  383.                 if (hasNavBar(context)) {  
  384.                     String key;  
  385.                     if (mInPortrait) {  
  386.                         key = NAV_BAR_HEIGHT_RES_NAME;  
  387.                     } else {  
  388.                         key = NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME;  
  389.                     }  
  390.                     return getInternalDimensionSize(res, key);  
  391.                 }  
  392.             }  
  393.             return result;  
  394.         }  
  395.   
  396.         @TargetApi(14)  
  397.         private int getNavigationBarWidth(Context context) {  
  398.             Resources res = context.getResources();  
  399.             int result = 0;  
  400.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {  
  401.                 if (hasNavBar(context)) {  
  402.                     return getInternalDimensionSize(res, NAV_BAR_WIDTH_RES_NAME);  
  403.                 }  
  404.             }  
  405.             return result;  
  406.         }  
  407.   
  408.         @TargetApi(14)  
  409.         private boolean hasNavBar(Context context) {  
  410.             Resources res = context.getResources();  
  411.             int resourceId = res.getIdentifier(SHOW_NAV_BAR_RES_NAME, "bool""android");  
  412.             if (resourceId != 0) {  
  413.                 boolean hasNav = res.getBoolean(resourceId);  
  414.                 // check override flag (see static block)  
  415.                 if ("1".equals(sNavBarOverride)) {  
  416.                     hasNav = false;  
  417.                 } else if ("0".equals(sNavBarOverride)) {  
  418.                     hasNav = true;  
  419.                 }  
  420.                 return hasNav;  
  421.             } else { // fallback  
  422.                 return !ViewConfiguration.get(context).hasPermanentMenuKey();  
  423.             }  
  424.         }  
  425.   
  426.         private int getInternalDimensionSize(Resources res, String key) {  
  427.             int result = 0;  
  428.             int resourceId = res.getIdentifier(key, "dimen""android");  
  429.             if (resourceId > 0) {  
  430.                 result = res.getDimensionPixelSize(resourceId);  
  431.             }  
  432.             return result;  
  433.         }  
  434.   
  435.         @SuppressLint("NewApi")  
  436.         private float getSmallestWidthDp(Activity activity) {  
  437.             DisplayMetrics metrics = new DisplayMetrics();  
  438.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {  
  439.                 activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);  
  440.             } else {  
  441.                 activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);  
  442.             }  
  443.             float widthDp = metrics.widthPixels / metrics.density;  
  444.             float heightDp = metrics.heightPixels / metrics.density;  
  445.             return Math.min(widthDp, heightDp);  
  446.         }  
  447.   
  448.         /** 
  449.          * Should a navigation bar appear at the bottom of the screen in the current 
  450.          * device configuration? A navigation bar may appear on the right side of 
  451.          * the screen in certain configurations. 
  452.          * 
  453.          * @return True if navigation should appear at the bottom of the screen, False otherwise. 
  454.          */  
  455.         public boolean isNavigationAtBottom() {  
  456.             return (mSmallestWidthDp >= 600 || mInPortrait);  
  457.         }  
  458.   
  459.         /** 
  460.          * Get the height of the system status bar. 
  461.          * 
  462.          * @return The height of the status bar (in pixels). 
  463.          */  
  464.         public int getStatusBarHeight() {  
  465.             return mStatusBarHeight;  
  466.         }  
  467.   
  468.         /** 
  469.          * Get the height of the action bar. 
  470.          * 
  471.          * @return The height of the action bar (in pixels). 
  472.          */  
  473.         public int getActionBarHeight() {  
  474.             return mActionBarHeight;  
  475.         }  
  476.   
  477.         /** 
  478.          * Does this device have a system navigation bar? 
  479.          * 
  480.          * @return True if this device uses soft key navigation, False otherwise. 
  481.          */  
  482.         public boolean hasNavigtionBar() {  
  483.             return mHasNavigationBar;  
  484.         }  
  485.   
  486.         /** 
  487.          * Get the height of the system navigation bar. 
  488.          * 
  489.          * @return The height of the navigation bar (in pixels). If the device does not have 
  490.          * soft navigation keys, this will always return 0. 
  491.          */  
  492.         public int getNavigationBarHeight() {  
  493.             return mNavigationBarHeight;  
  494.         }  
  495.   
  496.         /** 
  497.          * Get the width of the system navigation bar when it is placed vertically on the screen. 
  498.          * 
  499.          * @return The width of the navigation bar (in pixels). If the device does not have 
  500.          * soft navigation keys, this will always return 0. 
  501.          */  
  502.         public int getNavigationBarWidth() {  
  503.             return mNavigationBarWidth;  
  504.         }  
  505.   
  506.         /** 
  507.          * Get the layout inset for any system UI that appears at the top of the screen. 
  508.          * 
  509.          * @param withActionBar True to include the height of the action bar, False otherwise. 
  510.          * @return The layout inset (in pixels). 
  511.          */  
  512.         public int getPixelInsetTop(boolean withActionBar) {  
  513.             return (mTranslucentStatusBar ? mStatusBarHeight : 0) + (withActionBar ? mActionBarHeight : 0);  
  514.         }  
  515.   
  516.         /** 
  517.          * Get the layout inset for any system UI that appears at the bottom of the screen. 
  518.          * 
  519.          * @return The layout inset (in pixels). 
  520.          */  
  521.         public int getPixelInsetBottom() {  
  522.             if (mTranslucentNavBar && isNavigationAtBottom()) {  
  523.                 return mNavigationBarHeight;  
  524.             } else {  
  525.                 return 0;  
  526.             }  
  527.         }  
  528.   
  529.         /** 
  530.          * Get the layout inset for any system UI that appears at the right of the screen. 
  531.          * 
  532.          * @return The layout inset (in pixels). 
  533.          */  
  534.         public int getPixelInsetRight() {  
  535.             if (mTranslucentNavBar && !isNavigationAtBottom()) {  
  536.                 return mNavigationBarWidth;  
  537.             } else {  
  538.                 return 0;  
  539.             }  
  540.         }  
  541.   
  542.     }  
  543.   
  544. }  
四、屏幕相关的辅助类ScreenUtils
[java]  view plain  copy
  1. package com.ycf.systemstatus;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.graphics.Bitmap;  
  6. import android.graphics.Rect;  
  7. import android.util.DisplayMetrics;  
  8. import android.view.View;  
  9. import android.view.WindowManager;  
  10.   
  11. /** 
  12.  * 获得屏幕相关的辅助类 
  13.  */  
  14. public class ScreenUtils  
  15. {  
  16.     private ScreenUtils()  
  17.     {  
  18.         throw new UnsupportedOperationException("cannot be instantiated");  
  19.     }  
  20.   
  21.     /** 
  22.      * 获得屏幕高度 
  23.      *  
  24.      * @param context 
  25.      * @return 
  26.      */  
  27.     public static int getScreenWidth(Context context)  
  28.     {  
  29.         WindowManager wm = (WindowManager) context  
  30.                 .getSystemService(Context.WINDOW_SERVICE);  
  31.         DisplayMetrics outMetrics = new DisplayMetrics();  
  32.         wm.getDefaultDisplay().getMetrics(outMetrics);  
  33.         return outMetrics.widthPixels;  
  34.     }  
  35.   
  36.     /** 
  37.      * 获得屏幕宽度 
  38.      *  
  39.      * @param context 
  40.      * @return 
  41.      */  
  42.     public static int getScreenHeight(Context context)  
  43.     {  
  44.         WindowManager wm = (WindowManager) context  
  45.                 .getSystemService(Context.WINDOW_SERVICE);  
  46.         DisplayMetrics outMetrics = new DisplayMetrics();  
  47.         wm.getDefaultDisplay().getMetrics(outMetrics);  
  48.         return outMetrics.heightPixels;  
  49.     }  
  50.   
  51.     /** 
  52.      * 获得状态栏的高度 
  53.      *  
  54.      * @param context 
  55.      * @return 
  56.      */  
  57.     public static int getStatusHeight(Context context)  
  58.     {  
  59.   
  60.         int statusHeight = -1;  
  61.         try  
  62.         {  
  63.             Class<?> clazz = Class.forName("com.android.internal.R$dimen");  
  64.             Object object = clazz.newInstance();  
  65.             int height = Integer.parseInt(clazz.getField("status_bar_height")  
  66.                     .get(object).toString());  
  67.             statusHeight = context.getResources().getDimensionPixelSize(height);  
  68.         } catch (Exception e)  
  69.         {  
  70.             e.printStackTrace();  
  71.         }  
  72.         return statusHeight;  
  73.     }  
  74.   
  75.     /** 
  76.      * 获取当前屏幕截图,包含状态栏 
  77.      *  
  78.      * @param activity 
  79.      * @return 
  80.      */  
  81.     public static Bitmap snapShotWithStatusBar(Activity activity)  
  82.     {  
  83.         View view = activity.getWindow().getDecorView();  
  84.         view.setDrawingCacheEnabled(true);  
  85.         view.buildDrawingCache();  
  86.         Bitmap bmp = view.getDrawingCache();  
  87.         int width = getScreenWidth(activity);  
  88.         int height = getScreenHeight(activity);  
  89.         Bitmap bp = null;  
  90.         bp = Bitmap.createBitmap(bmp, 00, width, height);  
  91.         view.destroyDrawingCache();  
  92.         return bp;  
  93.   
  94.     }  
  95.   
  96.     /** 
  97.      * 获取当前屏幕截图,不包含状态栏 
  98.      *  
  99.      * @param activity 
  100.      * @return 
  101.      */  
  102.     public static Bitmap snapShotWithoutStatusBar(Activity activity)  
  103.     {  
  104.         View view = activity.getWindow().getDecorView();  
  105.         view.setDrawingCacheEnabled(true);  
  106.         view.buildDrawingCache();  
  107.         Bitmap bmp = view.getDrawingCache();  
  108.         Rect frame = new Rect();  
  109.         activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);  
  110.         int statusBarHeight = frame.top;  
  111.   
  112.         int width = getScreenWidth(activity);  
  113.         int height = getScreenHeight(activity);  
  114.         Bitmap bp = null;  
  115.         bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height  
  116.                 - statusBarHeight);  
  117.         view.destroyDrawingCache();  
  118.         return bp;  
  119.     }  
  120. }  
需要注意的是:1、所以测试时候,需要测试手机Android系统版本为4.4以上,才具有这种效果。

                          2、android:theme="@android:style/Theme.Translucent.NoTitleBar"在项目AndroidManifest.xml配置一下。

源码下载:点击

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值