読者です 読者をやめる 読者になる 読者になる

萌アンドロイド子とツーショット撮影ができるアプリを公開

AIR Android Flex4


萌アンドロイド子とツーショット撮影ができるアプリを公開しました。
萌アンドロイド子とツーショット撮影!! - Android Market
https://market.android.com/details?id=air.androikoCharaCamera
こんな感じにツーショットが撮れます!!

今回はAlchemyなJpegエンコーダーとタッチによるキャラクターの移動ができるようになっています。あと、バックやホームボタンでアプリが完全に終了するようにしました。
今後の予定としてはやはりパーティクルを使った演出と簡単な画像処理をしてみたいと思います(^_^)
ソースはこちら。

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:mx="library://ns.adobe.com/flex/mx"
        actionBarVisible="false" chromeColor="#FFFFFF" contentBackgroundColor="#FFFFFF"
        creationComplete="view1_creationCompleteHandler(event)" overlayControls="true"
        tabBarVisible="false">
    <fx:Script>
        <![CDATA[
            import cmodule.aircall.CLibInit;
            import mx.events.FlexEvent;
            //アプリ初期化
            private var cam:Camera;
            protected function view1_creationCompleteHandler(event:FlexEvent):void
            {
                this.addEventListener(KeyboardEvent.KEY_DOWN , onKey );
                this.addEventListener(Event.DEACTIVATE , onDeactivateHandler);
                cam = Camera.getCamera();
                cam.setMode(640,480,5);
                var vd:Video =  new Video(cam.width,cam.height);
                vd.rotation = 90;
                vd.x = 480;
                vd.attachCamera(cam);
                myUI.addChild(vd);
            }
            //終了イベント
            protected function onDeactivateHandler( e:Event ):void{
                NativeApplication.nativeApplication.exit();
            }
            //ホームキーなど押された場合
            private function onKey( e:KeyboardEvent ):void
            {
                switch(e.keyCode){
                    case Keyboard.BACK:
                        trace("BACK");
                        NativeApplication.nativeApplication.exit();
                        break;
                    case Keyboard.MENU:
                        trace("MENU");
                        NativeApplication.nativeApplication.exit();
                        break;
                    case Keyboard.SEARCH:
                        trace("SEARCH");
                        break;
                }
            }
            //カメラキャプチャー
            private var lib : Object;
            private var init:CLibInit;
            private var baout:ByteArray;
            private var ba:ByteArray;
            private var bmd:BitmapData = new BitmapData(480,680);
            protected function btnImage_clickHandler(event:MouseEvent):void
            {
                //キャプチャーされた画像を表示しておく(プレビュー)
                cover.visible = true;
                bmd = new BitmapData(480,680);
                bmd.draw(canvas);
                capturedImage.source = bmd;
                captureImageShow.play();
                soundCapture.play();
            }
            //画像保存
            private function doSave():void{
                btnImage.bottom = -10;
                //メッセージの表示
                messageBase.visible = true;
                messageTxt.text = "SDカードに画像を保存しています";
                //Alchemyの準備
                init = new CLibInit();
                lib = init.init();
                baout = new ByteArray();
                ba = bmd.getPixels( new Rectangle(0,0,480,680) );
                ba.position = 0;
                if ( baout ){
                    baout.clear();
                }else{
                    baout = new ByteArray();
                }
                //非同期でJPG保存
                lib.encodeAsync( compressFinished, ba, baout, 480 , 680 , 90, 10 );
            }
            //画像をJPGエンコード完了・画像保存
            private var date:Date = new Date();
            private function compressFinished( out:ByteArray ):void
            {
                cover.visible = false;
                //メッセージの表示
                messageTxt.text = "保存しました!";
                messageBase.visible = false;
                //画像の保存
                var fileName:String = date.getFullYear() +"_"+ (date.getMonth()+1) +"_"+ date.getDay() +"_"+ date.getHours() +"_"+ date.getMinutes() +"_"+ date.getSeconds() + "_"+ + date.getMilliseconds() + ".jpg";
                var file:File = File.documentsDirectory.resolvePath(fileName);
                var stream:FileStream = new FileStream();
                stream.open(file, FileMode.WRITE);
                stream.writeBytes(baout);
                stream.close();
                soundSaved.play();
                ba.clear();
                baout.position = 0;
                btnImage.bottom = 0;
                captureImageSave.play();
            }
            //保存ボタンクリックイベント
            protected function saveBtn_clickHandler(event:MouseEvent):void
            {
                saveBtn.alpha = 0;
                disposeBtn.alpha = 0;
                doSave();
            }
            //キャンセルボタンクリックイベント
            protected function disposeBtn_clickHandler(event:MouseEvent):void
            {
                cover.visible = false;
                captureImageCancel.play();
                saveBtn.alpha = 0;
                disposeBtn.alpha = 0;
            }
        ]]>
    </fx:Script>
    <fx:Declarations>
        <!--サウンドエフェクト-->
        <mx:SoundEffect id="soundCapture"   target="{this}" useDuration="false" source="@Embed('assets/caputer.mp3')"/>
        <mx:SoundEffect id="soundSaved"     target="{this}" useDuration="false" source="@Embed('assets/saved.mp3')"/>
        <s:Fade id="btnShow" targets="{[saveBtn,disposeBtn]}" alphaFrom="0" alphaTo="1"/>
        <s:Fade id="btnHide" targets="{[saveBtn,disposeBtn]}" alphaFrom="1" alphaTo="0"/>
        <s:Move id="captureImageShow" target="{capturedCanvas}" yFrom="{-capturedCanvas.height}" yTo="0" duration="1000" effectEnd="{btnShow.play()}"/>
        <s:Move id="captureImageSave" target="{capturedCanvas}" yFrom="0" yTo="{capturedCanvas.height}" duration="1000"/>
        <s:Move id="captureImageCancel" target="{capturedCanvas}" yFrom="0" yTo="{-capturedCanvas.height}" duration="1000"/>
    </fx:Declarations>
    <s:Group width="480" height="800" clipAndEnableScrolling="true" horizontalCenter="0" verticalCenter="0">
        <!--写真-->
        <s:Image id="bgImage" verticalCenter="0" horizontalCenter="0" source="@Embed('assets/bg.jpg')"/>
        <s:Group id="canvas" width="480" height="680" clipAndEnableScrolling="true" horizontalCenter="0" verticalCenter="0">
            <s:Group width="433" height="632" clipAndEnableScrolling="true" horizontalCenter="0" verticalCenter="0">
                <s:Rect width="100%" height="100%" visible="true">
                    <s:fill>
                        <s:SolidColor color="0x000000" alpha="1"/>
                    </s:fill>
                </s:Rect>
                <mx:UIComponent id="myUI" width="480" height="640" horizontalCenter="0" verticalCenter="0"/>
                <s:Image id="logoImage" horizontalCenter="0" top="30" source="@Embed('assets/logo.png')"
                         mouseDown="{logoImage.startDrag()}" mouseUp="{logoImage.stopDrag()}" mouseOut="{logoImage.stopDrag()}"/>
                <s:Image id="charaImage" right="10" bottom="40" source="@Embed('assets/chara.png')"
                         mouseDown="{charaImage.startDrag()}" mouseUp="{charaImage.stopDrag()}" mouseOut="{charaImage.stopDrag()}"/>
            </s:Group>
            <s:Image id="frameImage" verticalCenter="0" horizontalCenter="0" source="@Embed('assets/frame.png')" alpha="0.99"
                     mouseChildren="false" mouseFocusEnabled="false" mouseEnabled="false"/>
        </s:Group>
        <s:Image id="btnImage" horizontalCenter="0" bottom="0" source="@Embed('assets/btn.png')" click="btnImage_clickHandler(event)"/>
        <!--オーバーレイ-->
        <s:Rect id="cover" width="100%" height="100%" visible="false">
            <s:fill>
                <s:SolidColor color="0x0000" alpha="1"/>
            </s:fill>
        </s:Rect>
        <!--キャプチャー画像と保存・キャンセルボタン-->
        <s:Group id="capturedCanvas" width="480" height="800" y="-800" horizontalCenter="0" clipAndEnableScrolling="true">
            <s:Image id="capturedImage" width="480" height="640" horizontalCenter="0" verticalCenter="0"/>
            <s:Image id="saveBtn" source="@Embed('assets/saveBtn.png')" click="saveBtn_clickHandler(event)" bottom="10" left="10" alpha="0"/>
            <s:Image id="disposeBtn" source="@Embed('assets/disposeBtn.png')" click="disposeBtn_clickHandler(event)" bottom="10" right="10" alpha="0"/>
        </s:Group>
        <!--メッセージボックス-->
        <s:Group id="messageBase" horizontalCenter="0" verticalCenter="0" visible="false" showEffect="Fade" hideEffect="Fade">
            <s:Rect width="400" height="102" radiusX="10" radiusY="10">
                <s:fill>
                    <s:SolidColor color="0xffccff" alpha="0.8"/>
                </s:fill>
            </s:Rect>
            <s:Label id="messageTxt" text="" horizontalCenter="0" verticalCenter="0" color="0xd900bd"/>
        </s:Group>
    </s:Group>
</s:View>