1. ActionScript / Говнокод #14537

    −121

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    public override function updateDisplayList(
    	unscaledWidth:Number, unscaledHeight:Number):void {
    	super.updateDisplayList(unscaledWidth, unscaledHeight);
    	if (super.target.numElements < 1) return;
    
    	var coefficient:Number, child:DisplayObject, element:IVisualElement,
    	    matrix:Matrix;
    	
    	for (var i:uint; i < super.target.numElements; i++) {
    		element = super.target.getElementAt(i);
    		child = element as DisplayObject;
    		if (child) {
    			child.scaleX = child.scaleY = 1;
    			matrix = child.transform.matrix;
    			matrix.a = 1;
    			matrix.d = 1;
    			child.transform.matrix = matrix;
    			
    			trace("child class is:", getQualifiedClassName(child), 
    				getQualifiedSuperclassName(child));
    			
    			if (child is Group) {
    				trace("child is group");
    				(child as Group).resizeMode = ResizeMode.SCALE;
    			}
    			
    			// if the difference between the container width and the content
    			// width is less then the difference between the container's
    			// height and the content's height, set the content to the
    			// width of the container, adjusting the content's height to
    			// match the scale ratio of it's width
    			if (element.width / element.height <
    				super.target.width / super.target.height) {
    				if (child is SpriteVisualElement) {
    					coefficient = super.target.height / element.height;
    					element.height = super.target.height;
    					element.width *= coefficient;
    				} else {
    					child.height = super.target.height;
    					child.scaleX = child.scaleY;
    				}
    			} else {
    				if (child is SpriteVisualElement) {
    					coefficient = super.target.width / element.width;
    					element.width = super.target.width;
    					element.height *= coefficient;
    				} else {
    					child.width = super.target.width;
    					child.scaleY = child.scaleX;
    				}
    			}
    			
    			if (child is UIComponent) {
    				(child as UIComponent).validateDisplayList();
    			}
    			child.x = (super.target.width - child.width) / 2;
    			child.y = (super.target.height - child.height) / 2;
    		} else {
    			// Rect, BitmapImage and couple more components fall
    			// under this category. Let's do our best effort at
    			// scaling those
    			if (element.width / element.height <
    				super.target.width / super.target.height) {
    				coefficient = super.target.height / element.height;
    				element.height = super.target.height;
    				element.width *= coefficient;
    			} else {
    				coefficient = super.target.width / element.width;
    				element.width = super.target.width;
    				element.height *= coefficient;
    			}
    			element.x = (super.target.width - element.width) / 2;
    			element.y = (super.target.height - element.height) / 2;
    			if (element.x < 0 || element.y < 0) {
    				throw new Error("Element would be positioned outside its container");
    			}
    			trace("Child is not a display object", super.target.getElementAt(i));
    		}
    	}
    }

    Как Адоб сделал жизнь флекс-разработчиков интересной и насыщенной событиями.

    Запостил: wvxvw, 10 Февраля 2014

    Комментарии (2) RSS

    • и у какого же компонента такой забавный updateDisplayList?
      Ответить
      • Это попытка написать леяут для позиционирования содержания внутри контейнера таким образом, чтобы содержание всегда занимало максимальное пространство, не искажаясь в пропорциях.
        Лажа в том, что работая с обычным DisplayObject - этот код занял бы пару строк, а флексовые объекты, мало того, что скейлятся каждый - непредсказуемым образом, так еще и они все перекрывают нормальные, нужные свойства, своей невменяемой херней.
        Ответить

    Добавить комментарий