android menu pop弹出框的修改方案
来源:互联网 发布:扒一扒淘宝上的化妆刷 编辑:程序博客网 时间:2024/06/06 12:39
前段时间公司针对menu pop有个需求,需要弹出的menu pop框效果与小米的保持一致,在实现onCreateOptionsMenu方法的界面,对于竖屏显示,点击menu键,弹出的menu panel宽度与手机屏幕保持一致,高度为内容的高度;对于横屏的显示,点击menu键,弹出的menu panel高度与手机屏幕宽度保持一致,宽度为包裹内容大小。
对于这个需求,感觉瞬间头大了有木有,找不到修改点有木有。
查看点击menu的流程,从Activity——onCreateOptionsMenu方法进行查看,到PhoneWindow的onKeyUpPanel方法(中间的流程太繁琐,可以自己去看),在此方法中调用了openPanel方法,
openPanel的时候,使用WindowManger的layoutParames来进行界面的flag控制,原生的是:
WindowManager.LayoutParams lp = new WindowManager.LayoutParams( width, WRAP_CONTENT, st.x, st.y, WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, st.decorView.mDefaultOpacity);
下面为针对横竖屏切换的代码控制:int[] tempSt = makePanelFeatureState(st);int[] widthAndHeight = makeLandMenuWidth();
WindowManager.LayoutParams lp = new WindowManager.LayoutParams( widthAndHeight[0], widthAndHeight[1], tempSt[0],tempSt[1], WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, st.decorView.mDefaultOpacity);if(st.hasPanelItems()){ lp.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND; lp.dimAmount = 0.5f;}
private boolean isLandDisplay(){ Context context = getContext(); return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;}private int[] makePanelFeatureState(PanelFeatureState st){ int[] temp = new int[]{st.x,st.y}; if(isLandDisplay()){ DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int screenWidth = dm.widthPixels; int screenHeigh = dm.heightPixels; temp[0] = 0; temp[1] = screenHeigh; } return temp;}private int[] makeLandMenuWidth(){ int[] temp = new int[]{MATCH_PARENT,WRAP_CONTENT}; if(isLandDisplay()){ temp[0] = WRAP_CONTENT; temp[1] = MATCH_PARENT; } return temp;}
在
public void onConfigurationChanged(Configuration newConfig) {方法中添加closeAllPanels();(解决横竖屏切换界面重绘问题)
此处修改了横竖屏时menu panel的显示位置和宽高,针对menu item数量大于0时的界面进行设置flag为暗屏效果。
修改玩此处,界面的位置和大小就确认了,现在我们去找到其布局文件,在frameworks/base/core/res/res/layout/expanded_menu_layout.xml下面找到其布局文件,看到原生定义为:
修改为:<com.android.internal.view.menu.ExpandedMenuView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+android:id/expanded_menu" android:layout_width="?android:attr/panelMenuListWidth"android:layout_height="wrap_content" />
<com.android.internal.view.menu.ExpandedMenuView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+android:id/expanded_menu" android:layout_width="fill_parent"android:layout_height="fill_parent" />
布局文件修改ok后,整体的显示就已经确认了,最后一步,更改menu pop的背景,因为针对holo和holo.Light的主题,其在themes.xml文件里面的定义都是<item name="panelFullBackground">@android:drawable/menu_background_fill_parent_width</item>
从core/res/res/drawable-xhdpi中找到此文件为黑色显示,做一张白色的.9图片,放到目录下,蒋新添加的图片文件名配置到themes.xml文件的holo.Light主题的
panelFullBackground中,到此为止,大功告成,显示效果正常,与小米3一样,可以松口气了。
修改过程中的代码调用,资源配置等等没有详述,大家可以根据修改流程自己分析哈
GO HOME!!
0 0
- android menu pop弹出框的修改方案
- 如何修改Pop-menu(右键弹出的菜单)的内容(Caption)
- 如何修改Pop-menu(右键弹出的菜单)的内容(Caption)
- 栈的弹出函数pop()实现方案探讨
- 栈的弹出函数pop()实现方案探讨
- 栈的弹出函数pop()实现方案探讨
- 栈的弹出函数pop()实现方案探讨
- android中屏蔽长按menu键弹出输入法的修改方法
- android menu的使用(Menu无法弹出问题)
- 底部弹出的pop
- jquery pop弹出框
- android定制你自己的menu菜单,修改menu字体颜色
- Android点击MENU弹出的退出按钮退出系统方法及拦截MENU弹出菜单方法
- Android 系统Menu样式的修改
- Android动态修改ToolBar的Menu菜单
- Android 修改Menu背景
- android 单击弹出Context menu
- Android 弹出系统menu菜单
- php正则表达式入门-常用语法格式
- 广度算法 dijskstra算法 代码实现
- angularjs 利用$http post数据
- Android应用程序签名
- fcntl
- android menu pop弹出框的修改方案
- 程序员面试题目总结--链表(2)【找出单链表中的倒数第K个元素】
- 51. 腾讯面试题:一个二叉树,中序遍历,找一个节点的后一个节点
- CH340晶体不起振
- 获取RunningTaskInfo
- vs2008编译libpng
- hdu 1521 排列组合(指数型母函数)
- mysql更改数据文件目录方法
- SQL server2005 Analysis Services项目中出现以下错误