http://code.google.com/p/as3ui/ 一个类 setSize方法,指定图片宽高
/** * * ScaleBitmap * * @version 1.1 * @author Didier BRUN - http://www.bytearray.org * * @version 1.2.1 * @author Alexandre LEGOUT - http://blog.lalex.com * * @version 1.2.2 * @author Pleh * * Project page : http://www.bytearray.org/?p=118 * */ package org.bytearray.display { import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Matrix; import flash.geom.Rectangle; public class ScaleBitmap extends Bitmap { // ------------------------------------------------ // // ---o properties // // ------------------------------------------------ protected var _originalBitmap : BitmapData; protected var _scale9Grid : Rectangle = null; // ------------------------------------------------ // // ---o constructor // // ------------------------------------------------ function ScaleBitmap(bmpData : BitmapData = null, pixelSnapping : String = "auto", smoothing : Boolean = false) { // super constructor super(bmpData, pixelSnapping, smoothing); // original bitmap _originalBitmap = bmpData.clone(); } // ------------------------------------------------ // // ---o public methods // // ------------------------------------------------ /** * setter bitmapData */ override public function set bitmapData(bmpData : BitmapData) : void { _originalBitmap = bmpData.clone(); if (_scale9Grid != null) { if (!validGrid(_scale9Grid)) { _scale9Grid = null; } setSize(bmpData.width, bmpData.height); } else { assignBitmapData(_originalBitmap.clone()); } } /** * setter width */ override public function set width(w : Number) : void { if (w != width) { setSize(w, height); } } /** * setter height */ override public function set height(h : Number) : void { if (h != height) { setSize(width, h); } } /** * set scale9Grid */ override public function set scale9Grid(r : Rectangle) : void { // Check if the given grid is different from the current one if ((_scale9Grid == null && r != null) || (_scale9Grid != null && !_scale9Grid.equals(r))) { if (r == null) { // If deleting scalee9Grid, restore the original bitmap // then resize it (streched) to the previously set dimensions var currentWidth : Number = width; var currentHeight : Number = height; _scale9Grid = null; assignBitmapData(_originalBitmap.clone()); setSize(currentWidth, currentHeight); } else { if (!validGrid(r)) { throw (new Error("#001 - The _scale9Grid does not match the original BitmapData")); return; } _scale9Grid = r.clone(); resizeBitmap(width, height); scaleX = 1; scaleY = 1; } } } /** * assignBitmapData * Update the effective bitmapData */ private function assignBitmapData(bmp : BitmapData) : void { super.bitmapData.dispose(); super.bitmapData = bmp; } private function validGrid(r : Rectangle) : Boolean { return r.right <= _originalBitmap.width && r.bottom <= _originalBitmap.height; } /** * get scale9Grid */ override public function get scale9Grid() : Rectangle { return _scale9Grid; } /** * setSize */ public function setSize(w : Number, h : Number) : void { if (_scale9Grid == null) { super.width = w; super.height = h; } else { w = Math.max(w, _originalBitmap.width - _scale9Grid.width); h = Math.max(h, _originalBitmap.height - _scale9Grid.height); resizeBitmap(w, h); } } /** * get original bitmap */ public function getOriginalBitmapData() : BitmapData { return _originalBitmap; } // ------------------------------------------------ // // ---o protected methods // // ------------------------------------------------ /** * resize bitmap */ protected function resizeBitmap(w : Number, h : Number) : void { var bmpData : BitmapData = new BitmapData(w, h, true, 0x00000000); var rows : Array = [0, _scale9Grid.top, _scale9Grid.bottom, _originalBitmap.height]; var cols : Array = [0, _scale9Grid.left, _scale9Grid.right, _originalBitmap.width]; var dRows : Array = [0, _scale9Grid.top, h - (_originalBitmap.height - _scale9Grid.bottom), h]; var dCols : Array = [0, _scale9Grid.left, w - (_originalBitmap.width - _scale9Grid.right), w]; var origin : Rectangle; var draw : Rectangle; var mat : Matrix = new Matrix(); for (var cx : int = 0;cx < 3; cx++) { for (var cy : int = 0 ;cy < 3; cy++) { origin = new Rectangle(cols[cx], rows[cy], cols[cx + 1] - cols[cx], rows[cy + 1] - rows[cy]); draw = new Rectangle(dCols[cx], dRows[cy], dCols[cx + 1] - dCols[cx], dRows[cy + 1] - dRows[cy]); mat.identity(); mat.a = draw.width / origin.width; mat.d = draw.height / origin.height; mat.tx = draw.x - origin.x * mat.a; mat.ty = draw.y - origin.y * mat.d; bmpData.draw(_originalBitmap, mat, null, null, draw, smoothing); } } assignBitmapData(bmpData); } } }
测试代码 package { import com.bit101.components.ProgressBar; import com.bit101.components.PushButton; import com.bit101.components.Style; import flash.display.Bitmap; import flash.display.MovieClip; import flash.display.SimpleButton; import flash.display.Sprite; import flash.events.Event; import org.bytearray.display.ScaleBitmap; /** * ... * @author yongkang */ public class Main extends Sprite { [Embed(source='/resources/123.jpg')] private var icon:Class; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); var bitmap:Bitmap = new icon as Bitmap; var sb:ScaleBitmap = new ScaleBitmap(bitmap.bitmapData); sb.bitmapData = bitmap.bitmapData; sb.setSize(800, 800); this.addChild(sb); } } }