added animates

This commit is contained in:
2015-05-20 12:27:06 +03:00
parent 9abd0ebf88
commit 448e48e803
5 changed files with 100 additions and 7 deletions

View File

@@ -0,0 +1,53 @@
package haxework.animate;
import openfl.events.Event;
import flash.display.Stage;
class Animate implements IAnimate {
private static var running:Array<IAnimate> = new Array<IAnimate>();
public static function bind(stage:Stage):Void {
stage.addEventListener(Event.ENTER_FRAME, function(_) {
Animate.updateAll();
});
}
public static function updateAll():Void {
if (running.length > 0) {
var time = Date.now().getTime();
for (animate in running) animate.update(time);
}
}
private var callback:Animate -> Void;
private var duration:Int;
private var startTime:Float;
private var progress:Float;
public function new(duration:Int) {
this.duration = duration;
}
public function start(callback:IAnimate -> Void, ?custom:Bool = false):Void {
startTime = Date.now().getTime();
this.callback = callback;
if (!custom) running.push(this);
update(startTime);
}
private function update(time:Float):Void {
progress = (time - startTime) / duration;
if (progress >= 1) {
running.remove(this);
if (callback != null) {
callback(this);
callback = null;
}
}
}
public function cancel():Void {
if (!Math.isNaN(startTime)) update(startTime + duration);
}
}

View File

@@ -0,0 +1,9 @@
package haxework.animate;
interface IAnimate {
public function start(callback:IAnimate->Void, ?custom:Bool = false):Void;
public function cancel():Void;
private function update(time:Float):Void;
}

View File

@@ -1,5 +1,6 @@
package haxework.frame;
import haxework.animate.IAnimate;
import flash.display.Sprite;
import haxework.gui.IView;
import haxework.gui.GroupView;
@@ -9,27 +10,53 @@ class FrameSwitcher extends GroupView implements IFrameSwitcher<Sprite> {
public var current(default, null):Null<IView<Dynamic>>;
private var frames:Map<String, IView<Dynamic>>;
public var animateFactory(default, default):Class<IAnimate>;
private var animate:IAnimate;
public function new() {
super();
frames = new Map<String, IView<Dynamic>>();
current = null;
}
private function buildAnimate(view:IView<Dynamic>):Null<IAnimate> {
if (animateFactory != null) {
return Type.createInstance(animateFactory, [view]);
}
return null;
}
public function change(id:String):IView<Dynamic> {
var prev = null;
if (current != null) {
if (current.id == id) return current;
var onHideethod:Dynamic = Reflect.field(current, "onHide");
if (onHideethod != null) Reflect.callMethod(current, onHideethod, []);
removeView(current);
prev = current;
}
current = frames.get(id);
addView(current);
if (content.stage != null) content.stage.focus = current.content;
var onShowMethod:Dynamic = Reflect.field(current, "onShow");
if (onShowMethod != null) Reflect.callMethod(current, onShowMethod, []);
if (animate != null) animate.cancel();
animate = buildAnimate(current);
if (animate != null && prev != null) {
animate.start(function(_) {
removePrev(prev);
});
} else {
removePrev(prev);
}
return current;
}
private function removePrev(prev:Null<IView<Dynamic>>):Void {
if (prev != null) {
var onHideMethod:Dynamic = Reflect.field(prev, "onHide");
if (onHideMethod != null) Reflect.callMethod(prev, onHideMethod, []);
removeView(prev);
}
}
override public function set_views(value:Array<IView<Dynamic>>):Array<IView<Dynamic>> {
views = [];
if (value.length > 0) {

View File

@@ -9,11 +9,13 @@ class SpriteView extends View<Sprite> {
super(new Sprite());
}
/*override public function update():Void {
#if dev_layout
override public function update():Void {
super.update();
var g:Graphics = content.graphics;
g.lineStyle(1, 0x00ff00);
g.drawRect(0, 0, width, height);
g.lineStyle();
}*/
}
#end
}

View File

@@ -37,8 +37,10 @@ class TextView extends SpriteView implements ITextView<Sprite, TextField> {
textField.height = 1;
textField.multiline = true;
textField.wordWrap = true;
//textField.borderColor = 0x00ff00;
//textField.border = true;
#if dev_layout
textField.borderColor = 0xff0000;
textField.border = true;
#end
textFormat = textField.defaultTextFormat;
textFormat.font = "Arial";
textFormat.size = 16;