Accordionを使った事のある人なら一度は考えた事があるかも知れません。
全てのヘッダを閉じるAccordionです。
Accordionでは、いずれかのヘッダが必ず選択されている状態になり、全てを閉じる事は出来ません。
以下のサンプルではAccordionを継承したカスタムクラスにて、全てのヘッダが閉じている様に見える状態を擬似的に作り出しています。
AccordionCustom.as
CODE:
-
package io.mx.containers {
-
-
import flash.events.TimerEvent;
-
import flash.events.Event;
-
import flash.events.MouseEvent;
-
import flash.utils.Timer;
-
import mx.core.Container;
-
import mx.core.IDataRenderer;
-
import mx.containers.Accordion;
-
import mx.containers.accordionClasses.AccordionHeader;
-
import mx.containers.Canvas;
-
import mx.controls.Button;
-
import mx.events.ChildExistenceChangedEvent;
-
import mx.events.EffectEvent;
-
import mx.events.IndexChangedEvent;
-
import mx.effects.Move;
-
-
public class AccordionCustom extends Accordion {
-
-
private var indexChanged:Boolean = false;
-
private var csSelectIndex:int = 0;
-
private var dummyHeader:Boolean = false;
-
-
function AccordionCustom():void {
-
super();
-
-
addEventListener(MouseEvent.CLICK, clickHandler);
-
addEventListener(IndexChangedEvent.CHANGE, headerChangeHandler);
-
-
}
-
-
private function clickHandler(event:Event):void {
-
if (event.target is AccordionHeader) {
-
if ((csSelectIndex == super.selectedIndex) && ! indexChanged) {
-
allClose();
-
}
-
}
-
-
indexChanged = false;
-
}
-
-
private function headerChangeHandler(event:Event):void {
-
-
if (dummyHeader && (super.selectedIndex != (numChildren - 1))) {
-
removeDummyAccordionHeaderTimer();
-
}
-
-
csSelectIndex = super.selectedIndex;
-
-
indexChanged = true;
-
}
-
-
public function allClose():void {
-
addDummyAccordionHeader();
-
super.selectedIndex = numChildren -1;
-
-
csSelectIndex = super.selectedIndex;
-
}
-
-
private function addDummyAccordionHeader():void {
-
-
if (! dummyHeader) {
-
addChild(new Canvas());
-
getHeaderAt(numChildren - 1).visible = false;
-
-
dummyHeader = true;
-
}
-
}
-
-
private function removeDummyAccordionHeaderTimer():void {
-
var timer:Timer = new Timer(1, 1500);
-
timer.addEventListener(TimerEvent.TIMER, timerHandler);
-
timer.start();
-
-
function timerHandler(event:Event):void {
-
if (! getChildAt(numChildren - 1).visible) {
-
-
(event.target as Timer).stop();
-
(event.target as Timer).removeEventListener(TimerEvent.TIMER, timerHandler);
-
-
var targetArray:Array = new Array();
-
var startIdx:int = selectedIndex + 1;
-
var endIdx:int = numChildren - 1;
-
for(var i:int = startIdx; i <endIdx; i ++) {
-
targetArray.push(getHeaderAt(i));
-
}
-
if (targetArray.length> 0) {
-
var move:Move = new Move();
-
move.yBy = getHeaderAt(i).measuredHeight;
-
move.addEventListener(EffectEvent.EFFECT_END, effectEnd);
-
move.suspendBackgroundProcessing = true;
-
move.duration = 100;
-
move.play(targetArray);
-
} else {
-
removeDummyAccordionHeader();
-
}
-
-
if (csSelectIndex> (numChildren - 1)) {
-
csSelectIndex --;
-
}
-
}
-
-
function effectEnd(event:Event):void {
-
removeDummyAccordionHeader();
-
}
-
}
-
}
-
-
private function removeDummyAccordionHeader():void {
-
if (dummyHeader) {
-
removeChildAt(numChildren - 1);
-
-
dummyHeader = false;
-
}
-
}
-
}
-
}
表示用サンプル
Main.mxml
XML:
-
<mx:application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="io.mx.containers.*">
-
<ns1:accordioncustom x="70" y="60">
-
<mx:canvas label="ヘッダ1" width="100%" height="135">
-
<mx:datagrid x="0" y="0" width="198" height="180">
-
<mx:columns>
-
<mx:datagridcolumn headertext="列 1" datafield="col1">
-
<mx:datagridcolumn headertext="列 2" datafield="col2">
-
<mx:datagridcolumn headertext="列 3" datafield="col3">
-
</mx:datagridcolumn>
-
</mx:datagridcolumn>
-
</mx:datagridcolumn>
-
<mx:canvas label="ヘッダ2" width="100%" height="100%">
-
<mx:combobox x="10" y="10"></mx:combobox>
-
<mx:combobox x="10" y="40"></mx:combobox>
-
<mx:combobox x="10" y="70"></mx:combobox>
-
</mx:canvas>
-
<mx:canvas label="ヘッダ3" width="100%" height="241">
-
<mx:datechooser x="0" y="0" width="198" height="146">
-
</mx:datechooser>
-
</mx:canvas>
-
</mx:columns>
実行してみる
※Flashプレイヤーの9.0以降がインストールされている必要があります。




