Flex 4 でコンテナにスクロールバーを表示する

Flex 4 (Gumbo) フレームワークでは、コンテナ内にたくさんの子コンポーネントを配置しても自動的にスクロールバーを表示する処理を行いません。

コンテナにスクロールバーを表示させるためには次の二つの方法があります。

方法1)スキンを利用する。

スクロールバーを表示するためにはコンテナのスキンに spark.components.Scroller を追加します。

まずは MXML でスキンを作成します。

skins/ApplicationSkin.mxml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="utf-8"?>
<s:SparkSkin
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    alpha.disabled="0.5">
 
    <fx:Metadata>
        [HostComponent("spark.components.Application")]
    </fx:Metadata>
 
    <!-- ビューステート -->
    <s:states>
        <s:State name="normal"/>
        <s:State name="disabled"/>
    </s:states>
 
    <!-- 背景とか -->
    <s:Rect top="0" bottom="0" left="0" right="0">
        <s:fill>
            <s:SolidColor color="{hostComponent.backgroundColor as uint}"/>
        </s:fill>
    </s:Rect>
 
    <!-- コンテナを Scroller でラップ -->
    <s:Scroller top="0" bottom="0" left="0" right="0">
 
        <!-- 子コンポーネントを内包するためのコンテナ -->
        <s:Group id="contentGroup" top="0" bottom="0" left="0" right="0"/>
    </s:Scroller>
 
</s:SparkSkin>

これはデフォルトのスキン「spark.skins.ApplicationSkin」に <s:Scroller> を追加しているだけです。(25行目、29行目)

あとは、Application にスキンを適用するだけ。

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<s:Application
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    skinClass="skins.ApplicationSkin">
        ・
        ・
        ・
</s:Application>

これで子コンポーネントが多い場合にはスクロールバーが表示されます。

方法2)スキンを使わずコンテナに Scroller を追加して、その中に子コンポーネントを配置する

こちらは手っ取り早くスキンを使わないで、コンテナに Scroller を直接配置する方法です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<s:Application
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark">
 
    <s:Scroller width="100%" height="100%">
        <s:Group width="100%" height="100%">
            ・
            ・
            ・
        </s:Group>
    </s:Scroller>
 
</s:Application>

やっていることは方法1と同じですが、こうすると1段 DisplayObject の階層が深くなるのでスキンを利用する方がベターかなと思います。

Flex 3 まではスクロールバーが必要なくても内部的には実装されてたけど、Flex 4 は必要な場合には自分で追加するって感じ。

標準のコンポーネントから余分なコードがなくなってちょっとすっきりしたかな。

Leave a Reply