如何从ILayoutElement获取DisplayObject以应用模糊过滤器

如何从ILayoutElement获取DisplayObject以应用模糊过滤器,layout,flex4,Layout,Flex4,这是我的布局: 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; impo

这是我的布局:

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();

            }

        }

    }

}

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();

            }

        }

    }

}

我没有遵循您的代码,但我只是通过这段视频了解到元素和child是不同的接口。getChildAt接口似乎是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();

            }

        }

    }

}