Flex 自定义组件要重写的方法.docx_第1页
Flex 自定义组件要重写的方法.docx_第2页
Flex 自定义组件要重写的方法.docx_第3页
Flex 自定义组件要重写的方法.docx_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Flex 自定义组件一般都要重写下面几个方法,他们的主要作用是什么呢?下面举例说明:1.关于 createChildren()方法代码1-1显示了组件 ImageViewer 的 createChildren() 方法。代码1-1. ImageViewer 的 createChildren() 方法1. override protected function createChildren():void2. 3. trace(createChildren);4. super.createChildren();5.6. /创建边框CSS7. if(!this.border)8. createBorder();9. 10.11. /创建控制按钮容器12. if (!controlBar)13. controlBar = new UIComponent();14.15. /创建放大按钮16. if (!zoomInButton)17. zoomInButton = new Button();18. zoomInButton.label = +;19. zoomInButton.addEventListener(MouseEvent.CLICK, zoomInButtonClickHandler);20. controlBar.addChild(zoomInButton);21. 22.23. /创建缩小按钮24. if (!zoomOutButton)25. zoomOutButton = new Button();26. zoomOutButton.label = -;27. zoomOutButton.addEventListener(MouseEvent.CLICK, zoomOutButtonClickHandler);28. controlBar.addChild(zoomOutButton);29. 30.31. / 将控制按钮容器添加到显示节点32. addChild(controlBar);33. 在该方法的末尾才把controlBar 添加到 Display List 上,正如之前提到的那样,我们只在需要的时候装配他。同时,此时也是为子节点添加监听器的好地方。2.关于 commitProperties()方法CommitProperties()是验证方法 invalidateProperties()所对应的提交方法,也是初始化阶段会被调用的第一个提交方法。他的目的是使得任何通过 set 方法提交的数值更改生效。所以您可以看到在 set scale()方法里,按照 invalidation-validation 模式,我们调用了 invalidateProperties()方法从而将值的生效延迟到了 commitProperties()里,并且为了做到 “避免对一个属性连续设置多个值,从而避免了不必要的资源浪费”,我们使用了标志位 scaleChanged。代码2-1 set scale()函数1. public function set scale(value : Number):void2. if (_scale != value)3. 4. _scale = value;5.6. /避免对一个属性连续设置多个值,从而避免了不必要的资源浪费7. scaleChanged = true;8.9. /由于调用本方法时,可能对象未创建10. /通过调用invalidateProperties(),将值的生效延迟到了commitProperties()里11. invalidateProperties();12. dispatchEvent(new Event(scaleChanged);13. 14. 代码2-2 commitProperties()函数1. override protected function commitProperties():void2. trace(commitProperties);3. mitProperties(); 4.5. /如果image控件不存在,则新建并添加6. if (sourceChanged)7. if(!this.image)8. image = new Image(); 9. this.addChild(image);10. image.source = this._source; 11. else12. image.source = this._source;13. 14. sourceChanged = false;15. 16.17. /如果scale属性改变了,则修改imageWidth18. if(scaleChanged)19. this.imageWidth = this.imageWidth * this.scale;20. this.imageHeight = this.imageHeight * this.scale;21. scaleChanged = false;22. 23. 为什么在 commitProperties()会有添加子节点的操作呢?对于有些子节点,他的诞生可能是和某些属性值相关联的,也就是我们在之前提到的动态创建或者数据驱动的子节点。这些子节点,由于他们并不是随着组件的产生而产生,而是要受属性值的变化而产生或者变化,甚至在某些情况下,根本就不需要存在。所以我们应该在值的提交阶段,也就是 commitProperties()方法调用的时候,当新值真正生效的时候再去创建它。3.关于 measure() 方法measure()方法是组件自动计算尺寸大小的地方,在例子 ImageViewer 的 measure()方法里(如代码3-1 所示).如果已经指定了尺寸大小,即 width 和 height 值,measure()方法不会被调用。所以一旦您的组件在组装阶段被设置了 with 和 height 属性值,那么请不要期望在 measure 里会执行您的业务逻辑。代码3-1 measure()函数1. override protected function measure():void2. trace(measure );3. super.measure();4. if(!image)5. /如果image控件不存在,则本组件的宽度为controlBar的宽度6. measuredWidth = controlBar.getExplicitOrMeasuredWidth();7. measuredHeight = controlBar.getExplicitOrMeasuredHeight();8. else9. /如果image控件存在,则本组件的宽度为controlBar的宽度10. measuredWidth = image.width + Math.max(image.width, controlBar.getExplicitOrMeasuredWidth() ;11. measuredHeight = image.height + controlBar.getExplicitOrMeasuredHeight();12. 13. measuredMinWidth = measuredWidth;14. measuredMinHeight = measuredHeight;15. 4.关于 updateDisplayList ()方法updateDisplayList()方法用于对组件内容进行布局以及渲染,一切屏幕上可见的内容都需要在这里被处理,所以 updateDisplayList()可以说是最繁忙的一个提交方法,他所包含的实现可以非常多。代码4-1中,我们省略了部分代码。只留下了需要讲解的部分。代码4-1 updateDisplayList()函数部分代码1. override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number): void 2. super.updateDisplayList(unscaledWidth, unscaledHeight); 3. / 省略部分代码4. zoomInButton.setActualSize(50, 20); 5. zoomOutButton.setActualSize(50, 20); 6. var tmpx : Number = 20; 7. controlBar.setActualSize(tmpx, 20); 8. controlBar.move(0, unscaledHeight-25); 9. zoomInButton.move(tmpx, 0); 10. tmpx +=60; 11. zoomOutButton.move(tmpx, 0); 12. if (imageHeightChanged |imageWidthChanged) 13. image.width = this.imageWidth;/w;14. image.height = this.imageHeight;/h - 20;15. var tempX : Number = x+ (w-imageWidth) * 0.5; 16. var tempY : Number = y + (h-imageHeight) * 0.5; 17. image.x = tempX; 18. image.y = tempY; 19. imageHeightChanged = false ; 20. imageWidthChanged = false ; 21. var g:Graphics = graphics; 22. g.clear(); 23. g.beginFill(0x6F7777); 24. g.drawRect(tempX-1, tempY-1, imageWidth+2, imageHeight+2); 25. g.endFill(); 26. 27. 在 measure()方法里我们可以获取 Flex 自动计算的尺寸(如果被调用的话),这些数据需要在 updateDisplayList() 方法里被应用处理,所以我们会大量使用 setActualSize()方法,特别是子元素比较多的时候。updateDisplayList()的最重要的职责之一就相对应的 invalidateDisplayList()方法的更新请求进行响应。比如说对set imageWidth()方法进行了相应。并且就像在 commitProperties()部分里介绍的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论