Android在44的时候增加了透明状态栏与导航栏的功能,依托于这个新特性,我们可以开始跟随潮流,实现Android的沉浸式状态栏 其实上图展示的这个关于界面的代码非常简单/
关于界面
@author SuS
@time 20150729
/
public class AboutActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
thissetContentView(Rlayoutactivity_about);
setImmerseLayout(findViewById(Ridcommon_back));
initBackButton();
setTitleBar(Rstringdurian_about);
}
@Override
protected void onResume() {
superonResume();
}
@Override
protected void onPause() {
superonPause();
}
@Override
protected void onDestroy() {
superonDestroy();
}
}
现在请注意setImmerseLayout()这个方法,这个方法是在BaseActivity中实现的public class BaseActivity extends FragmentActivity {
private static final String TAG = BaseActivity;
public void initBackButton() {
ImageView backButton = (ImageView) thisfindViewById(Riddurian_back_image);
backButtonsetOnClickListener(new ViewOnClickListener() {
@Override
public void onClick(View v) {
finishActivity();
}
});
}
protected void setImmerseLayout(View view) {
if (BuildVERSIONSDK_INT >= BuildVERSION_CODESKITKAT) {
Window window = getWindow();
/windowsetFlags(WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS,
WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS);/
windowaddFlags(WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS);
int statusBarHeight = ScreenUtilgetStatusBarHeight(thisgetBaseContext());
viewsetPadding(0, statusBarHeight, 0, 0);
}
}
public void finishActivity() {
finish();
overridePendingTransition(Ranimpush_right_in, Ranimpush_right_out);
}
public void setTitleBar(int id) {
TextView tvName = (TextView) findViewById(Riddurian_title_text);
tvNamesetText(id);
}
}
使用 windowsetFlags(WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS, WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS); 或者 windowaddFlags(WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS);
都可以使状态栏透明,但是关键是下面这两行代码,如果没有这两行,会是这样
那么这两行神奇的代码的原理是什么? 我们先看一下ScreenUtil中的getStatusBarHeight方法 /
用于获取状态栏的高度。 使用Resource对象获取(推荐这种方式)
@return 返回状态栏高度的像素值。
/
public static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = contextgetResources()getIdentifier(status_bar_height, dimen,
android);
if (resourceId > 0) {
result = contextgetResources()getDimensionPixelSize(resourceId);
}
return result;
}
这里是获得状态栏的高度,然后我们就可以通过设置common_back的padding属性 即:viewsetPadding(0, statusBarHeight, 0, 0)来达到终极效果 但是这里还是需要注意细节的,首先大家应该理解padding的含义:内边距 那么再看一下common_back的布局文件 在activity_aboutxml中我们是使用include引用的common_back
common_back的布局如下:
<framelayout android:background="@color/common_top_bg" android:id="@+id/durian_head_layout" android:layout_height="wrap_content" android:layout_width="match_parent" xmlns:android=">
android 上面标题栏的高度设置要根据状态栏设置保持一致。具体设置如下:
getWindow()getDecorView()getWindowVisibleDisplayFrame(rect);///取得整个视图部分,注意,如果你要设置标题样式,这个必须出现在标题样式之后,否则会出错
int top = recttop;////状态栏的高度,所以rectheight,rectwidth分别是系统的高度的宽度
View v = getWindow()findViewById(WindowID_ANDROID_CONTENT);///获得根视图
int top2 = vgetTop();///状态栏标题栏的总高度,所以标题栏的高度为top2-top
int width = vgetWidth();///视图的宽度,这个宽度好像总是最大的那个
int height = vgetHeight();////视图的高度,不包括状态栏和标题栏
如果只想取得屏幕大小,可以用
Display display = getWindowManager()getDefaultDisplay() ;
displaygetWidth();
displaygetHeight();代码见@Overridepublic void onWindowFocusChanged(boolean hasFocus) {
// TODO Auto-generated method stub
superonWindowFocusChanged(hasFocus);
Rect frame = new Rect();
getWindow()getDecorView()getWindowVisibleDisplayFrame(frame);
// 状态栏高度
int statusBarHeight = frametop;
View v = getWindow()findViewById(WindowID_ANDROID_CONTENT);
int contentTop = vgetTop();
// statusBarHeight是上面所求的状态栏的高度
int titleBarHeight = contentTop - statusBarHeight;
textView = (TextView) findViewById(RidtextView1);
textViewsetText(标题栏的高度 + IntegertoString(titleBarHeight) +
+ 标题栏高度 + statusBarHeight +
+ 视图的宽度 + vgetWidth()
+
+ 视图的高度(不包含状态栏和标题栏) + vgetHeight());
以上就是关于如何实现Android沉浸式状态栏全部的内容,包括:如何实现Android沉浸式状态栏、如何修改 Android 状态栏高度、android 上面标题栏该多高等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)