關(guān)于沉浸式的定義,這里不作爭(zhēng)論...
透明狀態(tài)欄,透明導(dǎo)航欄
通過(guò)主題配置
styles.xml
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"/>
</resources>
res下新建values-v19,values-v21文件夾
values-v19下添加styles.xml
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- 表示狀態(tài)欄透明,并且會(huì)使得狀態(tài)欄懸浮在activity之上(activity布局會(huì)擴(kuò)展到狀態(tài)欄底部) -->
<item name="android:windowTranslucentStatus">true</item>
<!-- 表示導(dǎo)航欄半透明,并且會(huì)使得狀態(tài)欄和導(dǎo)航欄都懸浮在activity之上 -->
<item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>
values-v21下添加styles.xml
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- 表示狀態(tài)欄透明讥蔽,并且會(huì)使得狀態(tài)欄懸浮在activity之上(activity布局會(huì)擴(kuò)展到狀態(tài)欄底部) -->
<item name="android:windowTranslucentStatus">false</item>
<!-- 表示導(dǎo)航欄半透明拧略,并且會(huì)使得狀態(tài)欄和導(dǎo)航欄都懸浮在activity之上 -->
<item name="android:windowTranslucentNavigation">true</item>
<!--Android 5.x開(kāi)始需要把顏色設(shè)置透明绷杜,否則導(dǎo)航欄會(huì)呈現(xiàn)系統(tǒng)默認(rèn)的顏色-->
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>
OK,我們看下我們的布局,然后看效果,布局隨便寫(xiě)的,就是一個(gè)ScrollView套了一張圖而已
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#1478d5"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/a"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
下面我們看下效果:
[========]
使用代碼實(shí)現(xiàn)
當(dāng)然,記得styles.xml保留下NoActionBar
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"/>
</resources>
protected void initBar() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上
//獲取頂級(jí)窗口
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN //全屏標(biāo)志,布局侵入
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION //標(biāo)志布局會(huì)侵入到導(dǎo)航欄下
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE; //保持穩(wěn)定
decorView.setSystemUiVisibility(option); //設(shè)置系統(tǒng)UI可見(jiàn)屬性
getWindow().setStatusBarColor(Color.TRANSPARENT); //設(shè)置狀態(tài)欄顏色透明
getWindow().setNavigationBarColor(Color.TRANSPARENT); //設(shè)置導(dǎo)航欄顏色透明
//設(shè)置狀態(tài)欄為半透明
//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//設(shè)置導(dǎo)航欄為半透明
//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0
WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS |
localLayoutParams.flags);
}
}
效果如下:
附贈(zèng):窗口的層級(jí)的經(jīng)典圖片
當(dāng)然,你也可以設(shè)置導(dǎo)航欄為別的顏色
例如:
getWindow().setStatusBarColor(Color.parseColor("#581478d5")); //設(shè)置狀態(tài)欄顏色
getWindow().setNavigationBarColor(Color.parseColor("#581478d5")); //設(shè)置導(dǎo)航欄顏色
或者你把這兩句代碼去掉,直接設(shè)置或者在主題編輯器中修改
效果如下:
附贈(zèng)另一張經(jīng)典圖片:
[========]
有時(shí)候我們不想讓布局中的內(nèi)容也侵入到狀態(tài)欄怎么辦呢?
加個(gè)margin或padding唄!
效果如下:
等等walle9,我的特么的為什么是白乎乎的?
哈哈,難道你沒(méi)看到我早已在LinearLayout上添加了一個(gè)顏色?...
可是我還有個(gè)問(wèn)題,我就想讓magin的值跟狀態(tài)欄的高度一樣怎么做呀?
嗯!寫(xiě)成30試試....或者代碼中算一下高度唄!
其實(shí)我們還可以使用android:fitsSystemWindows這個(gè)屬性來(lái)設(shè)置.
fitsSystemWindows只作用在sdk>=19的系統(tǒng)上就是高于4.4的系統(tǒng)
這個(gè)屬性可以給任何view設(shè)置,只要設(shè)置了這個(gè)屬性此view的所有padding屬性失效.
只有在設(shè)置了透明狀態(tài)欄(StatusBar)或者導(dǎo)航欄(NavigationBar)此屬性才會(huì)生效
同時(shí),所有設(shè)置了android:fitsSystemWindows=”true”屬性的view會(huì)自動(dòng)添加一個(gè)值等于狀態(tài)欄高度的paddingTop,會(huì)自動(dòng)添加一個(gè)值等于導(dǎo)航欄高度的paddingBottom
來(lái)唄!試一下!
頂出來(lái)了,有木有!
日了狗了!你又騙老子!
騷年啊!我沒(méi)有騙你啊!下面的margin咱們忘記去掉了不是么!再試一下好咯!
恩恩!這次一樣大了!
聽(tīng)說(shuō)使用android:fitsSystemWindows="true"這個(gè)屬性的view中的padding值會(huì)失效,咱們?cè)囋噯h!
先試padding值:
效果如下:
加上android:fitsSystemWindows="true"
效果如下:
但是,需要注意哦,在我們滑動(dòng)到最底部的時(shí)候,底部導(dǎo)航也會(huì)出現(xiàn)一個(gè)padding值,如果你介意的話,那就用magin或padding來(lái)設(shè)置.寫(xiě)個(gè)相近值或者代碼中計(jì)算具體值.
下面我們?cè)诖a中計(jì)算:
沒(méi)啥好說(shuō)的,先設(shè)置一個(gè)id....
當(dāng)然,你愿意在最外層那個(gè)linearlayout上面設(shè)置也可以,你高興就好!
代碼中找到這個(gè)控件,計(jì)算出狀態(tài)欄的高度,設(shè)置padding...
private void initStatusBar() {
int statusBarHeight = getStatusBarHeight();
LinearLayout ll =findViewById(R.id.ll);
ll.setPadding(0,statusBarHeight,0,0);
}
獲取狀態(tài)欄高度:
private int getStatusBarHeight() {
int result = 0;
int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
result = getResources().getDimensionPixelSize(resId);
}
return result;
}
再次附贈(zèng):獲取導(dǎo)航欄高度
public float getNavigationBarHeight() {
float result = 0;
int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimension(resourceId);
}
return result;
}
效果如下:
[========]
沉浸式
并不是所有的手機(jī)都像華為那樣自帶隱藏虛擬導(dǎo)航鍵的功能,虛擬導(dǎo)航鍵擋住了布局的底部導(dǎo)航怎么辦呢?
騷年!看這里!自動(dòng)隱藏導(dǎo)航...
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY //粘性沉浸體驗(yàn)
|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION //布局侵入導(dǎo)航
|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION //隱藏導(dǎo)航
//|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN //全屏標(biāo)記,布局侵入
//|View.SYSTEM_UI_FLAG_FULLSCREEN //隱藏狀態(tài)欄
|View.SYSTEM_UI_FLAG_LAYOUT_STABLE //保持穩(wěn)定
);
}
}
效果如下:
自動(dòng)隱藏狀態(tài)欄:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY //粘性沉浸體驗(yàn)
|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION //布局侵入導(dǎo)航
//|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION //隱藏導(dǎo)航
|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN //全屏標(biāo)記,布局侵入
|View.SYSTEM_UI_FLAG_FULLSCREEN //隱藏狀態(tài)欄
|View.SYSTEM_UI_FLAG_LAYOUT_STABLE //保持穩(wěn)定
);
}
}
效果如下:
機(jī)智的你早已放開(kāi)了一切...
那么恭喜你,你學(xué)會(huì)了沉浸式...
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY //粘性沉浸體驗(yàn)
|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION //布局侵入導(dǎo)航
|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION //隱藏導(dǎo)航
|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN //全屏標(biāo)記,布局侵入
|View.SYSTEM_UI_FLAG_FULLSCREEN //隱藏狀態(tài)欄
|View.SYSTEM_UI_FLAG_LAYOUT_STABLE //保持穩(wěn)定
);
}
}
效果如下:
over...
上傳圖片不容易,且復(fù)制且珍惜吧!