Buzzword样式的右键菜单 Customized Context Menu as Buzzword

Buzzword样式的右键菜单 Customized Context Menu as Buzzword

The Joy of Flex 的博客上,看到了一则关于 Buzzword的视频介绍。Buzzword是Adobe官方的一个线上文档编辑器。功能强大。png-0532

看到Buzzword的右键菜单很是好看,决定山寨一次,模仿一下。

通过模仿,我们可以了解如何制作一个Flex部件,自己来定义它的形状。

先上个Buzzword的右键菜单的视频截图,和模仿后的成品的截图。

 

 

暴风截屏20081122164002  final

左边的是视频截图,右边的是作者模仿。

Buzzword的那个Context Menu严格意义上来说,不是真正的,flash浏览器默认的那个右键菜单(就是有查看flash版本号选项的那个)。作者分析,那个Buzzword的这个context menu,不是基于flash.ui.ContextMenu来开发的。而是基于类似Canvas或者List一类的部件来进行开发的。作者是基于VBox来进行开发的。

这个Context Menu的特点就是,当鼠标沿着这个不规则的Context Menu四边游走的时候,被其盖在下面的部件,都能紧贴着Context Menu的边而被激活。也就是说,这个Context Menu的背景, 不是用一个这个不规则形状的截图来实现的。如果是这个形状的截图作为Context Menu的背景,那么作者放于这个Context Menu下面的Link Button 部件,就不会在鼠标放到该位置时,变成Mouse Over的状态。因为,这个按钮理应被正方形的截图所遮挡(之所以大家能看到它,是因为除了黑色的主体部分外,那个截图的画布背景是透明的)。

当然,如果不要求有上述这个功能,用截图也是可以的。但是这个部件的高度就不能方便地随意控制。

此次模仿的原理就是,自己写VBox的BorderSkin类。步骤如下,

1. 建立一个VBox的Border类,扩展mx.skins.Border类。覆盖 updateDisplayList方法。实现自己的graphics实例,也就是这个部件的外形了。

  1. package com.chestnut.view   
  2. {   
  3.     import flash.display.Graphics;   
  4.     import flash.filters.DropShadowFilter;   
  5.        
  6.     import mx.skins.Border;   
  7.        
  8.     public class MyBorder extends Border   
  9.     {   
  10.            
  11.         public function MyBorder()   
  12.         {   
  13.             super();   
  14.         }   
  15.         //覆盖updateDisplayList, 画自己所需要的图形   
  16.         override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void  
  17.         {   
  18.             var g:Graphics = graphics;   
  19.             drawBorder(unscaledWidth, unscaledHeight, g, -5);   
  20.         }   
  21.         //覆盖drawBorder,画自定义的边   
  22.         public static function drawBorder(w:Number, h:Number, g:Graphics, inset:Number):void  
  23.         {   
  24.             var xSign:Number = 1;   
  25.             var ySign:Number = 1;   
  26.             var xShift:Number = 0;   
  27.             var yShift:Number = 0;   
  28.             var padding:Number = 20;   
  29.             var upperLeftControlOffset:Number = 5;   
  30.             var controlOffset:Number = 5;   
  31.             g.clear();   
  32.             g.beginFill(0x0000001);   
  33.             g.lineStyle(10x0000001);   
  34.             //draw the menu   
  35.             g.moveTo(xShift+xSign*upperLeftControlOffset, yShift+ySign*inset);   
  36.             //..此处省略,这里就是Graphics,画出那个不规则图形的方法。代码因图形形状的不同而异,因此省略   
  37.             g.endFill();       
  38.         }   
  39.     }   
  40. }  

2. 在CSS定义中,定义自己的borderSkin类。

  1. /* CSS file */  
  2. .contextMenu{   
  3.     borderSkin: ClassReference("com.chestnut.view.MyBorder");   
  4. }  

3. 加入自己的 menu item 部件。

  1. private function onInit():void  
  2. {   
  3.     menuArray = ["Open","Open in New Window","Seperator""Share...""Duplicate""Rename""Show Info""Seperator""Delete"];   
  4.     for each(var str:String in menuArray)   
  5.     {   
  6.         //当关键字是sperator时,就插入一个横线,vb就是VBox   
  7.         if(str == "Seperator")   
  8.         {   
  9.             var hr:HRule = new HRule();   
  10.             hr.width = 150;   
  11.             hr.setStyle("strokeColor""#FFFFFF");   
  12.             hr.height = 1;   
  13.             vb.addChild(hr);   
  14.         }   
  15.         //其他时候,就插入自定义的menu item, 作者基于canvas来实现的   
  16.         else  
  17.         {   
  18.             var mi:MenuItem = new MenuItem();   
  19.             mi.menuStr = str;   
  20.             vb.addChild(mi);   
  21.         }   
  22.     }   
  23.     //加一个装饰阴影   
  24.     var sf:DropShadowFilter = new DropShadowFilter();   
  25.     sf.distance = 5;   
  26.     sf.alpha = 0.4;   
  27.     sf.angle = 45;   
  28.     vb.filters = [sf];   
  29.     var cm:ContextMenu = new ContextMenu();   
  30. }  

原文:http://riashanghai.com/zh-hant/node/70

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值