Android实战——导航栏自动隐藏与手势上划显示

Android实战——导航栏自动隐藏与手势上划显示屏幕显示分为上部分状态栏,下部分导航栏,中间主要显示部分。因为各个项目不同,所在具体目录也许也不相同,但是大体位置以及文件名一般是相同的,此时可

大家好,欢迎来到IT知识分享网。

先上个正常模式的图(请自觉忽略画质)

Android实战——导航栏自动隐藏与手势上划显示

正常模式的显示

屏幕显示分为上部分状态栏,下部分导航栏(上有三个虚拟按键),中间主要显示部分。我们今天要做的就是对导航栏进行操作。

话不多说,直接上步骤咯。

更改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);

}

那么什么是沉浸模式呢?直接看效果图。

Android实战——导航栏自动隐藏与手势上划显示

英语还可以的童鞋们应该看得到代码里有一个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 );

}

同样看显示效果:

Android实战——导航栏自动隐藏与手势上划显示

到此,自动隐藏导航栏效果实现。接下来进行第二步,显示:

更改2:上划显示导航栏

这部分是使用了广播的接收发送来实现的。分为两步,一步发送广播,一步是接收处理广播。

第一步:

vi frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

Android实战——导航栏自动隐藏与手势上划显示

顾名思义,mSystemGestures是跟系统手势操作相关。在此处复写onSwipeFromBottom(),onSwipeFromRight()函数。前者为竖屏时的上划操作,后者为横屏时的上划操作,分别在后边添加广播。

第二步:

vi frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

寻找start()函数public void start()

在这个函数末尾添加广播监听。

Android实战——导航栏自动隐藏与手势上划显示

添加相关处理函数:

Android实战——导航栏自动隐藏与手势上划显示


@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

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信