像IOS一样,状态栏透明,和应用背景重叠,与应用统一颜色样式
在android4.4之前,是没有这种效果的,状态栏默认都是黑色,状态栏与应用都是分开的,在4.4之后,也就是api19以上(包括19)才有这种效果,沉浸模式的状态栏可以设置透明,与应用背景合为一体,这样增加了视觉效果
先看下图片效果
下面的订单文本与状态栏有点重叠了,等下我们在讲解
下面先讲一种简单直接的方法:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明导航栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
直接在onCreate方法里加入这两行代码,对应的xml代码
在第一个textview中写入文本时会出现上面截图那样,文本会与状态栏重叠,只要在该textview中添加:
android:fitsSystemWindows="true"
android:clipToPadding="true"
还有一种方法,我觉得这种方法更好一点,是从大神那借鉴来的哦
/**
* 主界面
*
* @author SuS
* @time 2015.07.29
*/
public class AboutActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_about);
setImmerseLayout(findViewById(R.id.common_back));
initBackButton();
setTitleBar(R.string.durian_about);
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
在他的父activity中
package com.sus.immerselayout;
import android.annotation.TargetApi;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AbsListView;
import android.widget.AbsSpinner;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.TextView;
@TargetApi(9)
public class BaseActivity extends FragmentActivity {
private static final String TAG = "BaseActivity";
public static String apkName;
protected boolean isStart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isStart = true;
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
isStart = false;
super.onDestroy();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// 退出Activity时动画
finish();
overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out);
}
return super.onKeyDown(keyCode, event);
}
protected void unbindDrawables(View view) {
if (view != null) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageDrawable(null);
}
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
if (!(view instanceof AbsSpinner) && !(view instanceof AbsListView)) {
((ViewGroup) view).removeAllViews();
}
}
}
}
protected View inflateSubView(int subId, int inflateId) {
View noNetSubTree = findViewById(inflateId);
if (noNetSubTree == null) {
ViewStub viewStub = (ViewStub) findViewById(subId);
noNetSubTree = viewStub.inflate();
}
noNetSubTree.setVisibility(View.VISIBLE);
return noNetSubTree;
}
public void initBackButton() {
ImageView backButton = (ImageView) this.findViewById(R.id.durian_back_image);
backButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finishActivity();
}
});
}
protected void setImmerseLayout(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
int statusBarHeight = ScreenUtil.getStatusBarHeight(this.getBaseContext());
view.setPadding(0, statusBarHeight, 0, 0);
}
}
protected void setImmerseLayout() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
public void finishActivity() {
finish();
overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out);
}
public void setTitleBar(int id) {
TextView tvName = (TextView) findViewById(R.id.durian_title_text);
tvName.setText(id);
}
}
package com.sus.immerselayout;
import android.app.Activity;
import android.content.Context;
import android.graphics.Point;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Window;
import android.view.WindowManager;
import java.lang.reflect.Field;
/**
* @author ----zhaoruyang----
* @data: 2015/7/2
*/
public class ScreenUtil {
private static final String TAG = ScreenUtil.class.getSimpleName();
/**
* 用于获取状态栏的高度。
*
* @return 返回状态栏高度的像素值。
*/
public static int getStatusBarHeight(Activity activity) {
try {
Class c = Class.forName("com.android.internal.R$dimen");
Object obj = c.newInstance();
Field field = c.getField("status_bar_height");
int x = Integer.parseInt(field.get(obj).toString());
return activity.getResources().getDimensionPixelSize(x);
} catch (Exception e) {
//LogHelper.e("Exception", "*****EXCEPTION*****\n", e);
}
return 0;
}
/**
* 用于获取状态栏的高度。 使用Resource对象获取(推荐这种方式)
*
* @return 返回状态栏高度的像素值。
*/
public static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen",
"android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
/**
* 获取标题栏高度
*
* @param activity
* @return
*/
public static int getTitleBarHeight(Activity activity) {
int contentTop = activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
return contentTop - getStatusBarHeight(activity);
}
/**
* 在Activity中获取屏幕的高度和宽度
*
* @param activity 在真机中,有时候会发现得到的尺寸不是很准确,需要在AndroidManifest中添加如下配置:
*
*/
public static int[] getScreenSize(Activity activity) {
Display display = activity.getWindowManager().getDefaultDisplay();
Point point = new Point();
display.getSize(point);
return new int[] {
point.x, point.y
};
}
/**
* 在非Activity中,通常会在Custom View时
*
* 目前不推荐使用(3.2及以下)
*
* @param context 在真机中,有时候会发现得到的尺寸不是很准确,需要在AndroidManifest中添加如下配置:
*
*/
public static int[] getScreenSize(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
return new int[] {
dm.widthPixels, dm.heightPixels
};
}
}
到这里就OK了,我这是看了大神写的,在这里借鉴一下,5.0的可以参考下面这个链接哦