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
原创粉丝点击