CoverFlowContainer.as
上传用户:chuer333
上传日期:2022-06-13
资源大小:906k
文件大小:5k
源码类别:

FlashMX/Flex源码

开发平台:

Flex

  1. package com.dougmccune.containers
  2. {
  3. import caurina.transitions.Tweener;
  4. import flash.display.DisplayObject;
  5. import flash.geom.ColorTransform;
  6. import mx.core.EdgeMetrics;
  7. import mx.core.UIComponent;
  8. import org.papervision3d.objects.DisplayObject3D;
  9. public class CoverFlowContainer extends BasePV3DContainer
  10. {
  11. /**
  12.  * The angle that each Plane is rotated on the y axis. This corresponds to PaperVision's yRotation property on
  13.  * the Plane. This is in degrees and should range from 0-90. A value of 0 means no rotation is applied and a value of 90
  14.  * would mean the Plane is rotated so much that it would effectively disappear.
  15.  */
  16. public var rotationAngle:Number = 70;
  17. /**
  18.  * If true the Planes near the edge of the component will fade to transparent. Kind of a cool effect sometimes
  19.  * if you want it.
  20.  */
  21. public var fadeEdges:Boolean = false;
  22. /**
  23.  * @private
  24.  * 
  25.  * For some of the layout stuff we need to know the max height of all the children. As children are
  26.  * added we make sure to update maxChildHeight.
  27.  */
  28. protected var maxChildHeight:Number;
  29. /**
  30.  * @private
  31.  * 
  32.  * For some of the layout stuff we need to know the max width of all the children. As children are
  33.  * added we make sure to update maxChildWidth.
  34.  */
  35. protected var maxChildWidth:Number;
  36. override public function addChild(child:DisplayObject):DisplayObject {
  37. super.addChild(child);
  38. var childHeight:Number = child is UIComponent ? UIComponent(child).getExplicitOrMeasuredHeight() : child.height;
  39. if(isNaN(maxChildHeight) || childHeight > maxChildHeight) {
  40. maxChildHeight = childHeight;
  41. }
  42. return child;
  43. }
  44. override protected function layoutChildren(unscaledWidth:Number, unscaledHeight:Number):void {
  45. super.layoutChildren(unscaledWidth, unscaledHeight);
  46. layoutCoverflow(unscaledWidth, unscaledHeight);
  47. }
  48. override public function removeChild(child:DisplayObject):DisplayObject {
  49. return super.removeChild(child);
  50. }
  51. protected function layoutCoverflow(uncaledWidth:Number, unscaledHeight:Number):void {
  52. var n:int = numChildren;
  53. for(var i:int=0; i<n; i++) {
  54. var child:DisplayObject = getChildAt(i);
  55. var plane:DisplayObject3D = lookupPlane(child);
  56. if(plane == null) {
  57. continue;
  58. }
  59. plane.container.visible = true;
  60. var abs:Number = Math.abs(selectedIndex - i);
  61. var horizontalGap:Number = getStyle("horizontalSpacing");
  62. if(isNaN(horizontalGap)) {
  63. //this seems to work fairly well as a default
  64. horizontalGap = maxChildHeight/3;
  65. }
  66. var verticalGap:Number = getStyle("verticalSpacing");
  67. if(isNaN(verticalGap)) {
  68. verticalGap = 10;
  69. }
  70. var xPosition:Number = selectedChild.width + ((abs-1) * horizontalGap);
  71. var yPosition:Number = -(maxChildHeight - child.height)/2;
  72. var zPosition:Number = camera.z/2 + selectedChild.width + abs * verticalGap;
  73. var yRotation:Number = rotationAngle;
  74. //some kinda fuzzy math here, I dunno, I was just playing with values
  75. //note that this only gets used if fadeEdges is true below
  76. var alpha:Number = (unscaledWidth/2 - xPosition) / (unscaledWidth/2);
  77. alpha  = Math.max(Math.min(alpha*2, 1), 0);
  78. if(i < selectedIndex) {
  79. xPosition *= -1;
  80. yRotation *= -1;
  81. }
  82. else if(i==selectedIndex) {
  83. xPosition = 0;
  84. zPosition = camera.z/2;
  85. yRotation = 0;
  86. alpha = 1;
  87. }
  88. if(fadeEdges) {
  89. //here's something sneaky. PV3D applies the colorTransform of the source movie clip to the
  90. //bitmapData that's created. So if we adjust the colorTransform that will be shown in the
  91. //3D plane as well. Cool, huh?
  92. var colorTransform:ColorTransform  = child.transform.colorTransform;
  93. colorTransform.alphaMultiplier = alpha;
  94. child.transform.colorTransform = colorTransform;
  95. plane.material.updateBitmap();
  96. }
  97. if(reflectionEnabled) {
  98. var reflection:DisplayObject3D = lookupReflection(child);
  99. if(fadeEdges) {
  100. reflection.material.updateBitmap();
  101. }
  102. //drop the reflection down below the plane and put in a gap of 2 pixels. Why 2 pixels? I think it looks nice.
  103. reflection.y = yPosition - child.height - 2;
  104. if(i!=selectedIndex) {
  105. Tweener.addTween(reflection, {z:zPosition, time:tweenDuration/3});
  106. Tweener.addTween(reflection, {x:xPosition, rotationY:yRotation, time:tweenDuration});
  107. }
  108. else {
  109. Tweener.addTween(reflection, {x:xPosition, z:zPosition, rotationY:yRotation, time:tweenDuration});
  110. }
  111. }
  112. if(i!=selectedIndex) {
  113. Tweener.addTween(plane, {z:zPosition, time:tweenDuration/3});
  114. Tweener.addTween(plane, {x:xPosition, y:yPosition, rotationY:yRotation, time:tweenDuration});
  115. }
  116. else {
  117. Tweener.addTween(plane, {x:xPosition, y:yPosition, z:zPosition, rotationY:yRotation, time:tweenDuration});
  118. }
  119. if(i == selectedIndex) {
  120. var bm:EdgeMetrics = borderMetrics;
  121. //We need to adjust the location of the selected child so
  122. //it exactly lines up with where our 3D plane will be. 
  123. child.x = unscaledWidth/2 - child.width/2 - bm.top;
  124. child.y = unscaledHeight/2 - child.height/2 - yPosition - bm.left;
  125. //the normal ViewStack sets the visibility of the selectedChild. That's no good for us,
  126. //so we just reset it back. 
  127. child.visible = false;
  128. }
  129. }
  130. }
  131. }
  132. }