JAVA状态栏沉浸代码 java项目栏

Android QQ沉浸式状态栏效果是怎么实现的首先是两个开启沉浸模式和关闭沉浸模式的函数
?
@SuppressLint("NewApi")
public static void hideSystemUI(View view) {
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
@SuppressLint("NewApi")
public static void showSystemUI(View view) {
view.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
这些代码可以在google的开发者文档中找到,可以看这里Using Immersive Full-Screen Mode,上面的代码是在Android 4.4中才会生效,对应的Android版本兼容的判断请自行处理 。
此外还需要一个辅助函数,用于获得状态栏高度,使用反射获得 。
?
/**
* 获状态栏高度
*
* @param context 上下文
* @return 通知栏高度
*/
public int getStatusBarHeight(Context context) {
int statusBarHeight = 0;
try {
Class? clazz = Class.forName("com.android.internal.R$dimen");
Object obj = clazz.newInstance();
Field field = clazz.getField("status_bar_height");
int temp = Integer.parseInt(field.get(obj).toString());
statusBarHeight = context.getResources().getDimensionPixelSize(temp);
} catch (Exception e) {
e.printStackTrace();
}
return statusBarHeight;
}
点击hide按钮进入沉浸模式,也就是隐藏状态栏 , 隐藏状态栏的同时我们需要修改Toolbar的上内边距 , 否则会显得很难看,这里注册一个监听OnSystemUiVisibilityChangeListener , 当进入沉浸模式后我们改变Toolbar的上内边距
?
hide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View view = getWindow().getDecorView();
hideSystemUI(view);
mToolbar.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
mToolbar.setPadding(mToolbar.getPaddingLeft(), 0,mToolbar.getPaddingRight(), mToolbar.getPaddingBottom());
}
});
}
});
进入沉浸模式后,手指从屏幕顶部向下划 , 状态栏就出现了,过2秒左右它又会自动消失 。
点击show按钮退出沉浸模式,同时Toolbar的内边距也要增加到状态栏的高度 。
?
show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View view = getWindow().getDecorView();
showSystemUI(view);
mToolbar.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
mToolbar.setPadding(mToolbar.getPaddingLeft(), getStatusBarHeight(MainActivity.this),mToolbar.getPaddingRight(), mToolbar.getPaddingBottom());
}
});
}
});
如果使用的是SystemBarTintManager这个类进行的状态栏的着色,除上方的操作外,还要在对应的监听里增加状态栏着色的禁止和启动的功能 。
进入沉浸模式,要禁用
?
tintManager.setStatusBarTintEnabled(false);
退出沉浸模式 , 要启动
?
tintManager.setStatusBarTintEnabled(true);
如果你想更加平滑,则可以对padding的改成增加动画,具体动画效果自行添加 。
java状态栏怎么制作?用Swing 做界面的话,状态栏其实就是JToolBar
别看它叫状态栏 , 实际就是在工具栏上加一个标签
标签上显示信息,标签是不能改的
JFrame的布局默认是边框布局,分上北,下南,左西,右东,中间
就把JToolBar加在南边,也就是下边
下边把重要的代码写出来
JLabel label=new JLabel("这里是状态栏");
toolBar.add(label);//把标签加到工具栏上
contentPane.add(toolBar,BorderLayout.SOUTH);
//把工具栏加到框架的南边
工具栏 , 你还可以加很多东西,加的多了,就是你常看到
软件的那个样子了
如何实现Android沉浸式状态栏沉浸式通知栏Android4.4以上才支持的新特性 。4.3不支持 。
具体实现方式如下:
1.新建个公共style,设置android:fitsSystemWindows=true
!-- 设置应用布局时是否考虑系统窗口布局;true --style name="AppBaseTheme" parent="android:Theme.Light.NoTitleBar"item name="android:fitsSystemWindows"true/item/style
2. 修改AndroidManifest.xml,让所有的activity样式默认设置为AppBaseTheme(*不同项目要灵活处理,笔者项目的activity样式都是统一的所以这样设置没问题,但是实际情况下不同的activity可能调用的样式不一样,需要读者自行按自己的项目来设置)
applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppBaseTheme"android:name="****"
3.新增沉浸式通知栏实现类,实现原理很简单 。
1)判断当前系统版本是不是4.4以上,判断代码如下:
if (VERSION.SDK_INT = VERSION_CODES.KITKAT)
2)如果大于4.4则设置状态栏透明化,代码如下:
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
3)获取activity的根rootView(DecorView),然后创建一个新的viewstateBarView并把它添加到rootView(这里手动给它设置个ID,下次进来时先判断rootView是否已创建stateBarView,如果已创建则直接获取该View这样可以防止重复创建,导致内存泄露)
以下是具体代码实现:
import android.annotation.SuppressLint;import android.app.Activity;import android.content.res.Resources;import android.graphics.drawable.Drawable;import android.os.Build;import android.view.Gravity;import android.view.View;import android.view.ViewGroup;import android.view.Window;import android.view.WindowManager;import android.widget.FrameLayout.LayoutParams;/** * 沉浸式通知栏公共类 * @author hurrican * */@SuppressLint({ "InlinedApi", "ResourceAsColor" })public class ImmersedNotificationBar { private Activity activity ; //设置沉浸式通知栏的ID(防止重复创建) private final static int IMMERSED_NOTIFICATION_BAR_ID = 12345678 ; private final static String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height" ; public ImmersedNotificationBar(Activity activity){ this.activity = activity ; } //获取状态栏高度 private int getStatusBarHeight(Resources res){int statusBarHeight = 0;int resourceId = res.getIdentifier(STATUS_BAR_HEIGHT_RES_NAME, "dimen", "android");if (resourceId0) {statusBarHeight = res.getDimensionPixelSize(resourceId);}return statusBarHeight ; } //添加顶部状态栏 private View addStateBar(Activity activity,ViewGroup rootView,int statusBarHeight){//创建新的View,并添加到rootView顶部)View statusBarView ;if(null!=rootView.findViewById(IMMERSED_NOTIFICATION_BAR_ID)){statusBarView = rootView.findViewById(IMMERSED_NOTIFICATION_BAR_ID);}else{statusBarView = new View(activity);rootView.addView(statusBarView);}statusBarView.setId(IMMERSED_NOTIFICATION_BAR_ID) ;LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,statusBarHeight);params.gravity = Gravity.TOP;statusBarView.setLayoutParams(params);statusBarView.setVisibility(View.VISIBLE);return statusBarView ; }/*** 设置状态栏颜色* @param ColorId*/ public void setStateBarColor(int ColorId){ if (Build.VERSION.SDK_INT = Build.VERSION_CODES.KITKAT) { Window window = activity.getWindow(); //activity的顶级布局 ViewGroup rootView = (ViewGroup) window.getDecorView(); //透明化状态栏window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);Resources res = activity.getResources();//获取状态栏目的高度int statusBarHeight = getStatusBarHeight(res);View stateBarView = addStateBar(activity,rootView,statusBarHeight) ;stateBarView.setBackgroundColor(ColorId) ; } } /*** 设置状态栏颜色* @param ColorId*/ public void setStateBarDrawable(Drawable drawable){ if (Build.VERSION.SDK_INT = Build.VERSION_CODES.KITKAT) { Window window = activity.getWindow(); //activity的顶级布局 ViewGroup rootView = (ViewGroup) window.getDecorView(); //透明化状态栏window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);Resources res = activity.getResources();//获取状态栏目的高度int statusBarHeight = getStatusBarHeight(res);View stateBarView = addStateBar(activity,rootView,statusBarHeight) ;stateBarView.setBackgroundDrawable(drawable) ; } }}
java 在ubuntu下实现全屏,上面的状态栏依然显示 。如下图,不想要上面的状态栏您好,这样的:
Google从KK开始增加了状态栏透明以及全屏界面有通知可以下拉状态栏的设计,而这个设计出现的隐患是设置了FULL_SCREEN的界面是无法禁止状态栏下拉的,这样对一些工程测试app可能会造成一定的影响 , 但是以google默认的设计 , 应用端无法修改此设计来满足自己的需求 。
MTK 内部已经开发提供新的接口来实现全屏界面禁止下拉状态栏 , 如果贵司的代码还没有这部分逻辑,请参考如下:
1. frameworks\base\core\java\android\view\View.java
[java] view plaincopy
public static final int SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 0x00001000;
/**
* @hide
*
* NOTE: Flag for {@link #setSystemUiVisibility(int)}: It help user to disable transient
* status bar triggered by gesture
*/
public static final int SYSTEM_UI_FLAG_IMMERSIVE_GESTURE_ISOLATED = 0x00002000;
2. frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java
[java] view plaincopy
// monitor for system gestures
mSystemGestures = new SystemGesturesPointerEventListener(context,
new SystemGesturesPointerEventListener.Callbacks() {
@Override
public void onSwipeFromTop() {
if (isGestureIsolated())
return;
if (mStatusBar != null) {
requestTransientBars(mStatusBar);
}
}
@Override
public void onSwipeFromBottom() {
if (isGestureIsolated())
return;
if (mNavigationBar != nullmNavigationBarOnBottom) {
requestTransientBars(mNavigationBar);
}
}
@Override
public void onSwipeFromRight() {
if (isGestureIsolated())
return;
if (mNavigationBar != null!mNavigationBarOnBottom) {
requestTransientBars(mNavigationBar);
}
}
@Override
public void onDebug() {
// no-op
}
private boolean isGestureIsolated() {
WindowState win = mFocusedWindow != null ? mFocusedWindow : mTopFullscreenOpaqueWindowState;
if (win != null(win.getSystemUiVisibility()View.SYSTEM_UI_FLAG_IMMERSIVE_GESTURE_ISOLATED) != 0)
return true;
else
return false;
}
});
3. 请在修改完framework后 , 将测试app用setSystemUiVisibility的API加上SYSTEM_UI_FLAG_IMMERSIVE_GESTURE_ISOLATED的flag 。
Android沉浸式状态栏 如何改变状态图标和文字的颜色在Android4.4设备上支持沉浸式状态栏,只需要添加values-v19/styles.xml 下添加
?
1
2
code class="language-xml hljs "style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.NoActionBar" type="text/css"item name="android:windowTranslucentNavigation"false/item
item name="android:windowTranslucentStatus"true/item/style/code
然后在可以扩展的控件添加属性android:fitsSystemWindows="true"
就阔以了 。
但在MIUI V6下如果扩展的颜色比较浅,会导致状态栏的文字无法看清 。在其他ROM上会有渐变的灰色区域 。
MIUI提供了新的解决方案,在MIUI V6上状态栏支持灰黑色和白色两种字体颜色,开发者可以直接设置当前界面状态栏的文字颜色 。
具体代码:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
code class="language-java hljs "/**
* 只支持MIUI V6
* @param context
* @param type 0--只需要状态栏透明 1-状态栏透明且黑色字体 2-清除黑色字体
*/
public static void setStatusBarTextColor(Activity context,int type){
if (!isMiUIV6()){
DebugLog.d("isMiUIV6:" false);
return;
}
DebugLog.d("isMiUIV6:" true);
Window window = context.getWindow();
Class clazz = window.getClass();
try {
int tranceFlag = 0;
int darkModeFlag = 0;
Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_TRANSPARENT");
tranceFlag = field.getInt(layoutParams);
field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
if (type == 0){
extraFlagField.invoke(window, tranceFlag, tranceFlag);//只需要状态栏透明
}else if(type == 1){
extraFlagField.invoke(window, tranceFlag | darkModeFlag, tranceFlag | darkModeFlag);//状态栏透明且黑色字体
}else {
extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体
}
}catch (Exception e){
}
}
private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
private static boolean isMiUIV6() {
try {
final BuildProperties prop = BuildProperties.newInstance();
String name = prop.getProperty(KEY_MIUI_VERSION_NAME, "");
if ("V6".equals(name)){
returntrue;
}else {
return false;
}
//return prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null
//|| prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null
//|| prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null;
} catch (final IOException e) {
return false;
}
}/code
【JAVA状态栏沉浸代码 java项目栏】关于JAVA状态栏沉浸代码和java项目栏的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。

    推荐阅读