前言
本文章只做一個(gè)記錄,一個(gè)備忘,也為了更好的幫助他人纪他,文章參考地址:Android適配底部虛擬按鍵的方法
問題說明
項(xiàng)目進(jìn)行中需要透明漸變的狀態(tài)欄,全屏顯示晾匠,當(dāng)然透明漸變好弄止喷,方法有很多,但是如果有虛擬按鍵的就有出一些問題混聊,底部按鍵總是會(huì)有問題,設(shè)置底部按鍵顏色吧乾巧,但是又不好看句喜,一直隱藏用戶體驗(yàn)肯定不好。那怎么辦呢沟于,我們往下看咳胃。
- 每次進(jìn)入界面時(shí)虛擬按鍵自動(dòng)隱藏
- 手動(dòng)滑出虛擬按鍵,當(dāng)不操作屏幕時(shí)定時(shí)自動(dòng)隱藏
- 當(dāng)滑出狀態(tài)欄時(shí)虛擬按鍵會(huì)跟著出來旷太,也要處理讓其和狀態(tài)欄在不操作時(shí)自動(dòng)隱藏
這樣的效果才是好的
實(shí)現(xiàn)
代碼實(shí)現(xiàn)
public class MyActivity extends AppCompatActivity {
private View decorView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
//獲取頂層視圖
decorView = getWindow().getDecorView();
}
@Override
protected void onStart() {
//調(diào)用配置
init();
super.onStart();
}
private void init(){
int flag = 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 // hide
// | View.SYSTEM_UI_FLAG_FULLSCREEN // 不隱藏狀態(tài)欄展懈,因?yàn)殡[藏了比如時(shí)間電量等信息也會(huì)隱藏
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
//判斷當(dāng)前版本在4.0以上并且存在虛擬按鍵,否則不做操作
if (Build.VERSION.SDK_INT < 19 || !checkDeviceHasNavigationBar()) {
//一定要判斷是否存在按鍵供璧,否則在沒有按鍵的手機(jī)調(diào)用會(huì)影響別的功能存崖。如之前沒有考慮到,導(dǎo)致圖傳全屏變成小屏顯示睡毒。
return;
} else {
//自定義工具来惧,設(shè)置狀態(tài)欄顏色是透明
ViewUtil.setWindowStatusBarColor(this,R.color.transparent);
// 獲取屬性
decorView.setSystemUiVisibility(flag);
}
}
/**
* 判斷是否存在虛擬按鍵
* @return
*/
public boolean checkDeviceHasNavigationBar() {
boolean hasNavigationBar = false;
Resources rs = getResources();
int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
if (id > 0) {
hasNavigationBar = rs.getBoolean(id);
}
try {
Class<?> systemPropertiesClass = Class.forName("android.os.SystemProperties");
Method m = systemPropertiesClass.getMethod("get", String.class);
String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
if ("1".equals(navBarOverride)) {
hasNavigationBar = false;
} else if ("0".equals(navBarOverride)) {
hasNavigationBar = true;
}
} catch (Exception e) {
}
return hasNavigationBar;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
注:有些時(shí)候要手動(dòng)去調(diào)用上述代碼中init()配置方法隱藏按鍵。如彈出dialog時(shí)虛擬按鍵會(huì)出來演顾,此時(shí)要手動(dòng)調(diào)用隱藏供搀,還有彈出鍵盤等等。
只是記錄钠至,以后遇到這種問題可以參考