时间:2015-05-15 来源:

Android之framework修改底部导航栏NavigationBar动态显示和隐藏 【编程语言】

       大家都知道psd切图html,主要是为那些没有实体按键的设备提供虚拟按键,团队网页接活但是,div切图排版它始终固定在底部div页面,占用48dp的像素高度,手机页面切图排版尽管从android 4.4开始可以全透明div+css+js切图,使用这一部分像素,div+css+js切图但三个按钮始终悬浮在屏幕上承接网站前端,这对于有强迫症的朋友来说是无法忍受的.因此,页面div重构本文的目的就是修改framework部分代码psd切图html,同时又尽量不影响系统的正常.

PhoneWindowManager.java的修改主要是实现onSwipeFromBottom(竖屏时)和onSwipeFromRight(横屏时)两个接口web外包,在showNavigationBar函数中网页切图制作,我们调用StatusBarManagerService服务中的showNavigationBar函数,div页面具体如下:

②重新添加NavigationBarView时需要恢复NavigationBarView之前的状态div+css+js切图,比如说隐藏前时是透明的、显示输入法按钮、菜单键等等.③本文是在Android5.0的代码上修改的,div+css+js切图其他版本未验证.

到此承接网站前端,隐藏NavigationBar告一段落了.

这时事件传递到了StatusBarManagerService中,承接网站前端我们来看看StatusBarManagerService.java如何实现showNavigationBar:

diff --git a/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index bb53e12..907202d 100644 --- a/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -1241,27 @@ public class PhoneWindowManager implements WindowManagerPolicy { public void onSwipeFromBottom() { if (mNavigationBar != null && mNavigationBarOnBottom) { requestTransientBars(mNavigationBar); + Log.i("way", "onSwipeFromBottom..."); + showNavigationBar(); + } + //END liweiping } @Override public void onSwipeFromRight() { if (mNavigationBar != null && !mNavigationBarOnBottom) { requestTransientBars(mNavigationBar); + Log.i("way", "onSwipeFromRight..."); + showNavigationBar(); } + //END liweiping } @Override public void onDebug() { @@ -1293,24 @@ public class PhoneWindowManager implements WindowManagerPolicy { goingToSleep(WindowManagerPolicy.OFF_BECAUSE_OF_USER); } } - + //BEGIN liweiping + private void showNavigationBar(){ + mHandler.post(new Runnable() { + @Override + public void run() { + try { + IStatusBarService statusbar = getStatusBarService(); + if (statusbar != null) { + statusbar.showNavigationBar(); + } + } catch (RemoteException e) { + // re-acquire status bar service next time it is needed. + mStatusBarService = null; + } + } + }); + } + //END liweiping private void updateKeyAssignments() { final boolean hasMenu = (mDeviceHardwareKeys & KEY_MASK_MENU) != 0; final boolean hasHome = (mDeviceHardwareKeys & KEY_MASK_HOME) != 0;

CommandQueue.java收到了这个消息之后承接网站前端,绕了大半天psd切图html,消息终于回来了,psd切图html我们就是需要在PhoneStatusBar.java实现显示NavigationBar的函数了:

主要思路:

①.增加按钮实现动态隐藏web外包,主要修改在frameworks/base/packages/SystemUI模块,div切图排版首先我们增加一个按钮网页切图制作,主要修改

④本文仅是提供一种思路,手机页面切图排版并非最优方案.

 

在NavigationBar的布局左部加入一个Button(在SystemUI模块实现),即将NavigationBar从WindowManager中移除掉.需要的时候承接网站前端,通过一个从屏幕底部向上的滑动手势(在policy模块实现)调出NavigationBar.如下两图对比所示:一张为移除前,页面div重构另一张为移除后.

也许大家会有疑问psd切图html,为什么是在policy模块修改?其实我这只是一种解决方案,psd切图html因为我知道

②.接下来便是显示NavigationBar,这个修改相对复杂一点.因为此时NavigationBar处于不可见状态,web外包我们无法通过增加按钮的方式让其显示网页切图制作,但是我们知道,div页面状态栏下拉通过手势向下滑动即可.因此很容易便想到通过手势从屏幕底部向上滑动来显示NavigationBar.我的想法是在policy模块中增加一个接口div+css+js切图,通过frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java服务传递到状态栏中,div+css+js切图从而触发显示NavigationBar事件.

⑤转载请注明出处:http://blog.csdn.net/way_ping_li

diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 9db875f..4f24b6e 100644 --- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -56,7 @@ public class CommandQueue extends IStatusBar.Stub { private static final int MSG_BUZZ_BEEP_BLINKED = 15 << MSG_SHIFT; private static final int MSG_NOTIFICATION_LIGHT_OFF = 16 << MSG_SHIFT; private static final int MSG_NOTIFICATION_LIGHT_PULSE = 17 << MSG_SHIFT; + private static final int MSG_SHOW_NAVIGATIONBAR = 18 << MSG_SHIFT;//ADD liweiping public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; @@ -83,7 @@ public class CommandQueue extends IStatusBar.Stub { public void animateCollapsePanels(int flags); public void animateExpandSettingsPanel(); public void setSystemUiVisibility(int vis, int vis, boolean showImeSwitcher); @@ -154,14 @@ public class CommandQueue extends IStatusBar.Stub { mHandler.obtainMessage(MSG_SET_SYSTEMUI_VISIBILITY, mask,6 +293, msg.arg2); break; + //BEGIN liweiping + case MSG_SHOW_NAVIGATIONBAR: + mCallbacks.showNavigationBar(); + break; + //END liweiping case MSG_TOP_APP_WINDOW_CHANGED: mCallbacks.topAppWindowChanged(msg.arg1 != 0); break;

最后便是在frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java实现点击事件了:+ private final OnClickListener mHideBarClickListener = new OnClickListener() { + @Override + public void onClick(View view) { + Log.i("way", "removeNavigationBar: about to remove " + mNavigationBarView); + if (mNavigationBarView == null) return; + + mWindowManager.removeView(mNavigationBarView); + mNavigationBarView = null; + }

需要注意的是:

diff --git a/frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index f85e2d9..3f75840 100644 --- a/frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -366,27 @@ public class StatusBarManagerService extends IStatusBarService.Stub { "WindowManager.LayoutParams"); } } + //BEGIN liweiping + @Override + public void showNavigationBar() { + enforceStatusBar(); + + android.util.Log.d("way", final int mask) { if (mSystemUiVisibility != vis) {

frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml文件psd切图html,图片资源和字符串我就不提了,psd切图html具体如下:

①显示NavigationBar时web外包,我之前有试过移除NavigationBarView后未置空网页切图制作,下次添加时直接使用,div页面会出现状态栏重启的情况div+css+js切图,具体原因未知,div+css+js切图log显示动画播放错误之类.

diff --git a/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml b/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml index 16027d9..326aafc 100644 --- a/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml +++ b/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml @@ -42,28 @@ > <!-- navigation controls --> + <!--BEGIN liweiping <View android:layout_width="40dp" android:layout_height="match_parent" android:layout_weight="0" android:visibility="invisible" /> + --> + <FrameLayout + android:layout_width="@dimen/navigation_extra_key_width" + android:layout_height="match_parent" + android:layout_weight="0" > + <ImageButton + android:id="@+id/hide_bar_btn" + android:layout_width="@dimen/navigation_extra_key_width" + android:layout_height="match_parent" + android:contentDescription="@string/accessibility_hide" + android:src="@drawable/ic_sysbar_hide" + /> + + </FrameLayout> + <!--END liweiping --> <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back" android:layout_width="@dimen/navigation_key_width" android:layout_height="match_parent" @@ -246,28 @@ android:layout_weight="0" android:contentDescription="@string/accessibility_back" /> + <!--BEGIN liweiping <View android:layout_height="40dp" android:layout_width="match_parent" android:layout_weight="0" android:visibility="invisible" /> + --> + <FrameLayout + android:layout_weight="0" + android:layout_width="match_parent" + android:layout_height="40dp" > + + <ImageButton + android:id="@+id/hide_bar_btn" + android:layout_width="match_parent" + android:layout_height="40dp" + android:contentDescription="@string/accessibility_hide" + android:src="@drawable/ic_sysbar_hide_land" + /> + </FrameLayout> + <!--END liweiping --> </LinearLayout> <!-- lights out layout to match exactly -->接下来修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java,为按钮提供一个接口,web外包具体如下:diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 88e71e2..7545984 100644 --- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -45,7 @@ import com.android.systemui.R; import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.DelegateViewHelper; import com.android.systemui.statusbar.policy.DeadZone; +import com.android.systemui.statusbar.policy.KeyButtonRipple; import com.android.systemui.statusbar.policy.KeyButtonView; import java.io.FileDescriptor; @@ -265,13 @@ public class NavigationBarView extends LinearLayout { public View getImeSwitchButton() { return mCurrentView.findViewById(R.id.ime_switcher); } + //BEGIN liweiping + public View getHideBarButton() { + View view = mCurrentView.findViewById(R.id.hide_bar_btn); + view.setBackground(new KeyButtonRipple(getContext(),7 +420, TAG + " showNavigationBar..."); + forceAddNavigationBar(); + } + private void forceAddNavigationBar() { + // If we have no Navbar view and we should have one, R.layout.navigation_bar, reset System UI visibility! + } + private void prepareNavigationBarView(boolean forceReset) { + mNavigationBarView.reorient(); + mNavigationBarView.getRecentsButton().setOnClickListener(mRecentsClickListener); + mNavigationBarView.getRecentsButton().setOnTouchListener(mRecentsPreloadOnTouchListener); + mNavigationBarView.getRecentsButton().setLongClickable(true); + mNavigationBarView.getRecentsButton().setOnLongClickListener(mLongPressBackRecentsListener); + mNavigationBarView.getBackButton().setLongClickable(true); + mNavigationBarView.getBackButton().setOnLongClickListener(mLongPressBackRecentsListener); + mNavigationBarView.getHomeButton().setOnTouchListener(mHomeActionListener); + mNavigationBarView.getHideBarButton().setOnClickListener(mHideBarClickListener);//ADD liweiping + + if (forceReset) { + // Nav Bar was added dynamically - we need to reset the mSystemUiVisibility and call + // setSystemUiVisibility so that mNavigationBarMode is set to the correct value + Log.i("way", /*SYSTEM_UI_VISIBILITY_MASK*/0xffffffff); + int hints = mNavigationIconHints; + mNavigationIconHints = 0; + setNavigationIconHints(hints); + topAppWindowChanged(mShowMenu); + } + + updateSearchPanel(); + } + + // For small-screen devices (read: phones) that lack hardware navigation buttons + private void addNavigationBar(boolean forceReset) { + if (DEBUG) Log.v(TAG, getNavigationBarLayoutParams()); + } + //END liweiping

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java 有现成的手势滑动接口.其实你也可以SystemUI中增加一个这样的事件psd切图html,我们需要的就是这么一个触发事件.

从上述代码可以看出,psd切图htmlStatusBarManagerService只是起到一个传递作用web外包,将消息传递到StatusBar中,web外包最终的实现是在SystemUI模块的frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java,如下所示:

点击次数:17199
作者:
web前端行业资讯
Web new NewsList
谷歌发布Tacotron2:能更简单地训练AI学习演讲 ,,2017年12月21日TensorFlow漏洞爆发背后:关于AI安全我们的傻与天真 ,,2017年12月21日Android端Edge浏览器新版发布:常规性能优化和BUG修复 ,,2017年12月21日三星开发出全球最小的DRAM芯片技术领先优势扩大 ,,2017年12月21日腾讯绝艺AI下一步将学习AlphaGozero自对弈训练 ,,2017年12月21日Facebook社交VR应用Spaces扩大覆盖面:入驻HTCVive ,,2017年12月21日设计图曝光:三星双屏折叠手机原来是这样的 ,,2017年12月21日微信支付和支付宝已成为世界移动支付的"老师" ,,2017年12月21日新专利表明FaceID未来有望装备在iPad、MacBook和iMac等设备 ,,2017年12月21日首批九个建议加入EE4J的项目 ,,2017年12月21日这就是SurfacePhone?微软可折叠手机概念图曝光 ,,2017年12月21日继“Angel”开源后,腾讯又开放TDinsight机器学习平台 ,,2017年12月21日谷歌母公司研发“闪光”网络技术无需铺设线缆 ,,2017年12月21日微软投资5千万美元利用人工智能对抗气候变化 ,,2017年12月21日谷歌中国2017:面向开发者的1年AI先行的1年 ,,2017年12月21日GreenKey加入Symphony软件基金会,将开源语音软件 ,,2017年12月21日腾讯发现者揭秘:怎么应对TensorFlow的安全风险,修复有多难 ,,2017年12月21日清华新成立两大交叉研究机构探索智能与未来 ,,2017年12月21日微软将AI融入生产力工具和搜索引擎与其它巨头竞争 ,,2017年12月21日Gfycat将利用机器学习技术创建高分辨率GIF动图 ,,2017年12月21日安全软件公司Avast开源化机器码反编译器RetDec ,,2017年12月21日谷歌开源TFGAN,让训练和评估GAN变得更加简单 ,,2017年12月21日社区对模块化不感兴趣时隔三周经典版FedoraServer27发布 ,,2017年12月21日Windows10加入OpenSSH客户端 ,,2017年12月21日FirefoxQuantum发布一个月安装量1.7亿 ,,2017年12月21日吴恩达宣布创业新项目已与富士康达成战略合作 ,,2017年12月21日Scala入门系列(十二):隐式转换2017年12月20日speedment入门教程2017年12月20日SLAM入门笔记(1):特征点的匹配2017年12月20日深入浅出了解frame和bounds2017年12月20日SharePoint开发-自定义导航菜单(一)菜单声明与配置2014年12月19日Android开源框架Universal-Image-Loader详解2014年12月16日ZOJ3332StrangeCountryII 【综合】2015年04月24日通过操作系统上的PID找出相应的SQL语句【数据库】2015年02月09日jQuery对称三角箭头【Web前端】2015年03月02日界面设计原则之一篇:权衡优先级突出焦点划分好内容层级【编程语言】2015年03月17日mysql数据类型总结【移动开发】2015年07月07日HDU1258SumItUp【编程语言】2015年03月27日Marchingsquares&Marchingcubes 【编程语言】2015年07月27日java.io.FileNotFoundException:optapache-tomcat-7.0.57confserver.xml(权限不够) 【系统运维】2015年01月04日Android项目开发前准备工作(一)【综合】2015年02月09日程序员应该具备的十个项目习惯【综合】2015年05月15日成功就是坚持了别人不能坚持的【编程语言】2015年04月07日zoj3787AccessSystem 【编程语言】2015年03月12日androidapp开发,如何使用引入第三方扩展jar 【互联网】2014年12月22日Google西联汇款取款详细流程大家这个月就可以了啊2014年01月29日cookie的使用 【编程语言】2014年12月16日vs2013创建、安装、调试WindowsService程序 【研发管理】2015年07月15日POJ3241ObjectClustering二维平面曼哈顿距离最小生成树【综合】2015年05月15日C++Primer学习笔记_28_操作符重载与转换(3)--成员函数的重载、覆盖与隐藏、类型转换运算符、*运算符重载、->运算符重载 【Web前端】2015年08月07日(WPF)Storyboard【编程语言】2015年07月27日1号店回应用户信息泄露:可以赔钱但别嚷 ,,2016年06月23日【C++】LeetCode:56UniquePaths 【编程语言】2014年12月29日Dreamweaver8.0教程10.5-表单的应用2014年01月28日JavaScript的程序构成【互联网】2014年11月04日LepideMigratorforDocumentsStepbyStep 【编程语言】2015年02月04日hdu1576(AB) 【架构设计】2015年06月01日学会使用RecyclerView及Arrays.asList函数【移动开发】2015年03月09日呕心沥血两年所做--古典书屋--史上最灵动的电脑读书软件【移动开发】2015年04月17日Word遇到问题需要关闭解决方法2014年01月28日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)