图像异步读入

标准的图像读入在要求读入时,等待读入完成后进行处理,异步读入中,在后台进行图像读入的同时可以进行其他的处理。
因此,也可以制作成让人无法感觉到从磁盘缓慢的读取的效果。

用法

在 onLoaded 中接收的每个值(meta,async,error,message)如下所示。

导入的图像可以通过 Layer.copyFromBitmapToMainImage(Bitmap)从Bitmap复制到Layer。
虽然说是复制,但在被更改之前还是共享的,一瞬间就结束了。
由于读取处理是异步的,在读取完成时,传递该图像的Layer有可能已经被无效化。
用onLoaded访问其他对象时,最好确认是否被无效化。
或者,需要在onLoaded完成之前不使其无效化。

示例脚本

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*  
异步读取iimage0.png ~ image9.png 10次  
*/  
System.setArgument("-contfreq", 60);  
System.graphicCacheLimit = 0;  
// 启用缓存后无意义,将图像缓存关闭   

class Bitmap2Layer extends Bitmap {  
	var target;  
	var tag;  
	function Bitmap2Layer(layer,filename) {  
		super.Bitmap();  
		this.target = layer;
		this.tag = filename;
	}
	function onLoaded(meta,async,error,message) {
		Debug.message("Exit load async:"+async+", error:"+error+", message:"+message);
		if( !error && isvalid(target) ) { // 确认未无效化,因为它是异步的
			target.copyFromBitmapToMainImage(this);
			target.setSizeToImageSize();
		}
	}
};

class MainWindow extends Window {
	var base;
	var layer;
	var layermove;
	var addval;
	var bmps;

	function MainWindow( width, height ) {
		super.Window();
		setSize( width, height );
		setInnerSize( width, height );

		base = new Layer(this, null);
		base.setSize(width,height);
		base.setSizeToImageSize();
		base.name = "base";
		base.visible = true;
		add( base );

		layer = new Layer(this,base);
		layer.setSize(100,100);
		layer.setSizeToImageSize();
		layer.colorRect(0,0,100,100,0x00ff00,128);
		layer.visible = true;
		add( layer );

		layermove = new Layer(this,base);
		layermove.setSize(100,100);
		layermove.setPos(0,height-100);
		layermove.setSizeToImageSize();
		layermove.colorRect(0,0,100,100,0xff0000,128);
		layermove.drawText( 0, 40, "テスト文字列描画", 0xffffff );
		layermove.visible = true;
		add( layermove );

		bmps = new Array();
		for( var j = 0; j < 10; j++ ) {
		for( var i = 0; i < 10; i++ ) {
			var filename = "image"+i+".png";
			var bmp = new Bitmap2Layer(layer,filename);
			bmp.loadAsync(filename);
			bmps.add(bmp);
		}
		}
		add( bmps );

		addval = 1;
		System.addContinuousHandler(onMoveImage);
	}
	function finalize() {
		System.removeContinuousHandler(onMoveImage);
		super.finalize();
	}
	function onMoveImage() {
		layermove.left += addval;
		if( addval > 0 ) {
			if( layermove.left >= (this.width-layermove.width) ) {
				addval = -1;
			}
		} else {
			if( layermove.left <= 0 ) {
				addval = 1;
			}
		}
	}
};

var win = new MainWindow(640,480);
win.visible = true;

GitHub也有同样的示例



此文档的许可证