首頁 > FLEX, 程式設計 > 使用 FLEX 製作動態更換的背景圖案 (方案二) tile background

使用 FLEX 製作動態更換的背景圖案 (方案二) tile background

2009年8月5日  瀏覽次數 : 5,240

繼昨天的文章,我們知道要在 FLEX 裡面使用重複的背景圖案是很麻煩的,而且還需要用到外部的元件檔,而我們的組羊最近的案子剛好就需要用到背景圖這個功能,更麻煩的是,有許多的背景圖要可以動態更換,而昨天提到的背景圖案卻是崁入 SWF 中的,所以如果想要動態的更新自己想要的背景圖,那可以就麻煩囉。

image圖片 : 只要輸入 URL 的網址,就可以讀取到網頁的圖片來做背景囉 !

最近組羊手上的案子剛好需要用到可以讓使用者自行選擇背景圖案,可是昨天的 Degrafa 的寫法是寫 CSS 的,而且圖片是綁定的,因此如果要自行更換會比較麻煩,因此身為研究狂人的組羊,不知道去哪裡找來了好心的提供的攻略,稍稍修改一下就可以完成這個功能了。

這次我們自己寫了一個 Canvas 的元件,並且稍稍修改一下,並且增加一個設定底圖的方法,只需要傳入網路上的 URL 就可以將該張圖片填滿整個區塊喔。

tileCanvas.mxml

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
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
	<mx:Script>
		<![CDATA[  
		    import mx.controls.Image;  
 
		    private var _image : Image = null;  
 
		    public function setTileImage( image : Image ) : void  
		    {  
		        this._image = image;  
		        this.invalidateDisplayList();  
		    }
 
		    public function setBackground(source:String) : void  
		    {  
		        // 1. for crossdomain images, we need to create a LoaderContext object and set its checkPolicyFile to true.  
		        var loaderContext : LoaderContext = new LoaderContext ();  
		        loaderContext.checkPolicyFile = true;  
 
		        // 2. assign that loaderContext object to an Image object  
		        var image : Image =  new Image();  
		        image.loaderContext =  loaderContext;  
 
		        // 3. set source and load  
		        image.source = source;  
		        image.addEventListener( Event.COMPLETE, onImageLoaded  );  
		        image.load();
 
 
		    }  
 
		    private function onImageLoaded( event : Event ) : void  
		    {  
		        var image : Image = Image( event.currentTarget );  
 
		        // 1. set as tile image background  
		        this.setTileImage( image );  
		    }
 
 
		    override protected function updateDisplayList( unscaledWidth : Number, unscaledHeight : Number ) : void  
		    {  
		        super.updateDisplayList(unscaledWidth, unscaledHeight );  
 
		        if ( _image != null )  
		        {  
		            var bitmap : Bitmap = Bitmap( _image.content );  
		            var bitmapData : BitmapData = new BitmapData( bitmap.width, bitmap.height );  
		            bitmapData.draw( bitmap );        
 
		            graphics.clear();  
		            graphics.beginBitmapFill( bitmapData );  
		            graphics.drawRect(0, 0, unscaledWidth, unscaledHeight);  
		            graphics.endFill();  
		        } 
		    }
		]]>  
	</mx:Script> 
</mx:Canvas>

接下來這個檔案就是我們實際製作一個 DEMO 來使用看看。

tileCanvasDemo.mxml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" fontSize="14" xmlns:images="images.*">
 
	<mx:Script>
		<![CDATA[
			private function clickHandler():void{
				this.tc.setBackground(this.textInput.text);
			}
		]]>
	</mx:Script>
 
	<mx:Label text="可自行更換圖片 TileCanvas 的使用範例"/>
	<mx:HBox width="600" horizontalAlign="center">
		<mx:Label text="圖片 HTTP 路徑 : "/>
		<mx:TextInput id="textInput" width="322"/>
		<mx:Button label="送出" click="clickHandler()"/>
	</mx:HBox>
 
	<!-- 自訂定義的 tileCanvas -->
	<images:tileCanvas id="tc" width="600" height="300" borderStyle="solid" borderThickness="2" borderColor="#B26C28"/>
</mx:Application>

至於網頁背景圖只需要 GOOGLE 一下 ( 沒錯! 現在大家都把 GOOGLE 當動詞了 ) , 就可以找到很多,只需要把圖片的網址貼上欄位內,按下送出,就可以看到圖片填滿整塊區域了。不過因為 FLASH 有安全性考量因此測試請貼上這張圖片測試
http://files.corausir.org/images/FLEXtilebackground_A284/showExample111.jpg

showExample11[1]

本篇文章參考來源 : http://alekkus.com/

還有很多重要的資料可以參考喔,不過都是英文的啦 = = 還是交給組羊吧….

Random Posts

Loading…

:: 把這篇好文推到書籤網站與更多人分享吧 ::
  • funp
  • Hemidemi
  • YahooKimo
  • Google
  • udn
  • Haohao
  • Live

相關文章 :

Ausir FLEX, 程式設計 , , , ,

  1. 2009年8月5日12:58 | #1

    喔!YA~沙發~~
    要馬就不po~不然就一次狂PO~

  2. 組羊
    2009年8月5日16:43 | #2

    哪裡什麼研究狂人~還是靠山羊罩啦!!

  3. jim
    2009年8月23日20:24 | #3

    您好,想請問您一個問題

    我把程式碼都複製到flex後,卻出現”找不到Type,或它不是編譯時期常數:tileCanvas”的問題

    我該如何解決呢??

  4. 2009年8月23日23:07 | #4

    @jim

    因為我有弄到另外一個元件
    因此你少做一個檔案喔~

  5. 2009年9月6日22:47 | #5

    hi, 發現有些地方可以寫得更精簡,我try過了,可以用 :D
    tileCanvas.mxml的updateDisplayList裡面的bitmap與bitmapData都不用宣告變數,也不用draw,直接在第54行的graphics.beginBitmapFill( bitmapData );
    寫成:graphics.beginBitmapFill( Bitmap( _image.content ).bitmapData );
    就ok了!

  6. 2009年9月7日09:52 | #6

    @羊

    我也是參考來的 ^^
    所以就沒有更精簡了~
    很謝謝你的資料~~XD
    下次我也來修改一下

  7. 棒子
    2010年4月7日15:40 | #7

    我><” 無法使用

    我兩個檔案都放到Project裡了

    可是還是出現 1046:找不到Type,或他不是編譯時期常數:tileCanvas

  1. 本篇文章目前尚無任何 trackbacks 和 pingbacks。