Showing posts with label AS3. Show all posts
Showing posts with label AS3. Show all posts

Sunday, November 21, 2010

Subtraction between 2 dates

function dateSubtraction(d1y:int,d1m:int,d1d:int, d2y:int,d2m:int,d2d:int): Number {
return (cal2JD(d2y, d2m, d2d, 000-
cal2JD(d1y, d1m, d1d, 000));
}

function cal2JD(year,month,day,hour,minute,second) {
//
// Compute the Julian Date for a given day, month, year
//
var a = 0var b = 0;
var gregorian = false;

if (month < 3) { year -= 1; month += 12}

  // Check if date is in the Gregorian calendar.
  if (year > 1582) { gregorian = true}
if (year==1582)  {
if (month > 10)              { gregorian = true}
if ((month==10)&&(day>=15))  { gregorian = true}
}
if (gregorian==true) { a = intw(year/100); b = 2-a+intw(a/4)}

return (intw(365.25 * year+ intw(30.6001 (month + 1))
+ day + (hour/24(minute/1440(second/86400)
1720994.5 + b);
}

function intw(num) {
return parseInt("0" + num,10);  // INT function (like TRUNC).
}

trace(dateSubtraction(20101112010118))
// 7

Monday, July 19, 2010

iPhone touch motion

View

import flash.events.MouseEvent;
import flash.events.Event;

var totalScene:uint = 4;
var thumbWidth:Number = 317;
var currentIndex:int = 0;
var startMoveX: Number;
var lastMoveX: Number;
/*var startMoveY: Number;
var lastMoveY: Number;*/

var isDragging: Boolean = false;
var desX:Number = 0;

// FOR TEST ON MOUSE

//scene_mc: a top-left movie, contains 4 images with image's width = 317
scene_mc.addEventListener(MouseEvent.MOUSE_DOWN, onSceneMouseBegin);
this.stage.addEventListener(MouseEvent.MOUSE_UP, onSceneMouseUp);
function onSceneMouseBegin(e: MouseEvent)void {        
    isDragging = true;
    startMoveX = this.mouseX;
    //startMoveY = this.mouseY;
    
    scene_mc.startDrag(falsenew Rectangle(-scene_mc.width + thumbWidth/20
                        scene_mc.width, 0));
    this.removeEventListener(Event.ENTER_FRAME, ef);
    this.addEventListener(Event.ENTER_FRAME, ef);    
}

function onSceneMouseUp(e: MouseEvent)void {        
    scene_mc.stopDrag();
    isDragging = false;

    var diff = lastMoveX - startMoveX;
    if (Math.abs(diff30) {
        if (diff > 0) {
            activeSlide(currentIndex - 1);
        else {
            activeSlide(currentIndex+1)
        }
        return;
    }
    
    //check pos x if out of range
    var posX: int = Math.abs(scene_mc.x / thumbWidth);
    var plusX: Number = Math.abs(scene_mc.x % thumbWidth);    
    if (Math.abs(plusX>= thumbWidth/2posX ++;    
    if (posX >= totalSceneposX = totalScene - 1;
    activeSlide(posX);
}

function getMouseY(): Number {
    return this.mouseY;
}
function ef(e: Event)void {
    lastMoveX = this.mouseX;
    //lastMoveY = this.mouseY;
    if (!isDraggingscene_mc.x += (desX - scene_mc.x)*0.15;
}

function activeSlide(index: int) {
    if (index < 0index = 0;
    if (index >= totalSceneindex = totalScene - 1;
    currentIndex = index;
    desX = -index*thumbWidth;
}

DisplayUtils and fitIntoRect

Useful to create thumbnails and resizing

From http://blog.soulwire.co.uk/code/actionscript-3/fit-a-displayobject-into-a-rectangle

Sunday, July 18, 2010

Slide Transition


View DEMO

How to use:
import binhpro.SlideTransition;
import binhpro.ClickPageEvent;
var mcs: Array = [mc_1, mc_2,mc_3,mc_4];

//width of the mask in NORMAL, MAX, MIN width
var options: Object = new Object();
options["normal_width"150;
options["max_width"317;
options["min_width"94;

var slideTran: SlideTransition = new SlideTransition(this, mcs, options, 0true);
slideTran.addEventListener(ClickPageEvent.CLICK_PAGE_EVENT, onPageClicked);
    
function onPageClicked(event: ClickPageEvent) {
    var page: MovieClip = event.mc;
    trace("page is clicked: " + page.name);
}


SlideTransition.as
package binhpro //binhpro.SlideTransition
    import binhpro.utils.ImageUtils;
    import flash.display.MovieClip;
    import flash.events.EventDispatcher;
    import flash.events.MouseEvent;
    import gs.TweenMax;
    
    /**
     * ...
     @author binhdocco
    
    Event:  ClickPageEvent, type: ClickPageEvent.CLICK_PAGE_EVENT
    Usage:
    
    var options: Object = new Object();
    options["normal_width"] = 348;
    options["max_width"] = 792;
    options["min_width"] = 200;

    var slideTransition: SlideTransition = new SlideTransition(this, 
                            [page1, page2, page3, page4], 
                            options);
    slideTransition.addEventListener(ClickPageEvent.CLICK_PAGE_EVENT, onPageClicked);
    
    function onPageClicked(event: ClickPageEvent) {
        var page: MovieClip = event.mc;
        trace("page is clicked: " + page.name);
    }
     */
    public class SlideTransition extends EventDispatcher {
        
        private var mainmc: MovieClip;
        private var mcs: Array;
        private var verGap: Number;
        private var useBW: Boolean;
        
        private var NORMAL_WIDTH: Number = 210;// 212;
        private var MAX_WIDTH: Number = 650;// 353.3;
        private var MIN_WIDTH: Number = 122;    
        
        private var activeMC: MovieClip;
        
        public function SlideTransition(mmc: MovieClip, mcs: Array, 
                                        options: Object = null, vergap: Number = 4,
                                        useBlackAndWhiteAsNormal: Boolean = true) {
            this.mcs = mcs;
            this.mainmc = mmc;
            this.verGap = vergap;        
            this.useBW = useBlackAndWhiteAsNormal;
            if (options) {
                NORMAL_WIDTH = options['normal_width'];
                MAX_WIDTH = options['max_width'];
                MIN_WIDTH = options['min_width'];
            }
            reArrange();            
        }
        
        private function reArrange():void {
            var xpos: Number = NORMAL_WIDTH/2;            
            for (var i:int = 0; i < mcs.length; i++) {
                var mc: MovieClip = mcs[ias MovieClip;
                mc.x = xpos;
                xpos += NORMAL_WIDTH + verGap;    
                
                mc.buttonMode = true;
                mc.pos = i;
                mc.active = false;
                if (mc.text_mc) {
                    mc.textX = mc.text_mc.x;
                    mc.text_mc.mouseEnabled = false;
                }
                if (useBW) {
                    ImageUtils.blackAndWhite(mc, true);
                    mc.addEventListener(MouseEvent.MOUSE_OVER, onOver);
                    mc.addEventListener(MouseEvent.MOUSE_OUT, onOut);
                }
                
                if (mc.imgmc.img.addEventListener(MouseEvent.CLICK, onClick);
                if (mc.close_btnmc.close_btn.addEventListener(MouseEvent.CLICK, onClose);
            }
        }    
        
        private function onOut(e:MouseEvent):void {
            if (activeMC != e.currentTarget) {
                ImageUtils.blackAndWhite(e.currentTarget as MovieClip, true);
            }
        }
        
        private function onOver(e:MouseEvent):void {
            if (activeMC != e.currentTarget) {
                ImageUtils.blackAndWhite(e.currentTarget as MovieClip, false);
            }
        }
        
        private function onClose(e:MouseEvent):void {
            //trace("onClose: " + e.eventPhase);
            if (useBW && activeMCImageUtils.blackAndWhite(activeMC, true);
            activeMC = null;
            doArrange();
        }
        
        private function onClick(e:MouseEvent):void {
            //trace("onClick: " + e.eventPhase);
            var clickedMC: MovieClip = e.currentTarget.parent as MovieClip;
            if (activeMC) {
                if (useBWImageUtils.blackAndWhite(activeMC, true);
                if (activeMC.name != clickedMC.name) {                    
                    activeMC = clickedMC;                                        
                else {                    
                    if (useBW && activeMCImageUtils.blackAndWhite(activeMC, false);
                    //activeMC = null;
                    //jump page event
                    var jumpEvent: ClickPageEvent = new ClickPageEvent();
                    jumpEvent.mc = activeMC;
                    this.dispatchEvent(jumpEvent);
                    return;
                }
            else {
                activeMC = clickedMC;                
            }                    
            if (useBW && activeMCImageUtils.blackAndWhite(activeMC, false);
            doArrange();            
        }
        
        private function doArrange():void {
            //trace("doArrange");
            TweenMax.killAllTweens();
            var xpos: Number = NORMAL_WIDTH / 2;    
            for (var i:int = 0; i < mcs.length; i++) {
                var mc: MovieClip = mcs[ias MovieClip;
                if (activeMC) {        
                    if (activeMC.name == mc.name) {
                        if (i == 0xpos = 0;
                        xpos += MAX_WIDTH / 2;
                    else {
                        if (i == 0xpos = 0;
                        xpos += MIN_WIDTH / 2;
                    }                    
                }                 
                TweenMax.to(mc, 0.4x: xpos } );
                if (activeMC) {                    
                    if (activeMC.name == mc.name) {
                        xpos += MAX_WIDTH/+ verGap;
                        TweenMax.to(activeMC.mask_mc, 0.4width: MAX_WIDTH } );
                        if (mc.text_mc)
                            TweenMax.to(mc.text_mc, 0.4x: MAX_WIDTH/} );
                    else {
                        xpos += MIN_WIDTH/+ verGap;
                        TweenMax.to(mc.mask_mc, 0.4width: MIN_WIDTH } );
                        if (mc.text_mc)
                            TweenMax.to(mc.text_mc, 0.4x: MIN_WIDTH/} );
                    }
                else {
                    xpos += NORMAL_WIDTH + verGap;
                    TweenMax.to(mc.mask_mc, 0.4width: NORMAL_WIDTH } );
                    if (mc.text_mc)
                        TweenMax.to(mc.text_mc, 0.4x: mc.textX } );
                }
            }
        }
        
    }
    
}


ClickPageEvent.as
package binhpro //binhpro.ClickPageEvent
    import flash.display.MovieClip;
    import flash.events.Event;
    
    /**
     * ...
     @author binhdocco

     */
    public class ClickPageEvent extends Event {
        
        public static const CLICK_PAGE_EVENT: String = "CLICK_PAGE_EVENT";
        
        public var mc: MovieClip;
        
        public function ClickPageEvent(type: String = CLICK_PAGE_EVENT) {
            super(type);
        }
        
    }
    
}


ImageUtils.as
package binhpro.utils // binhpro.utils.ImageUtils
    import flash.display.DisplayObject;
    import flash.filters.ColorMatrixFilter;
    /**
     * ...
     @author binhdocco

     */
    public class ImageUtils{    
        
        // from http://snipplr.com
        public static function blackAndWhite($target:DisplayObject, $enabled:Boolean):void {
            if ($enabled) {
                var rc:Number = 1/3;
                var gc:Number = 1/3;
                var bc:Number = 1/3;
                var cmf:ColorMatrixFilter = new ColorMatrixFilter(
                            [rc, gc, bc, 
                            00, rc, gc, bc, 
                            00, rc, gc, bc, 
                            0000010]);            
                $target.filters = [cmf];
            else {
                $target.filters = [];
            }
        }
        
    }

}

Friday, July 16, 2010

Grid of Items Container

This post introduces to you a container that can help you create a grid of items that list in horizontal or vertical direction.

You can customize the ItemRenderer and ScrollBar by passing the name of it's Linkage Class.

HORIZONTAL CANVAS:

VIEW

VERTICAL CANVAS:

VIEW

EXAMPLE CODE:

import binhdocco.containers.canvas.Canvas;
import binhdocco.containers.events.ItemEvent;

var canvas: Canvas = new Canvas();

// dataProvider is an array of objects, contains information of an item
canvas.dataProvider = [11112222333444];

canvas.itemRenderer = SampleItemRenderer;
canvas.vScrollbar = vScrollBar;
//canvas.hScrollbar = hScrollBar;
canvas.limitValue = 5;

canvas.viewWidth = 475;
canvas.viewHeight = 280;
canvas.x = 60;
canvas.y = 60;

//canvas.itemPaddingX = 30;
//canvas.itemPaddingY = 5;
//canvas.direction = "horizontal";
this.addChild(canvas);

canvas.addEventListener(ItemEvent.ITEM_CLICK, onItemClick);
canvas.addEventListener(ItemEvent.ITEM_ROLL_OVER, onItemOver);
canvas.addEventListener(ItemEvent.ITEM_ROLL_OUT, onItemOut);

function onItemClick(e: ItemEvent) {
    output_txt.text = "Item Clicked: " + e.itemRenderer.name + "\n";
    (output_txt as TextField).appendText("Item data info: " + e.itemRenderer.data.toString());
}
function onItemOver(e: ItemEvent) {
    output_txt.text = "Item Over: " + e.itemRenderer.name + "\n";
    (output_txt as TextField).appendText("Item data info: " + e.itemRenderer.data.toString());
}
function onItemOut(e: ItemEvent) {
    output_txt.text = "Item Out: " + e.itemRenderer.name + "\n";
    (output_txt as TextField).appendText("Item data info: " + e.itemRenderer.data.toString());
}


Checkout SVN: https://flashtraining.googlecode.com/svn/trunk/AS3/BDCFramework

Monday, July 12, 2010

Image Book

VIEW

Easy mouse panning

Make the movie panning with moving mouse.


Example:
View

Source code:

stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoved)
stage.addEventListener(Event.ENTER_FRAME,enterFrame)
var newXPos = stage.stageWidth/-img_mc.width/2;
var newYPos = stage.stageHeight/-img_mc.height/2;
function mouseMoved(e){
    var xPercent = mouseX / stage.stageWidth;
    newXPos = (stage.stageWidth - img_mc.width* xPercent;
    var yPercent = mouseY / stage.stageHeight;
    newYPos = (stage.stageHeight - img_mc.height* yPercent;    
}

function enterFrame(e: Event) {
    img_mc.x += (newXPos - img_mc.x)*0.15;
    img_mc.y += (newYPos - img_mc.y)*0.15;
}



Code on the thumbnail map:
this.addEventListener(Event.ENTER_FRAME, onEF);
var theImage:MovieClip = (this.parent as MovieClip).img_mc;
var px:Number = 0;
var py:Number = 0;

function onEF(e: Event) {
    px = theImage.x;
    py = theImage.y;
    
    thumb_mc.x = px*thumb_mc.width/theImage.width;
    thumb_mc.y = py*thumb_mc.height/theImage.height;
    
    thumb2_mc.x = thumb_mc.x;
    thumb2_mc.y = thumb_mc.y;
}

Global Dispatcher

The purpose of this post is to use a dispatcher class to handle events between all content movies in a project.

For example, in movie A, you want to notify an event to movie B and movie C, instead of using movieA.addEventListener(movieAEvent) in movie B and movie C, now we only need to use simple below code in movie A:

var dispatcher: Dispatcher = new Dispatcher();
dispatcher.dispatchEvent(movieAEvent);


and in movie B and movie C, we use:

var dispatcher: Dispatcher = new Dispatcher();
dispatcher.addEventListener(movieAEvent, eventHandler);


The Dispatcher class can also use for communication between any objects with any instances or the stage. Very simple and useful.

package com.binhdocco.dispatcher {
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;
    
    /**
     * ...
     @author binhdocco

     */
    public class Dispatcher implements IEventDispatcher {
        
        protected static var disp: EventDispatcher;
        
        public function Dispatcher() {            
            if (disp == null)
                disp = new EventDispatcher();
        }
        
        /* INTERFACE flash.events.IEventDispatcher */
        
        public function addEventListener(type:String, listener:Function, 
                                        useCapture:Boolean = false, priority:int = 0
                                        useWeakReference:Boolean = false):void{
            disp.addEventListener(type, listener, useCapture, priority, useWeakReference);
        }
        
        public function dispatchEvent(event:Event):Boolean {            
            return disp.dispatchEvent(event);
        }
        
        public function hasEventListener(type:String):Boolean{
            return disp.hasEventListener(type);
        }
        
        public function removeEventListener(type:String, listener:Function, 
                                            useCapture:Boolean = false):void{
            disp.removeEventListener(type, listener, useCapture);
        }
        
        public function willTrigger(type:String):Boolean{
            return disp.willTrigger(type);
        }
        
    }

}