使用 FLEX 製作動態更換的背景圖案 (方案二) tile background
繼昨天的文章,我們知道要在 FLEX 裡面使用重複的背景圖案是很麻煩的,而且還需要用到外部的元件檔,而我們的組羊最近的案子剛好就需要用到背景圖這個功能,更麻煩的是,有許多的背景圖要可以動態更換,而昨天提到的背景圖案卻是崁入 SWF 中的,所以如果想要動態的更新自己想要的背景圖,那可以就麻煩囉。
圖片 : 只要輸入 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
本篇文章參考來源 : http://alekkus.com/
還有很多重要的資料可以參考喔,不過都是英文的啦 = = 還是交給組羊吧….
Random Posts
Loading…
相關文章 :
![showExample11[1] showExample11[1]](http://files.corausir.org/images/FLEXtilebackground_A284/showExample111.jpg)









喔!YA~沙發~~
要馬就不po~不然就一次狂PO~
哪裡什麼研究狂人~還是靠山羊罩啦!!
您好,想請問您一個問題
我把程式碼都複製到flex後,卻出現”找不到Type,或它不是編譯時期常數:tileCanvas”的問題
我該如何解決呢??
@jim
因為我有弄到另外一個元件
因此你少做一個檔案喔~
hi, 發現有些地方可以寫得更精簡,我try過了,可以用 :D
tileCanvas.mxml的updateDisplayList裡面的bitmap與bitmapData都不用宣告變數,也不用draw,直接在第54行的graphics.beginBitmapFill( bitmapData );
寫成:graphics.beginBitmapFill( Bitmap( _image.content ).bitmapData );
就ok了!
@羊
我也是參考來的 ^^
所以就沒有更精簡了~
很謝謝你的資料~~XD
下次我也來修改一下
我><” 無法使用
我兩個檔案都放到Project裡了
可是還是出現 1046:找不到Type,或他不是編譯時期常數:tileCanvas