终于打算在CSDN安家了。
作为第一篇博客,记录下今天工作中遇到的问题,项目主Application中嵌套了三层容器(Canvas),然后判断当容器中的两个组件发生覆盖时增加顶层容器的宽度(即加大width属性的值),然后再将滑动条滑动相应的数值(即容器增加的宽度)。
很简单的功能,然而调试中却发现顶层容器的宽度顺利增加,但是将滑动条的horizontalScrollPosition属性增加相应数值后滑动条却没有作出相应的“滑动”······怀疑是Flex的渲染机制问题,组件的属性变动后Flex将会将该组件的放入“属性失效”队列,等到下一个渲染周期(即下一帧)的时候再重新渲染,这时候才能看到属性变动后的组件效果。因此,再改变顶层容器的width属性后,下层容器的滑动条的最大滑动宽度属性并不会立刻改变,而是要等到下一帧的时候才会改变。
因此,解决的问题很简单,将修改滑动条滑动位置的代码(假设是在update函数中)放入callLater函数中,即callLater(update),便可以解决这个问题了。
下面是google callLater函数时找到的一篇比较callLater()和validateNow()的文章,写的比较清楚。http://www.aboutweb.com/blog/using-calllater-vs-validatenow-flex
简单的比较下这两种机制,callLater函数有两个参数,第一个是要在“下一帧”执行的函数,另一个参数是要执行函数所需的参数。而如果调用validateNow函数则将使组件变更的属性立即生效(将调用validateProperties,validateSize和validateDisplayList三个函数,因此开销更大)。下面是文章中所用到的两个简单实例:
在容器中创建一个文本组件并赋予初始字符串(此时组件的mesuaredWidth属性会变更)。
使用CallLater 函数输出赋值后文本组件的宽度。
var someText:Text = new Text();
someText.text="testing";
addChild(someText);
trace("before: " + someText.measuredWidth);
callLater(getWidth);
public function getWidth():void{
trace("after: " + someText.measuredWidth);
}
而使用validateNow输出赋值后文本组件的宽度。
var someText:Text = new Text();
someText.text="testing";
addChild(someText);
trace("before: " + someText.measuredWidth);
someText.validateNow(); //you should actually use validateSize() if you just want the measured width
trace("after: " + someText.measuredWidth);
在Flex开发中,遇到组件属性改变后未立即显示更新的问题。原因是Flex将属性变更的组件放入渲染队列,待下一帧渲染。通过callLater将更新滑动条位置的代码延迟到下一帧执行,解决了问题。对比callLater和validateNow,前者在下一帧执行指定函数,后者立即生效并执行验证过程,开销较大。文中提供示例展示了两者区别。

9904

被折叠的 条评论
为什么被折叠?



