大家好,欢迎来到IT知识分享网。
先上个正常模式的图(请自觉忽略画质)
屏幕显示分为上部分状态栏,下部分导航栏(上有三个虚拟按键),中间主要显示部分。我们今天要做的就是对导航栏进行操作。
话不多说,直接上步骤咯。
更改1:隐藏导航栏
这部分功能是使用了沉浸模式的更改
在文件 ./frameworks/base/core/java/android/app/Activity.java 下找到onWindowFocusChanged()对其进行复写,此函数内部默认是空的,加上以下代码及可实现沉浸模式:
public void onWindowFocusChanged(boolean hasFocus) {
if(hasFocus && Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
decorView.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);
}
那么什么是沉浸模式呢?直接看效果图。
英语还可以的童鞋们应该看得到代码里有一个FULLSCREEN,就是全屏的意思。这段代码是实现的功能就是自动隐藏主要显示部分之外的其他部分,就是玩什么农药的时候那种效果啦。状态栏,导航栏全部隐藏,另外下滑手势会显示。
那么隐藏导航栏怎么操作呢?如下,只留跟导航相关的两条就可以咯。
public void onWindowFocusChanged(boolean hasFocus) {
if(hasFocus && Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION );
}
同样看显示效果:
到此,自动隐藏导航栏效果实现。接下来进行第二步,显示:
更改2:上划显示导航栏
这部分是使用了广播的接收发送来实现的。分为两步,一步发送广播,一步是接收处理广播。
第一步:
vi frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
顾名思义,mSystemGestures是跟系统手势操作相关。在此处复写onSwipeFromBottom(),onSwipeFromRight()函数。前者为竖屏时的上划操作,后者为横屏时的上划操作,分别在后边添加广播。
第二步:
vi frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
寻找start()函数public void start()
在这个函数末尾添加广播监听。
添加相关处理函数:
@Override
public void start() {
mDisplay = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
updateDisplaySize();
mScrimSrcModeEnabled = mContext.getResources().getBoolean(
R.bool.config_status_bar_scrim_behind_use_src);
/// M: [SystemUI] Support Smartbook Feature. @{
if (SIMHelper.isMtkSmartBookSupport()) {
/// M: [ALPS0] Query the plug-in state as soon as possible.
mIsDisplayDevice = SIMHelper.isSmartBookPluggedIn(mContext);
Log.v(TAG, “start, mIsDisplayDevice=” + mIsDisplayDevice);
}
/// @}
super.start(); // calls createAndAddWindows()
mMediaSessionManager
= (MediaSessionManager) mContext.getSystemService(Context.MEDIA_SESSION_SERVICE);
// TODO: use MediaSessionManager.SessionListener to hook us up to future updates
// in session state
addNavigationBar();
// Lastly, call to the icon policy to install/update all the icons.
mIconPolicy = new PhoneStatusBarPolicy(mContext, mCastController, mHotspotController);
mSettingsObserver.onChange(false); // set up
mHeadsUpObserver.onChange(true); // set up
if (ENABLE_HEADS_UP) {
mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED), true,
mHeadsUpObserver);
mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(SETTING_HEADS_UP_TICKER), true,
mHeadsUpObserver);
}
mUnlockMethodCache = UnlockMethodCache.getInstance(mContext);
mUnlockMethodCache.addListener(this);
startKeyguard();
mDozeServiceHost = new DozeServiceHost();
putComponent(DozeHost.class, mDozeServiceHost);
putComponent(PhoneStatusBar.class, this);
setControllerUsers();
notifyUserAboutHiddenNotifications();
mScreenPinningRequest = new ScreenPinningRequest(mContext);
IntentFilter filter = new IntentFilter();
filter.addAction(“GestureShowNavigationBar”);
mContext.registerReceiver(navBarBroadcastReceiver,filter);
}
private BroadcastReceiver navBarBroadcastReceiver = new GestureShowNavigationBarBroadcast();
private static boolean isNavigationShow = true ;
class GestureShowNavigationBarBroadcast extends BroadcastReceiver{
public GestureShowNavigationBarBroadcast() {
super();
}
@Override
public void onReceive(Context context, Intent intent) {
Log.v(TAG, “receiver show navigation bar broadcast”);
if(isNavigationShow){
return ;
}
showNavigationBar();
}
@Override
public IBinder peekService(Context myContext, Intent service) {
return super.peekService(myContext, service);
}
}
public void showNavigationBar() {
mNavigationBarView =(NavigationBarView) View.inflate(mContext, R.layout.navigation_bar, null);
mNavigationBarView.setBar(this);
prepareNavigationBarView();
addNavigationBar();
isNavigationShow = true;
mNavigationBarView.setBackgroundColor(Color.TRANSPARENT);
Log.v(TAG,”show navigation”);
}
完成!
Tips:
因为各个项目不同,所在具体目录也许也不相同,但是大体位置以及文件名一般是相同的,此时可借助find -name命令来查询该文件具体位置。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/56355.html