转自:http://blog.csdn.net/u013951017/article/details/54598801
Android 透明状态栏,相信大家都可以找到方法这里再啰嗦一下:
/** * 修改状态栏为全透明 * * @param activity */ @TargetApi(19) public static void transparencyBar(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = activity.getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); window.setNavigationBarColor(Color.TRANSPARENT); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = activity.getWindow(); window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } // ((ViewGroup)activity.findViewById(android.R.id.content)).getChildAt(0).setFitsSystemWindows(true);//设置跟布局fitsystemwindow=true } 这个方法支持将activity的状态栏透明化,但是有时候我们一个activity中有多个fragment,这些fragment有的是图片在顶部,有的是纯色的actionbar,如果单纯的fitsystemwindow=true,可能造成某些个fragment中的 actionbar也跑到状态栏中或者是图片被顶出了状态栏而达不到效果,这种情况怎么解决呢?往下看: 这样处理:只在activity的oncreate()中调用上面的方法,不像其他教程里面的使用fitsystemwindow把布局往下顶,如果是图片的话就已经处理好了,如果是布局,比如自定义的actionbar布局可以 在外层嵌套一个垂直的linearlayout,然后添加一个View,在代码中动态的设置这个view的高度为状态栏的高度,来填充状态栏,这样每个fragment就能用自己的布局来控制自己的状态栏显示了 ,这样做的好处不止这样,因为actionbar背景有时会随着布局移动改变颜色,这时候状态栏的颜色也要改变,我们只要同时更改填充的VIew的背景就好了,是不是很简单:下面直接上代码: 1:首先是布局处理,在需要布局在状态栏下出现的fragment中,如果是单纯的图片就不用做任何处理:
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <View android:id="@+id/status_bar_fix" android:layout_width="match_parent" android:layout_height="0dp" android:background="#00000000" /> <!--你的自定义actionbar布局--> </LinearLayout>2:在主activity中调用transparencyBar方法,上面已经提供了,我只是把它放在MyStateBarUtil类中。
MyStateBarUtil.transparencyBar(this); 3:动态的设置填充View的高度
View mStateBarFixer = mView.findViewById( R.id.status_bar_fix); mStateBarFixer.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, WindowAttr.getStateBarHeight(getActivity())));//填充状态栏获取状态栏高度的方法,我放在了WindowAttr类中了:
/** * 获取状态栏高度,在页面还没有显示出来之前 * * @param a * @return */ public static int getStateBarHeight(Activity a) { int result = 0; int resourceId = a.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = a.getResources().getDimensionPixelSize(resourceId); } return result; } 附:根据listview滚动更改状态栏和actionbar颜色
evaluator = new ArgbEvaluator();
mList.setOnScrollListener(new AbsListView.OnScrollListener() { private SparseArray recordSp = new SparseArray(0); private int mCurrentfirstVisibleItem = 0; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { mCurrentfirstVisibleItem = firstVisibleItem; View firstView = view.getChildAt(0); if (null != firstView) { ItemRecod itemRecord = (ItemRecod) recordSp.get(firstVisibleItem); if (null == itemRecord) { itemRecord = new ItemRecod(); } itemRecord.height = firstView.getHeight(); itemRecord.top = firstView.getTop(); recordSp.append(firstVisibleItem, itemRecord); } if (headerHeight != -1) { float scrollPercent = (float) (getScrollY() / headerHeight); if (scrollPercent >= 0) { if (scrollPercent > 1) { scrollPercent = 1; } int evaluate = (Integer) evaluator.evaluate(scrollPercent, 0x00000000, 0XFFE93030); mAcBar.setBackgroundColor(evaluate); mStateBarFixer.setBackgroundColor(evaluate);//状态栏填充布局也要更改颜色 } } // LogUtils.d(xiaoqiang, getScrollY() + ); } private int getScrollY() { int height = 0; for (int i = 0; i < mCurrentfirstVisibleItem; i++) { ItemRecod itemRecod = (ItemRecod) recordSp.get(i); if (itemRecod != null) { height += itemRecod.height; } } ItemRecod itemRecod = (ItemRecod) recordSp.get(mCurrentfirstVisibleItem); if (null == itemRecod) { itemRecod = new ItemRecod(); } return height - itemRecod.top; } class ItemRecod { int height = 0; int top = 0; } });在onwindowfocuschanged中获取
headerHeight
的高度,由于是在fragment中没有这个方法可以写一个接口或者用eventbus在fragment中调用到高度就是你需要滑动多少后颜色完全变化的高度,相信大家都会根据自己的需要算出来