GitHub地址:<a >DavidMenuPopupWindow</a>
作者郵箱: dingwei.chen1988@gmail.com
DavidMenuPopupWindow###
</br>
在寬屏Android設(shè)備或者是寬屏平板上,有類似像Windows系統(tǒng)的Win菜單樣式的菜單或許是相對較好的交互體驗。在Android系統(tǒng)中,menu文件很好的表述了這個層級關(guān)系。非墨就將用Android的menu文件結(jié)構(gòu),映射一套Windows系統(tǒng)類似的層級結(jié)構(gòu)控件。先來看下效果吧:
1.menu文件映射###
當(dāng)然如果單純是實現(xiàn)一些效果的話,這個還不夠,這里首先我們要像之前在Android中定義一個menu一樣定義一個menu.xml
<menu app:menu_id="@+id/menu1">
<item app:item_title="item1"/>
<item app:item_title="item2">
<menu app:menu_id="@+id/menu2">
<item app:item_title="item2.sub1"/>
<item app:item_title="item2.sub2"/>
</menu>
</item>
</menu>
我們通過我們所定義的xml能很看清楚我們的層次結(jié)構(gòu),是含有兩級的菜單,并且在item2菜單中有一個子菜單。這時候我們只需要生成一下DavidMenuPopupWindow,然后把這個Window show出來,一切問題都解決了,Window的位置也會給您精確算好:
DavidMenuPopupWindow menuPopupWindow = new DavidMenuPopupWindow(this,R.menu.menu);
...
menuPopupWindow.show(view);
難道這就夠了么?當(dāng)然遠(yuǎn)遠(yuǎn)不夠!!DavidMenuPopupWindow還有哪些功能呢?
2.主題傳遞###
DavidMenuPopupWindow 將定制化一切你所需要的菜單屬性。以上面的例子為例,menu1中嵌套了menu2。當(dāng)你對定制了menu1的主題,并且你并沒有指定menu2的主題的時候,menu2的主題將繼承于menu1。按照我們的使用經(jīng)驗來說,父子menu間的主題總是相似的。
例如:
<menu app:menu_id="menu0">
<item>
<menu app:menu_id="@+id/menu1"
app:menu_title_color="#ff0000"
app:menu_title_size="3dp">
<item>
<menu
app:menu_id="@+id/menu2"
app:menu_title_color="#ffff00">
<item/>
<item/>
</menu>
</item>
<item/>
</menu>
</item>
</menu>
menu0嵌套menu1,menu1嵌套menu2。menu1的主題將繼承于menu0。但是由于menu1中設(shè)置了title的顏色"#ff0000"(紅色),且字號為3dp。所以menu1除了字號和字體顏色外的主題都繼承于menu0。而menu2繼承于menu1,也就是menu2此時的字號應(yīng)該為3dp。由于menu2中更換了字體顏色為"#ffff00"(黃色)因此menu2為3dp字號的黃色字體菜單:
3.菜單彈出動畫###
菜單彈出動畫可以通過menu標(biāo)簽中的app:menu_enter_anim和app:menu_enter_anim屬性指定。分別可以指定(可以組合使用):
*none:無動畫
*scale:放大動畫
*fade:淡入動畫
*translate:動畫
<menu app:menu_enter_anim="translate">
4.設(shè)置menu樣式###
DavidMenuPopupWindow 可以通過<menu>標(biāo)簽給menu設(shè)置樣式,通過<item>標(biāo)簽給每個item設(shè)置樣式,這里不做贅述,做一個簡單的設(shè)置<menu>背景的例子:
<menu app:menu_background_color="#ff0000">
5.控件占位###
有時候,如果你需要用到你自己的控件在menu里面的話,可以通過<item>的占位標(biāo)簽分別是:
- app:item_headstub :首位占位(位于控件最左側(cè))
- app:item_middlestub :中位占位(位于title后面)
- app:item_tailstub :末位占位(位于控件最右側(cè))
通過這三個屬性可以指定一個layout,指向你所需要的控件類型,這里非墨引用一個測試用的layout.xml:
// inner_menu_stub.xml
<?xml version="1.0" encoding="utf-8"?>
<ProgressBar
xmlns:android="http://schemas.android.com/apk/res/android
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
然后通過在menu中指定:
<menu>
<item app:item_tailstub="@layout/inner_menu_stub"/>
<menu>
...
<item app:item_leftstub="@layout/inner_menu_stub"/>
..
</menu>
</menu>
實現(xiàn)效果如下:
DavidMenuPopupWindow還提供了很多的接口和功能,希望大家喜歡,也希望大家如果有好的改進(jìn)建議或bug,整理發(fā)送到本人的郵箱,thx。