卖银鳞胸甲的D61 李敖有首诗叫《只爱一点点》 不爱那么多只爱一点点别人的爱情像海深我的爱情浅。不爱那么多只爱一点点别人的爱情像天长我的爱情短。不爱那么多只爱一点点别人眉来又眼去我只偷看你一眼。一点足够。在黄易的大唐双龙传中有个说法叫《遁去的一》也就是说任何事情在纷杂万象之中都有一个消失的一把这个消失的一找到就可以事半功倍。在学技术中很多人纠结于掌握与精通。掌握是能够熟练的使用该技术实现自己的目标而精通则是对该技术的常用及半常用的场景都熟悉能够处理常见或非常见的问题是广泛的掌握。在宅男和腐女眼中万事万物皆为攻受。学习务必精通则是绝世小受学习只求掌握则是偏向于攻。孙子曰善攻者动于九天之上善守受者藏于九地之下。下面看看动于九天之上的学习方法。作为一个上个世纪就开始写网页的程序员你如果问我这个css怎么写这个js怎么写我的回答一般就是两个字“不会”。做为一个从.net 1.0就开始写C#程序的程序员如果你问常见的.net问题50%情况下我的回答还是“不会”或者“查MSDN”。有不少人加我QQ讨论技术问题我最多的回答是“不会”“不知道”“Google”。时至如今也就会些用了理所当然就能记住的知识其它的都不会IDE的快捷键也记不住几个。当然也有碰巧那个东西我懂的这种情况极少。技术是来解决问题的不是增加心智负担的。承担进攻任务的行军不会带太多的累赘。我的开发任务中数据库、查询类的不重要linq不用学自从接触代码生成后ORM的也全部都扔了因为ORM需要学习且可控性没有代码生成的好。自从项目主要是图形图像方面的后asp.net等也都丢了因为这类项目需求变动大、技术支持困难。直到后来才找到.net对我而言的遁去的一unsafe 指针。有了unsafe 指针图像程序性能大增相比C/C而言生产力也得到了极大的提高——什么新东西都不用学指针还没忘记。知识是基于过去经验的总结而我们面对的是未来因此对于过往知识需要谨慎的辨识对于他人经验需要参考性的采纳。MSDN中明白的说不鼓励使用unsafe而在.net图像程序中大量的使用后才能感觉到它的爽。如果看到MSDN上不推荐用看见别人也几乎不这么用自己就给自己设置禁区那我就找不到这个遁去的一。下面是个更深刻的例子。今年应该是我写Flash程序的第三个年头。俺是一个不会Flash的Flash程序员。你如果让我用Flash CS工具做一个动画很抱歉不会。那么看看我会哪些我学了哪些我能做什么做这些我相对于别人有哪些优势从这个例子看看什么是进攻式学习。普遍看来Flash是一个动画工具。全球数百万Flash动画设计师。好吧俺美工差如果它是个动画工具俺就不玩了。在我最初看来Flash是一个运行在绝大多数PC机上的虚拟机平台擅长处理图形图像可以用它来快速开发程序。这样看就可以玩玩它。为什么图形图像类应用是我给自己确立的方向而Flash是一个适合的平台。这样的认识还没有触及遁去的一。随着开发经验的增加一个遁去的一开始浮现Flash是一个最简单的虚拟机它只封装了最基本的操作图形图像、声音、视频、XML以及现在的3D连Button控件都没有凡是可有可没有的都没有。用普通的眼光看这个虚拟机简单、弱小。换一种方式看尺寸小平台小容易移植。用html5/js来写一套Flash的基本API也没多少代码。因此Flash/AIR才这么容易的打入iOS之中且各类平台间Flash代码保持非常好的兼容性。Flash提供了一套简洁的API跨各种平台。Flash以库的形式扩展这一点与.Net很大不同Flash CS工具里自带了一套简单、开源的UI控件库Flex则提供了一套复杂的、全功能的UI库这些都是Flash平台外部的这也与.Net不同WPF是在SDK里面的而不是外面。在平台外部就拥有了很好的灵活性。这个简单的弱小的小玩意怎么能算遁去的一呢算不上它充其量就是一个灰尘大小的卵细胞。下面一个微不足道的、看似毫无关联的玩意出场了数据绑定。它就像一个小蝌蚪一样向卵细胞游啊游在两者接触的瞬间一个生命诞生了Flash开发遁去的一就是Flash的底层API 数据绑定。Flash底层API很简单很少各大平台都支持Web桌面移动。它就是中国移动全球通什么地方都有它——我能光能还不行直接用Flash底层API开发就像用GDI一笔笔绘制一样麻烦的要命直到数据绑定出现数据绑定让基于Flash API的开发有了质的飞跃——它好我也好因此掌握Flash只需要掌握两个东西底层API和数据绑定剩下的都是细枝末节的用的时候查文档和搜索引擎就可以了。我们需要学的东西是多么的少而我们能做的事情是多么的多首先得学习开发语言。Flash平台的官方开发语言是actionscript3简称as3每当说起as3时人们总会谈起as2你就当as2从没出现过了解as2一点用都没有不闻、不问、不看。as3和主流开发语言很类似。package 机制、类机制和java相似继承是extends实现接口是implements。区别1变量声明是var i:int函数声明是function foo(i:int):int; 不支持方法重载支持默认参数。函数可以作为参数传递。支持闭包。2Getter和Setter分别为function get foo():int; 和function set foo(i:int):int;3抛出事件dispatchEvent;监听事件addEventListeneraddEventListener。事件支持弱引用。4for each可以遍历集合5支持动态类Object是动态类for可以遍历Object:for(varkey:Stringinobj){...}6[ ]里写元数据。常用的有三个事件申明嵌入资源和数据绑定数据绑定是 [Bindable]这个在后面会详述。嵌入资源的例子一看就明白[Embed(sourceassets/blackStyle/iconPlayStart36.png)]private var buttonForwardPlay36:Class;事件申明用在类中申明之后IDE会对该类给出对应事件的智能提示例子[Event(nameinited, typeflash.events.Event)]as3很快就学会了拿本语法书扫一眼就行了。不用Flash CS工具的话主流IDE就是Flash Builder它是基于Eclipse开发的用过Eclipse的拿过来就会用。下面进入主题Flash API和数据绑定。需要掌握的Flash API1绘制的API绘制线、绘制曲线、填充/梯度填充、蒙版、混合模式貌似除了蒙版外Html5都有2滤镜和变换3文本处理TextField4核心UI类Sprite、它的生命周期及对交互的响应上面这些是我们的钢筋水泥下面就用这些钢筋水泥来搭建我们自己的应用。有人可能会问控件呢有了数据绑定我们并不需要控件或者换句话说有了数据绑定我们可以很容易由底层API搭建自己需要的控件。数据绑定非常容易数据绑定是Flex的mxmlFlex描述界面的语言编译器提供的一个功能。下面我们只用Flex的 mxml编译器而不用Flex的任何控件来从Flash API搭建我们自己的控件或其它应用。Mxml就不介绍了看一眼就会了。下面是一个mxml中数据绑定的例子shapes:Rectangle idbackgroundwidth{width}height{height}corner{bgCorner}corners{bgCorners}color{bgColor}alpha{bgEnabled?bgAlpha:bgAlpha*0.3}borderColor{bgBorderColor}borderThickness{bgBorderThickness}fillAlpha{bgFillAlpha}borderAlpha{bgBorderAlpha}/很简单、很容易理解、理解了就再也忘不了大括号{}中的就是数据绑定内容{}中的所有可绑定的变量构成绑定链绑定链上的绑定源出现了任何变化都会激发运算将运算结果付给被绑定的字段。如果给一个类加了元数据[Bindable]则该类实例的字段和getter/setter就成了绑定源。如果不想把全部字段和getter/setter弄成绑定源可对字段或setter单独增加元数据[Bindable]。这个数据绑定比WPF/SL的数据绑定简洁多了、易用多了。下面就靠这些开始征程。先解决多语言的问题View CodeRpcRequest的代码就不贴了它的功能就是从url取回个xml文件。这个类在根命名空间中这样不用import就能用了。名字是l代表language有一个静态实例i代表instance它设为可Bindable方法s代表取的是string。Xml文件中存储的是键值对这样写Button label{l.i.s(Yes)} /就绑定了多语言如果不加载任何语言文件的话显示的是“Yes”如果加载了的话如果该文件中存在键“Yes”则加载对应的值如果不存在则寻找是否有小写后为“yes”的键加载对应的值如果都不存在则显示“Yes”。而当更改语言时由于i发生了变化由于数据绑定的关系该Button的label值也马上得到了更新。寥寥几行代码就实现了多语言解决方案。接着是三个基础类Application、BaseComponent 和 BaseContainer。Application 顾名思义是App的入口类提供了一些基本的功能。BaseComponent 是UI类的基类。BaseContainer 是容器类的基类。这三个类的代码如下View Code几个Helper类代码View Code下面开始搭积木。先是Shape。只要有背景的地方都有Shape。下面是Shape的基类View CodeBaseShape 继承了BaseComponent的x,y,width,height等属性另外提供了填充色填充透明度纹理边界色边界透明度边界厚度等属性。而又因为有些形状比如圆不方便用x,y,width,height等描述更方便用圆心和半径描述因此又提供了descriptor的属性。如CircularDescriptorView Code接着是矩形控件View Code这个矩形控件可以设置圆角。有了这个控件各种各样的背景图就都可以实现了有圆角的、没圆角的、有纹理的、有边界的等等。椭圆/圆也经常用写一个View Code下面我们建立一个简单的Canvas类这个Canvas类可以设置背景可以设置边界背景和边界是用上面的Rectangle 类实现的。View Code一个Canvas就是这么简单下面建立Image控件这个Image支持九宫格如果不知道九宫格请Google之View Code那么我们如何让Canvas或BaseContainer中显示背景图呢简单在里面放个Image控件即可比如这是我写的ImageButton控件View CodeLabel控件离不了恩就在网上的一份代码基础上写个Label控件View Code接下来Button控件呼之欲出View Code进度条Progress就太容易了