如何从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();
}
}
}
}