Posted on 2012-06-20 11:49
TWaver 閱讀(1239)
評論(0) 編輯 收藏
之前看到社區(qū)中有介紹怎樣靈活使用右鍵菜單的文章。現(xiàn)在積累下來右鍵菜單的方式還是比較多的,讓我們來初步了解一下:
1. 使用flash自帶的右鍵菜單,通過ContextMenu來設(shè)置,這是twaver最早右鍵菜單的解決方法,但這種方式有一個不太好的地方是自帶上了flash的信息,而且無法刪除,因此很不方便。
2. 使用Menu,通過左鍵的方式來觸發(fā)彈出Menu項。這個方式還是比較能夠接受的,對于flash也沒有版本的要求。
3. 使用Flash Player 11.2的新功能實現(xiàn)右鍵菜單,這種方式雖然好,但是需要使用比較高的flash版本,而我們項目中很多用戶使用的還是老的版本,領(lǐng)導(dǎo)覺得這種方法不太適合我們。
上面的三種方式,我們最終選擇了第二種。在實際使用過程中總是有這樣那樣的問題。我今天就碰到了一個這樣的問題。我使用的是第二種方法:通過menu來實現(xiàn)右鍵菜單。由于菜單項比較多,而且實際應(yīng)用中也還需要對菜單項進(jìn)行分類、分層。
趕緊試試我的菜單效果,于是給menu設(shè)置了variableRowHeight=true,但效果卻不是那么盡如人意:
一級菜單還行,二級菜單上的分割線樣式還是原來那樣,沒變,這會是什么原因呢?繼續(xù)Google發(fā)現(xiàn)基本都是說設(shè)置了這個屬性值就可以了。難道還是Adobe的bug?算了,還是自己看源碼吧:
1
2 mx_internal function openSubMenu(row:IListItemRenderer):void
3 {
4 supposedToLoseFocus = true;
5
6 var r:Menu = getRootMenu();
7 var menu:Menu;
8
9 // check to see if the menu exists, if not create it
10 if (!IMenuItemRenderer(row).menu)
11 {
12 menu = new Menu();
13 menu.parentMenu = this;
14 menu.owner = this;
15 menu.showRoot = showRoot;
16 menu.dataDescriptor = r.dataDescriptor;
17 menu.styleName = r;
18 menu.labelField = r.labelField;
19 menu.labelFunction = r.labelFunction;
20 menu.iconField = r.iconField;
21 menu.iconFunction = r.iconFunction;
22 menu.itemRenderer = r.itemRenderer;
23 menu.rowHeight = r.rowHeight;
24 menu.scaleY = r.scaleY;
25 menu.scaleX = r.scaleX;
26
27 // if there's data and it has children then add the items
28 if (row.data &&
29 _dataDescriptor.isBranch(row.data) &&
30 _dataDescriptor.hasChildren(row.data))
31 {
32 menu.dataProvider = _dataDescriptor.getChildren(row.data);
33 }
34 menu.sourceMenuBar = sourceMenuBar;
35 menu.sourceMenuBarItem = sourceMenuBarItem;
36
37 IMenuItemRenderer(row).menu = menu;
38 PopUpManager.addPopUp(menu, r, false);
39 }
40
看來是二級菜單上沒有copy主菜單variableRowHeight的屬性值,因此還是自己定義一個itemRenderer,將屬性值設(shè)置到itemrenderer里面:
1 public class CustomMenuItemRenderer extends MenuItemRenderer {
2 public function CustomMenuItemRenderer() {
3 }
4 override protected function measure():void {
5 super.measure();
6 (this.owner as Menu).variableRowHeight = true;
7 }
8 }
然后通過menu.itemRenderer = new ClassFactory(CustomMenuItemRenderer);設(shè)置上自定義的這個renderer,運行看看效果:
終于達(dá)到了我們預(yù)期效果了,最后給大家分享一下源碼:
見原文最下方