カテゴリー : Flash

Flex4入門[2日目]

アニメーション

など画像を動かすタグも用意されています。

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?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"
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="768" minHeight="400" xmlns:local="*">

    <fx:Declarations>
        <s:Rotate3D id="rotate_effect_y"
                    target="{plane1}"
                    angleYFrom="0"
                    angleYTo="360"
                    repeatCount="2"
                    effectStart="myButton.visible=false;"
                    effectEnd="rotate_effect_x.end();rotate_effect_x.play();"/>
        <s:Rotate3D id="rotate_effect_x"
                    target="{plane1}"
                    angleXFrom="0"
                    angleXTo="360"
                    repeatCount="2"
                    effectStart="myButton.visible=false;"
                    effectEnd="rotate_effect_z.end();rotate_effect_z.play();"/>
        <s:Rotate3D id="rotate_effect_z"
                    target="{plane1}"
                    angleZFrom="0"
                    angleZTo="360"
                    repeatCount="2"
                    effectStart="myButton.visible=false;"
                    effectEnd="myButton.visible=true;"/>
       
       
       
       
    </fx:Declarations>
   
    <s:Button id="myButton"
              label="アニメーション開始"
              click="rotate_effect_y.play();"
              x="10"
              y="10"/>
   
    <mx:Image id="plane1"
              horizontalCenter="0"
              width="512"
              height="342"
              source="alba.jpg"
             
             
             
               />
   
   
   
</s:Application>

グラフィック

Flexでの描画にはMXMLグラフィックスとFXGの2種類あります。

単純な四角形の書き方。(MXML)

1
2
3
4
5
6
7
8
9
10
<s:Graphic>
        <s:Rect id="rect" width="200" height="200" x="60" y="100">
            <s:fill>
                <s:SolidColor id="rectcolor"  color="#00ffff"/>
            </s:fill>
            <s:stroke>
                <s:SolidColorStroke color="#660099" weight="2"/>
            </s:stroke>
        </s:Rect>
    </s:Graphic>

MXMLグラフィックスはコードの記述順にレンダリングされます。

FXGを使う。
イラレで保存したfxgデータをそのまま画像に利用することができます。
参照のやり方が本に載ってなかったので自力で調べる。

  • srcの中に新しくfgxというパッケージを「ファイル」→「新規」→「パッケージ」で作る。
  • そのfxgのパッケージの中に、イラレで作ったfxgデータを入れる。
  • mxnlでとして呼び出すと表示されます。

Flex4入門[1日目]

CS5についてきた「Flash Builder」を使いこなすべく、今日から勉強をしていきます。

Adobe Flash Builder Standard 4.0 日本語版 Windows/Macintosh版
Adobe Flash Builder Standard 4.0 日本語版 Windows/Macintosh版

まずは買った本

Flex 3.4プログラミング入門
Flex 3.4プログラミング入門

ビューステート

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
<?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"
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">

   
    <s:states>
        <s:State name="logout"/>
        <s:State name="login" enterState="tal.text+='ログインしました\n'" exitState="tal.text+='ログアウトしました\n'"/>
    </s:states>
   
    <s:HGroup>
        <s:Label text="ログイン中" color="#0000ff" visible="false" visible.login="true"/>
        <s:TextArea id="tal" height="300" width="200" width.login="333" height.login="40"/>
       
        <s:Button id="login_btn"
                  label.logout="ログインしてください"
                  label.login="ログアウトします"
                  click.logout="currentState='login';login_btn.label='ログオフします'"
                  click.login="currentState='logout';login_btn.label='ログインします'"/>
        </s:HGroup>
   
    <fx:Declarations>
        <!-- 非ビジュアルエレメント (サービス、値オブジェクトなど) をここに配置 -->
    </fx:Declarations>
</s:Application>

エフェクト

ターゲットが複数の場合は、targetではなくtargetsにする。
ターゲットの中身も配列で指定する。[targetA,targetB,targetC]のように

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
<?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"
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="768" minHeight="400" xmlns:local="*">

    <s:layout>
        <s:VerticalLayout/>
    </s:layout>
   
    <fx:Declarations>
      <s:Resize id="myResize"
                heightBy="25"
                widthBy="20"
                targets="{[botton1,botton2,botton3]}"/>
   
    </fx:Declarations>
   

    <s:Button id="botton1" label="button" />
    <s:Button id="botton2" label="button" />
    <s:Button id="botton3" label="button" />
    <s:Button id="botton4"
              label="大きくする"
              click="myResize.end(); myResize.play();"/>

   
</s:Application>

主なエフェクトプロパティ

  • duration:エフェクトの時間を指定。1000で一秒
  • repeatCount:エフェクトの回数。デフォルトは1。0だと無限に繰り返します
1
2
3
<s:layout>
        <s:VerticalLayout/>
    </s:layout>

レイアウトは

    BasicLayout

  • HorizontalLayout
  • VerticalLayout

レイアウトについてはこちらを参照した。

主なエフェクトイベント

  • effectEnd イベントが終了したときに指定されたイベントを実行します。

2/24 wonderfl気になるサンプルを勉強したメモ(Ginny Effect)

先日の外部から画像を呼び出す勉強をしている中で、面白いサンプルを見つけたので今日はこれを少し勉強してみようと思いましたが、難しすぎてすべて理解できませんでした。
もう少し勉強(特に数学、記号からどのような動きなのかわかるようになってから)してから再度挑戦をしてみたいです。

Ginny Effect

画面の設定と画像の呼び出し

1
2
3
4
5
6
7
8
9
10
11
12
13
public function Main():void {

stage.quality = StageQuality.MEDIUM; // ①Flashの画質を設定しています。
graphics.beginFill(0x0);
graphics.drawRect(0, 0, 465, 465);
// ②画面上に文字を挿入。(import com.bit101.components.*;)
new Label(this, 360, 440, "PLEASE CLICK STAGE")

var context:LoaderContext = new LoaderContext(true); //③異なるドメインから画像を呼び出す
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, compHandler);
loader.load(new URLRequest(IMAGE_URL), context);
}

①Flashの画質を設定。詳しくはこちら
②ステージ上に文字を表現。new Label(場所、文字のX軸、文字のY軸、”表示する文字”);
③異なるドメインの画像をアクセスする際にポリシーファイルを読み込む必要があります。
• Security.loadPolicyFile()を使い直接(crossdomain.xml)読み込む方法
• checkPolicyFile()を使いロードごとにクロスドメインを読み込む方法とあります。今回は後者の例を使っています。
詳しくはこのサイトを参考下さい。

実際の処理の流れ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private function compHandler(e:Event):void {
sprite = new Sprite();
addChild(sprite);
vertexs = []
for (var xx:int = 0; xx &lt; SEGMENT; xx++) {
vertexs[xx] = [];
for (var yy:int = 0; yy &lt; SEGMENT; yy++) {
vertexs[xx][yy] = new Point(xx * IMG_W / SEGMENT, yy * IMG_H/SEGMENT);
}
}
draw();
addEventListener(Event.ENTER_FRAME, draw);
stage.addEventListener(MouseEvent.CLICK, clickHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
}

vertexs[xx][yy]
具体的に vertexs[1][1] = (50,40)
vertexs[1][2] = (50,80)
vertexs[1][3] = (50,120)

vertexs[2][1] = (100,40)
vertexs[2][2] = (100,80)
vertexs[2][3] = (100,120)

実際の画像の動き(BetweenAS3)

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
private function clickHandler(e:MouseEvent):void {
var tweens:Array = [];
var xx:int, yy:int, delay:Number;
var px:Number = SEGMENT * (mouseX / IMG_W);
var py:Number = SEGMENT * (mouseY / IMG_H);
// 画像が表示されている時の処理
if (!isHide) {
for (xx = 0; xx &lt; SEGMENT; xx++) {
for (yy = 0; yy &lt; SEGMENT; yy++) {
vertexs[xx][yy] = new Point(xx * IMG_W / SEGMENT, yy * IMG_H/SEGMENT);
// 画像のは位置している地点により、マウスの押した位置に収束する時間を変えている。
delay = Math.sqrt((xx - px) * (xx - px) + (yy - py) * (yy - py)) / 40;

tweens.push(
BetweenAS3.delay(
BetweenAS3.tween(vertexs[xx][yy], {
x : px * IMG_W / SEGMENT,
y : py * IMG_H / SEGMENT
}
,null
,delay
,Cubic.easeIn),
delay / 2)
)
}
}
// 画像が表示されていない時の処理
}else {
// 重み付けが怪しい・・・
var max:Number = 0;
for (xx = 0; xx &lt; SEGMENT; xx++) {
for (yy = 0; yy &lt; SEGMENT; yy++) {
vertexs[xx][yy] = new Point(px * IMG_W / SEGMENT, py * IMG_H / SEGMENT);
delay = Math.sqrt((xx - px) * (xx - px) + (yy - py) * (yy - py))
max = Math.max(max, delay);
}
}
for (xx = 0; xx &lt; SEGMENT; xx++) {
for (yy = 0; yy &lt; SEGMENT; yy++) {
delay = (max - Math.sqrt((xx - px) * (xx - px) + (yy - py) * (yy - py))) / 40;
tweens.push(
BetweenAS3.delay(
BetweenAS3.tween(vertexs[xx][yy], {
x : xx * IMG_W / SEGMENT,
y : yy * IMG_H / SEGMENT
},null, delay + 0.05, Quad.easeOut),
delay / 2
)
)
}
}
}
// 指定された配列内のトゥイーンを結合して、同時に実行するトゥイーンを作成します.
var itw:ITween = BetweenAS3.parallelTweens(tweens);
if (isShift) itw = BetweenAS3.scale(itw, 5);
itw.play();

isHide = !isHide;
}

delay = Math.sqrt((xx – px) * (xx – px) + (yy – py) * (yy – py)) / 10;
画像のは位置している地点により、マウスの押した位置に収束する時間を変えている。

BetweenAS3の処理方法

1
2
3
4
5
6
7
8
9
10
11
12
13
//配列の中にBetweenAS3を放り込んでいる。
tweens.push(
BetweenAS3.delay(
BetweenAS3.tween(vertexs[xx][yy], {
x : xx * IMG_W / SEGMENT,
y : yy * IMG_H / SEGMENT
},
null,
delay + 0.05,
Quad.easeOut),
delay / 2
)
)

BetweenAS3.delay
BetweenAS3.delay(BetweenAS3.tween(mc, {x: 100}), 1.0);
BetweenAS3.tween(mc, {x: 100})の処理を1秒遅らしている。

BetweenAS3.parallelTweens(tweens);
指定された配列内のトゥイーンを結合して、同時に実行するトゥイーンを作成します.
BetweenAS3.scale(itw, 5);
指定されたトゥイーンをタイムスケールしたトゥイーンを作成します.
デフォルト値は1。これが通常のタイムスケールとみなされる。値を2にするとトゥイーンエンジンが早送りモードとなり、全てのトゥイーンは通常の半分の早さで完了する。値を0.5にすると通常の倍の時間をかけるので、見た目的にはスローモーションで実行されている状態になる。

Vector クラス メモ

Vector クラス

Arrayと同じ配列を表すクラスです。
Vector.< 型名 >で利用します。

1
2
3
4
var  object :Vector.<Number > = new Vector.<Number>
object[0] = 10;
object[1] = 20;
object[2] = 30;

同じ型しか格納できない。
Vector型では 0 番地から 1 ずつ順番に格納する。
Array 型より Vector 型のほうが高速に動作します。

2/21 画像ファイルの読み込み

今までの復習をかねて、今後実践でも使うことができると思われるXML,XPath,外部からのファイルの呼び出しを中心に勉強をしています。

外部の画像ファイルの呼び出し。

外部の画像ファイルを表示するためコードです。

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
package
{
    import flash.display.Sprite;
    import flash.display.Loader;
    import flash.net.URLRequest;

    public class newLoader extends Sprite
    {
        var urlList:Array = new Array();
        var loaderList:Array = new Array();

        public function newLoader() {
            urlList[0] = "image/IMG_1761.jpg";
            urlList[1] = "image/IMG_1770.jpg";
            urlList[2] = "image/IMG_1779.jpg";

            for (var i = 0; i < urlList.length; i++) {
                var x:int;
                loaderList[i] = new Loader();
                addChild(loaderList[i]);
                loaderList[i].load(new URLRequest(urlList[i]));
                loaderList[i].x = i*150;
                loaderList[i].y = i*50;
                loaderList[i].scaleX =0.1;
                loaderList[i].scaleY =0.1;
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package{
   
    import flash.display.Sprite;
    import flash.display.Loader;
    import flash.net.URLRequest;
   
    public class imgLoader extends Sprite{
       
        var imgloader:Loader = new Loader;
       
        public function  imgLoader(){
             addChild(imgloader);
            imgloader.load(new URLRequest("image/IMG_1790.jpg"));
                                                               
           
        }
    }
}

外部からXMLデータを取得

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
32
33
34
35
36
37
38
39
40
41
42
43
package{
   
    import flash.display.Sprite;
    import flash.net.URLRequest;
    import flash.net.URLLoader;
    import flash.events.Event;
   
    public class imgLoader extends Sprite{
       
        var pathxml:String = "test.xml";
        var url_loader:URLLoader;
       
        var name_list:Array = new Array();
        var path_list:Array = new Array();
       
       
        public function  imgLoader(){
             
             url_loader = new URLLoader(new URLRequest(pathxml));
             
             url_loader.addEventListener(Event.COMPLETE,onload);
             
           
        }
       
         public function onload(event:Event):void{
           
            var xml:XML = new XML(url_loader.data);
           
            for each(var xmlObj:Object in xml.img){
               
                name_list.push(xmlObj.text());
                path_list.push(xmlObj.@src);
            }
           
            for(var i:int =0 ; i < name_list.length;i++){
               
                trace(name_list[i]);
                trace(path_list[i]);
            }
        }
    }
}

サムネイルとは、多数の画像を一覧表示するために縮小された画像。

1
2
3
4
5
6
7
8
9
10
for(var i:uint = 0; i< img_list.length;i++){
           
    thum.push(new Sprite());
    var thumLoader:Loader = new Loader();
  順番に画像をSpriteオブジェクトに入れている。
    thumLoader.load(new URLRequest(thum_list[i]));
    thum[i].addChild(thumLoader);
    thum[i].name = String(i);
    thumLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,onthumImgLoadComp);
            }

• サムネイルの中にSpriteオブジェクトを作成します。
 スプライトは、表示するイメージと表示する位置をもつオブジェクトです。
• このSpriteオブジェクトの中に、xmlから取り出したjpgのイメージを当てはめます。
• contentLoaderInfo.addEventListenerについては高記載があります。
外部イメージ(SWFも含む)の読み込み完了したことを知るためには、contentLoaderInfo プロパティの complete イベントを監視すればよい。ロードされたデータのダウンロードが完了された場合に送出されるイベントです。

1
2
3
4
5
6
7
8
9
10
11
function onthumImgLoadComp(event:Event):void{
           
            var imgNum:int = int(event.target.loader.parent.name);
           
            event.target.loader.x = (event.target.width + _thumInterval)*(imgNum % _thumNum);
            event.target.loader.y = (event.target.height + _thumInterval)*(int(imgNum / _thumNum));
            thumContainer.addChild(event.target.loader);
           
            event.target.loader.name = imgNum;
            event.target.loader.addEventListener(MouseEvent.CLICK,onClick);
        }

読み込んだ画像の処理を記載されています。
とりだした画像を画面にどう貼付けるかが載ってます。

(event.target.width + _thumInterval)*(imgNum % _thumNum);
画像の幅に画像間の間隔を足したものに画像の番号を画像を並べる数の剰余をかけている。
「x % y」は x を y で割った余りを表す。

1
2
3
4
5
6
7
8
9
function imgloadComp(event:Event):void{
           
    while(imgContainer.numChildren > 0){
               
    imgContainer.removeChildAt(0);
    }
           
  imgContainer.addChild(event.target.loader);
}

numChildren
指定したオブジェクト内にいくつのオブジェクトを保有しているかを調べるプロパティです。

removeChildAt(0);
任意の階層にあるオブジェクトを削除する場合に利用されます。
今回はクリックするごとに画像がかわるので、削除する画像を直接指定するのではなくインデックス(階層0)を指定している。これでimgContainer の任意の画像を削除している。