Как получить DisplayObject из ILayoutElement, чтобы применить BlurFilter - PullRequest
0 голосов
/ 05 апреля 2011

Это мой макет:

package layouts{

    import mx.core.ILayoutElement;
    import mx.core.IVisualElement;

    import spark.layouts.supportClasses.LayoutBase;
    import flash.geom.Point;
    import flash.geom.Matrix3D;
    import flash.geom.Vector3D;
    import flash.display.DisplayObject;
    import flash.geom.PerspectiveProjection;
    import spark.filters.BlurFilter;
    import flash.filters.BitmapFilterQuality;

    public class CoverFlowLayout extends LayoutBase {

        private var _index:uint = 0;

        override public function updateDisplayList(width:Number, height:Number):void {

            super.updateDisplayList(width, height);

            if (target) {

                var pproj:PerspectiveProjection = new PerspectiveProjection();
                pproj.projectionCenter = new Point(width / 2, height / 2);
                target.transform.perspectiveProjection = pproj;

                var total:int = target.numElements;
                var actual:int = Math.max(index, 0);

                for (var i:int = 0; i < total; i++) {

                    var element:ILayoutElement = (useVirtualLayout) ? target.getVirtualElementAt(i) : target.getElementAt(i);
                    var child:DisplayObject = target.getChildAt(i);

                    element.setLayoutBoundsSize(NaN, NaN, false);

                    var matrix:Matrix3D = new Matrix3D();
                    var offset:int = i - actual;
                    var rotation:Number = -12 * offset;
                    offset = Math.abs(offset);
                    var x:int = 190 * (i - actual) + width / 2;
                    var y:int = 0;
                    var blur:BlurFilter = new BlurFilter(offset, offset, BitmapFilterQuality.MEDIUM);

                    matrix.appendRotation(rotation, Vector3D.Y_AXIS);
                    matrix.appendTranslation(x, 0, 200 * offset);

                    IVisualElement(element).depth = total - offset;
                    child.filters = [blur];
                    element.setLayoutMatrix3D(matrix, false);

                }

            }

        }

        protected function invalidateTarget():void {

            if(target) {

                target.invalidateSize();
                target.invalidateDisplayList();

            }

        }

        [Bindable]
        public function get index():uint {

            return _index;

        }

        public function set index(value:uint):void {

            if ( _index != value ) {

                _index = value;
                invalidateTarget();

            }

        }

    }

}

, но кажется, что дочерний элемент и элемент не совпадают, так как я могу применить это размытие к DisplayObject, связанному с текущим элементом ILayoutElement в цикле?

Хорошо ... может быть, это так?:

DisplayObject(element).filters = [blur];

1 Ответ

0 голосов
/ 08 апреля 2011

Сообщество Flex 4 мертво, или я плохо спрашиваю, отмечаю тегами и т. Д., Давайте ответим на мой собственный вопрос:

package layouts {

    import mx.core.ILayoutElement;
    import mx.core.IVisualElement;

    import spark.layouts.supportClasses.LayoutBase;
    import flash.geom.Point;
    import flash.geom.Matrix3D;
    import flash.geom.Vector3D;
    import flash.display.DisplayObject;
    import flash.geom.PerspectiveProjection;
    import spark.filters.BlurFilter;
    import flash.filters.BitmapFilterQuality;

    public class CoverFlowLayout extends LayoutBase {

        private var _index:uint = 0;

        override public function updateDisplayList(width:Number, height:Number):void {

            super.updateDisplayList(width, height);

            if (target) {

                var pproj:PerspectiveProjection = new PerspectiveProjection();
                pproj.projectionCenter = new Point(width / 2, height / 2);
                target.transform.perspectiveProjection = pproj;

                var total:int = target.numElements;
                var actual:int = Math.max(index, 0);

                for (var i:int = 0; i < total; i++) {

                    var element:ILayoutElement = (useVirtualLayout) ? target.getVirtualElementAt(i) : target.getElementAt(i);
                    var child:DisplayObject = DisplayObject(element);

                    element.setLayoutBoundsSize(NaN, NaN, false);

                    var matrix:Matrix3D = new Matrix3D();
                    var offset:int = i - actual;
                    var rotation:Number = -12 * offset;
                    offset = Math.abs(offset);
                    var x:int = 190 * (i - actual) + width / 2;
                    var y:int = 0;
                    var blur:BlurFilter = new BlurFilter(offset, offset, BitmapFilterQuality.MEDIUM);

                    matrix.appendRotation(rotation, Vector3D.Y_AXIS);
                    matrix.appendTranslation(x, 0, 200 * offset);

                    IVisualElement(element).depth = total - offset;
                    child.filters = [blur];
                    element.setLayoutMatrix3D(matrix, false);

                }

            }

        }

        protected function invalidateTarget():void {

            if(target) {

                target.invalidateSize();
                target.invalidateDisplayList();

            }

        }

        [Bindable]
        public function get index():uint {

            return _index;

        }

        public function set index(value:uint):void {

            if ( _index != value ) {

                _index = value;
                invalidateTarget();

            }

        }

    }

}
...