[转]AS3容器的实现原理 scrollrect属性

mac2022-06-30  72

所谓容器,不是指displayobjectcontainer,而是指可以承载子显示对象,并根据容器的尺寸和滚动条进行子显示对象显示的container,如flex中的container包中的相关类。容器最大的难点就是即便是内容的尺寸高出容器自身width、height时1. 外界看到只是容器自身尺寸区域,不会被撑破2. 外界获取container.width和height必须是container自身的尺寸,而不会随着内容的尺寸变化而变化!其实我一开始想到的实现方式是mask遮罩,也实现了一个例子,结果发现其不符合第2条,因为一般的displayobjectcontainer在addchild后,container尺寸会随着child的尺寸发生改变,虽然你用一个矩形区域去遮罩child,但是外界获取container的width和height还是会包括整个区域,也就是说遮罩外的部分仍会被计入container的尺寸中!后来查了下as3语言参考,发现displayobejct有一个scrollrect属性,原来奥妙就在于此阿!经过试验,发现对某一个displayobject添加scrollrect属性后,其width、height就是这个scrollrect的width和height!不管自身尺寸比这个rect大还是小!注:ms有一个延迟,在设定scrollrect后立马查看尺寸居然不是rect的尺寸,而在enterframe监听中会发现过了这一桢,width、height会变为rect的尺寸,不知何故。在Ticore's Blog中找到了一个hack方法,哈哈,使scrollrect立即生效!

//*/ // Force DisplayObject update dimensions var bmpData:BitmapData = new BitmapData(1, 1); bmpData.draw(mc); //*/

还有就是直接更改scrollrect的x,y,width,height属性是没有效果的,要new一个rect指向scrollrect,然后修改rect再赋值给显示对象的scrollrect,类似于soundchannel的soundtransform,估计是as只有在set这些属性的时候根据这些属性里的各特性值统一设定某些东西,以后更改这些属性里面的某特性值是没有效果的,要重新赋这个属性)总结,as3的container实现可以借助scrollrect,在container中滚动时,改变scrollrect的位置,以滚动子显示对象!附:1. flex 3.0种的container类(所有容器类的父类)Container.as中的一段代码:

    protected function scrollChildren():void     {         if (!contentPane)             return;         var vm:EdgeMetrics = viewMetrics;         var x:Number = 0;         var y:Number = 0;         var w:Number = unscaledWidth - vm.left - vm.right;         var h:Number = unscaledHeight - vm.top - vm.bottom;         if (_clipContent)         {             x += _horizontalScrollPosition;                      if (horizontalScrollBar)                 w = viewableWidth;             y += _verticalScrollPosition;                          if (verticalScrollBar)                 h = viewableHeight;         }         else         {             w = scrollableWidth;             h = scrollableHeight;         }         // If we have enough space to display everything, don't set         // scrollRect.         var sr:Rectangle = getScrollableRect();         if (x == 0 && y == 0                            // Not scrolled                 && w >= sr.right && h >= sr.bottom &&  // Vertical content visible                 sr.left >= 0 && sr.top >= 0 && _forceClippingCount <= 0)            // No negative coordinates         {             contentPane.scrollRect = null;             contentPane.opaqueBackground = null;             contentPane.cacheAsBitmap = false;         }         else         {             contentPane.scrollRect = new Rectangle(x, y, w, h);         }         if (focusPane)             focusPane.scrollRect = contentPane.scrollRect;         if (border && border is IRectangularBorder &&             IRectangularBorder(border).hasBackgroundImage)         {             IRectangularBorder(border).layoutBackgroundImage();         }     }

2. as3.0语言参考中对scrollrect的解释scrollRect 属性  scrollRect:Rectangle  [read-write] 语言版本 :  ActionScript 3.0 Player 版本 :  Flash Player 9 显示对象的滚动矩形范围。 显示对象被裁切为矩形定义的大小,当您更改 scrollRect 对象的 x 和 y 属性时,它会在矩形内滚动。 scrollRect Rectangle 对象的属性使用显示对象的坐标空间,并缩放到像整个显示对象一样。 滚动显示对象上已裁切窗口的转角范围是显示对象的原点 (0,0) 和矩形的宽度和高度定义的点。 它们不按原点居中,而是使用原点定义区域的左上角。 滚动的显示对象始终以整像素为增量进行滚动。 您可以通过设置 scrollRect Rectangle 对象的 x 属性来左右滚动对象, 还可以通过设置 scrollRect 对象的 y 属性来上下滚动对象。 如果显示对象旋转了 90 度,并且您左右滚动它,则实际上显示对象会上下滚动。

转载于:https://www.cnblogs.com/pelephone/articles/as3-scrollrect-mask.html

最新回复(0)