Android沉浸式通知栏

转载:

http://www.bkjia.com/Androidjc/954431.html

http://blog.csdn.net/zhaoyw2008/article/details/40622919


ystemBarTint链接:https://github.com/jgilfelt/SystemBarTint

最早听这个概念是在MI4发布会上,雷布斯鼓吹的一个概念,让原先安然无光,黑色的通知栏,变成与APP主题相一致的颜色,经过度娘,得知是从4.4开始,Android已经有这个概念(ImmersiveMode)了。

效果如下:

Android沉浸式通知栏_第1张图片

使用方法比较简单,官方给了一个例子:

public class MatchActionBarActivity extends Activity { 

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_match_actionbar);

		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
			setTranslucentStatus(true);
		}

		SystemBarTintManager tintManager = new SystemBarTintManager(this);
		tintManager.setStatusBarTintEnabled(true);
		tintManager.setStatusBarTintResource(R.color.statusbar_bg);//通知栏所需颜色

	}

	@TargetApi(19) 
	private void setTranslucentStatus(boolean on) {
		Window win = getWindow();
		WindowManager.LayoutParams winParams = win.getAttributes();
		final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
		if (on) {
			winParams.flags |= bits;
		} else {
			winParams.flags &= ~bits;
		}
		win.setAttributes(winParams);
	}

}

——————————————————————————————————————————————————————————————————

使用过程中:

问题一:

     对所有activity组件写了父类的absUI,absactionUI,应该在setContentView()之前,对窗口属性进行初始化,赋值。

 @Override
    public void setContentView(int layoutResID) {
        StatusBarUtil.initStyle(this);
        super.setContentView(layoutResID);
    }

问题二:如果 Activity 有 actionbar,那么还需要在 Activity 的布局文件的根节点上设置两个属性

/**重要*/
        mContainer.setClipToPadding(true);
        mContainer.setFitsSystemWindows(true);

问题三:理解activity 继承关系

public class StatusBarUtil {

    private static Window mWindow;
    private static Activity mactivity;

    /**
     *沉浸式通知栏 初始化
     * */
    public static void initStyle(Activity activity){
        mactivity = activity;
        mWindow = activity.getWindow();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }

        initSystemBar();
    }


    private static void initSystemBar() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //状态栏透明 需要在创建SystemBarTintManager 之前调用。
            setTranslucentStatus(true);
            SystemBarTintManager tintManager = new SystemBarTintManager(mactivity);
            tintManager.setStatusBarTintEnabled(true);
            tintManager.setStatusBarTintResource(R.color.status_bar);
        }
    }

    @TargetApi(19)
    private static void setTranslucentStatus(boolean on) {
        WindowManager.LayoutParams winParams = mWindow.getAttributes();
        final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
        if (on) {
            winParams.flags |= bits;
        } else {
            winParams.flags &= ~bits;
        }
        mWindow.setAttributes(winParams);
    }
}


你可能感兴趣的:(透明,4.4,Android沉浸式通知栏)