TWaver - 專注UI技術

          http://twaver.servasoft.com/
          posts - 171, comments - 191, trackbacks - 0, articles - 2
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          減少Menu分割線的間距

          Posted on 2012-06-20 11:49 TWaver 閱讀(1243) 評論(0)  編輯  收藏
               之前看到社區中有介紹怎樣靈活使用右鍵菜單的文章。現在積累下來右鍵菜單的方式還是比較多的,讓我們來初步了解一下:
          1.  使用flash自帶的右鍵菜單,通過ContextMenu來設置,這是twaver最早右鍵菜單的解決方法,但這種方式有一個不太好的地方是自帶上了flash的信息,而且無法刪除,因此很不方便。
          2.  使用Menu,通過左鍵的方式來觸發彈出Menu項。這個方式還是比較能夠接受的,對于flash也沒有版本的要求。
          3.  使用Flash Player 11.2的新功能實現右鍵菜單,這種方式雖然好,但是需要使用比較高的flash版本,而我們項目中很多用戶使用的還是老的版本,領導覺得這種方法不太適合我們。
               
              上面的三種方式,我們最終選擇了第二種。在實際使用過程中總是有這樣那樣的問題。我今天就碰到了一個這樣的問題。我使用的是第二種方法:通過menu來實現右鍵菜單。由于菜單項比較多,而且實際應用中也還需要對菜單項進行分類、分層。



                這種效果一般來說已經夠用了,但是領導覺得分割線和上下文字之間的間距太大了,需要改小一點,于是上網查了資料,發現確實有一個參數能控制:variableRowHeight。這里有詳細的使用例子:Reducing the vertical space around a separator in a Flex PopUpButton control’s pop up menu by enabling variable row heights



                趕緊試試我的菜單效果,于是給menu設置了variableRowHeight=true,但效果卻不是那么盡如人意:



                一級菜單還行,二級菜單上的分割線樣式還是原來那樣,沒變,這會是什么原因呢?繼續Google發現基本都是說設置了這個屬性值就可以了。難道還是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,將屬性值設置到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);設置上自定義的這個renderer,運行看看效果:



                終于達到了我們預期效果了,最后給大家分享一下源碼:見原文最下方

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 六盘水市| 尼勒克县| 财经| 同德县| 尖扎县| 大城县| 同心县| 侯马市| 成安县| 九台市| 咸丰县| 泸州市| 从化市| 宜君县| 德昌县| 黄石市| 衡水市| 武功县| 安岳县| 嘉善县| 札达县| 偃师市| 隆化县| 江门市| 万全县| 新干县| 昂仁县| 饶阳县| 漯河市| 泽库县| 赤峰市| 来凤县| 双牌县| 高尔夫| 吴桥县| 临海市| 玉山县| 新丰县| 慈利县| 新密市| 宁陕县|