Android客制化------6.0底部导航栏增加隐藏按钮
2016-10-12 15:43
387 查看
关于导航栏这一块按钮的增加其实网上也有很多的例子了,最多的可能就是一个关于音量加减的例子。
最近客户有要求做这么一个功能,即在底部导航栏再添加一个按钮,通过这个按钮来实现导航栏虚拟按键的隐藏与显示。但无论导航栏隐藏与否,这个按钮都不会消失,也就是会常驻导航栏。
我们知道关于通知栏、导航栏、下拉菜单实质上是一个SystemUI.apk。这部分的源码位于:/frameworks/base/packages/SystemUI
在网上很多关于SystemUI讲解的例子,在此我也不献丑了。
控制底部导航栏的xml文件是:navigation_bar.xml。位于:frameworks\base\packages\SystemUI\res\layout-sw600dp\navigation_bar.xml
注意这个xml在res目录下的很多文件夹内都存在,之前我改的地方是layout目录,无论怎么修改都无法让图片显示,在这里滞留了很久,最后与同事沟通,才改对地方。
话不多说,直接上代码了。
到这里的话,功能基本上就实现了,其实逻辑上是很简单的。
由于是第一次在CSDN上写文章,有哪里不对之处,还请大家帮忙指出。谢谢。
最近客户有要求做这么一个功能,即在底部导航栏再添加一个按钮,通过这个按钮来实现导航栏虚拟按键的隐藏与显示。但无论导航栏隐藏与否,这个按钮都不会消失,也就是会常驻导航栏。
我们知道关于通知栏、导航栏、下拉菜单实质上是一个SystemUI.apk。这部分的源码位于:/frameworks/base/packages/SystemUI
在网上很多关于SystemUI讲解的例子,在此我也不献丑了。
控制底部导航栏的xml文件是:navigation_bar.xml。位于:frameworks\base\packages\SystemUI\res\layout-sw600dp\navigation_bar.xml
注意这个xml在res目录下的很多文件夹内都存在,之前我改的地方是layout目录,无论怎么修改都无法让图片显示,在这里滞留了很久,最后与同事沟通,才改对地方。
话不多说,直接上代码了。
diff --git a/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml b/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml index b576dfa..e275fb1 100755 --- a/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml +++ b/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml @@ -108,6 +108,18 @@ android:visibility="invisible" systemui:keyCode="24" /> + + <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/hide" + android:layout_width="120dp" + android:layout_height="match_parent" + android:layout_weight="0" + android:paddingLeft="0dp" + android:paddingRight="0dp" + android:scaleType="centerInside" + android:src="@drawable/ic_sysbar_hide_down" + android:clickable="true" + /> + <Space android:layout_width="match_parent" android:layout_height="match_parent" @@ -288,6 +300,18 @@ android:visibility="invisible" systemui:keyCode="24" /> + + <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/hide" + android:layout_width="84dp" + android:layout_height="match_parent" + android:layout_weight="0" + android:paddingLeft="0dp" + android:paddingRight="0dp" + android:scaleType="centerInside" + android:src="@drawable/ic_sysbar_hide_down" + android:clickable="true" + /> + <Space android:layout_width="match_parent" android:layout_height="match_parent"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/Nav index 68973e6..84cc3b4 100755 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -77,7 +77,7 @@ public class NavigationBarView extends LinearLayout { int mDisabledFlags = 0; int mNavigationIconHints = 0; - private Drawable mBackIcon, mBackLandIcon, mBackAltIcon, mBackAltLandIcon; + private Drawable mBackIcon, mBackLandIcon, mBackAltIcon, mBackAltLandIcon,down,up; private Drawable mRecentIcon; private Drawable mRecentLandIcon; @@ -269,6 +269,10 @@ public class NavigationBarView extends LinearLayout { public View getScreenshotButton(){ return mCurrentView.findViewById(R.id.screenshot); } + public View gethideButton() { + return mCurrentView.findViewById(R.id.hide); + } private void getIcons(Resources res) { mBackIcon = res.getDrawable(R.drawable.ic_sysbar_back); @@ -278,6 +282,13 @@ public class NavigationBarView extends LinearLayout { mRecentIcon = res.getDrawable(R.drawable.ic_sysbar_recent); mRecentLandIcon = mRecentIcon; } + public void downIcons(Resources res) { + ((ImageView)gethideButton()).setImageDrawable(res.getDrawable(R.drawable.ic_sysbar_hide_down)); + } + public void upIcons(Resources res) { + ((ImageView)gethideButton()).setImageDrawable(res.getDrawable(R.drawable.ic_sysbar_hide_up)); + } @Override public void setLayoutDirection(int layoutDirection) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusB 4000 ar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneS index 09b9e5d..8e1bf27 100755 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.phone; - import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.NonNull; @@ -200,6 +199,9 @@ import android.os.Handler; import android.util.Log; import com.android.systemui.screenshot.ScreenshotUtils; +import android.graphics.drawable.Drawable; + public class PhoneStatusBar extends BaseStatusBar implements DemoMode, DragDownHelper.DragDownCallback, ActivityStarter, OnUnlockMethodChangedListener, HeadsUpManager.OnHeadsUpChangedListener { @@ -1202,6 +1204,32 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, toggleRecentApps(); } }; + + //Drawable down =mContext.getResources().getDrawable(R.drawable.ic_sysbar_hide_down); + //Drawable up =mContext.getResources().getDrawable(R.drawable.ic_sysbar_hide_up); + private boolean upordown =true; + private View.OnClickListener mhideButton = new View.OnClickListener() { + public void onClick(View v) { + if(upordown==true){ + mNavigationBarView.getRecentsButton().setVisibility(View.INVISIBLE); + mNavigationBarView.getHomeButton().setVisibility(View.INVISIBLE); + mNavigationBarView.getBackButton().setVisibility(View.INVISIBLE); + mNavigationBarView.getVolumeAddButton().setVisibility(View.INVISIBLE); + mNavigationBarView.getVolumeSubButton().setVisibility(View.INVISIBLE); + mNavigationBarView.upIcons(mContext.getResources()); + upordown=false; + }else{ + mNavigationBarView.getRecentsButton().setVisibility(View.VISIBLE); + mNavigationBarView.getHomeButton().setVisibility(View.VISIBLE); + mNavigationBarView.getBackButton().setVisibility(View.VISIBLE); + mNavigationBarView.getVolumeAddButton().setVisibility(View.VISIBLE); + mNavigationBarView.getVolumeSubButton().setVisibility(View.VISIBLE); + mNavigationBarView.downIcons(mContext.getResources()); + upordown=true; + } + } + }; private long mLastLockToAppLongPress; private View.OnLongClickListener mLongPressBackRecentsListener = @@ -1281,6 +1309,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mNavigationBarView.getScreenshotButton().setVisibility(View.INVISIBLE); } mNavigationBarView.getScreenshotButton().setOnTouchListener(mScreenshotPreloadOnTouchListener); + mNavigationBarView.gethideButton().setOnClickListener(mhideButton); mNavigationBarView.getRecentsButton().setOnClickListener(mRecentsClickListener); mNavigationBarView.getRecentsButton().setOnTouchListener(mRecentsPreloadOnTouchListener);
到这里的话,功能基本上就实现了,其实逻辑上是很简单的。
由于是第一次在CSDN上写文章,有哪里不对之处,还请大家帮忙指出。谢谢。
相关文章推荐
- Android之framework修改底部导航栏NavigationBar动态显示和隐藏
- Android仅2步实现 滚粗 汉堡导航栏效果~ 全新底部导航交互(滑动隐藏)
- Android隐藏虚拟按键(底部导航栏)
- Android隐藏虚拟菜单(虚拟按钮导航栏)
- Android 隐藏底部导航栏和状态栏,动态调用导航栏,键盘收回时也收回导航栏
- Android仅2步实现 滚粗 汉堡导航栏效果~ 全新底部导航交互(滑动隐藏)
- android——暴力隐藏底部导航栏
- Android 底部导航栏中间凸起、动态配置替换底部导航栏Tab图标(按钮、标签)的实现方案
- Android RadioGroup+ViewPager+ActionBar实现仿微信6.0界面(底部滑动菜单栏+导航栏)
- Android之framework修改底部导航栏NavigationBar动态显示和隐藏
- Android 底部导航栏动态显示和隐藏(上滑,下拉)
- Android4.2.2 动态显示隐藏屏幕底部的导航栏(对系统源码进行修改)
- Android之framework修改底部导航栏NavigationBar动态显示和隐藏
- Android之framework修改底部导航栏NavigationBar动态显示和隐藏
- Android 底部导航栏按钮突出
- Android之framework修改底部导航栏NavigationBar动态显示和隐藏
- Android之framework修改底部导航栏NavigationBar动态显示和隐藏
- 三分钟彻底禁用、隐藏Android设备底部虚拟按钮(亲测有效)
- Android WebView 滚动方向判断同时底部导航栏隐藏或显示(动画效果)
- Android应用底部导航栏(选项卡)实例