当我们在制作一些需要随着内容而动态变化大小的东西的时候,总免不了 会让背景图片进行相应的拉伸,而直接进行拉伸 的话,结果总是不会让人很满意。

于是乎,九宫格的出现改变了这个结果。九宫格,即将图片划分为九个区域,四个角的部分不进行缩放,对中间区域长宽进行缩放,左右区域作纵向缩放,上下区域作横向缩放。这样的话就不会影响最终的视觉效果。然而要使用九宫格的话 对于图片的本身制作 也有一定要求,因为九宫格的原理是将中间区域进行缩放   所以中间区域必须为纯色,这样的话才不会影响最终的视觉效果(其实是有变化的,只是人肉眼很难区分出来)

而flash自带有九宫格,但是 需要手动将图片切割成九份。所以在此基础上分享一个原创九宫格工具类

AS3.0

package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.IBitmapDrawable;
import flash.display.Sprite;
import flash.geom.Point;
import flash.geom.Rectangle;

/**
* 实现对显示对象赋予九宫格
* <br/>构造函数参数
* <br/>content:DisplayObject
* <br/>rect:Rectangle 其形式参照 scale9Grid 的Rectangle
* <br/>setSize()设置高宽
* @
*
* @author 朽木可雕
*
*/
public class Scale9GridView extends Sprite
{
private var mRect:Rectangle = null;
private var mContentBmd:BitmapData = null;
private var mBmList:Vector.<Bitmap>;
private var mShapeWid:Number = 0;//需要进行拉伸的 原图像的 宽
private var mShapeHei:Number = 0;//需要进行拉伸的原图像的高

//以下四个变量 用于 设置 此九宫图形的 实际显示宽高
//L代表 左侧部分区域的宽 R代表右侧部分区域宽
//T代表上部分的高 B代表下部分的高
private var mInitWidL:Number;
private var mInitWidR:Number;
private var mInitHeiT:Number;
private var mInitHeiB:Number;

public function Scale9GridView( content:IBitmapDrawable,rect:Rectangle )
{
this.mRect = rect;

mInitWidL = this.mRect.x;
mInitHeiT = this.mRect.y;

if( content is DisplayObject )
{
var displayContent:DisplayObject = content as DisplayObject;
mShapeWid = displayContent.width;
mShapeHei = displayContent.height;

mContentBmd = new BitmapData( mShapeWid,mShapeHei,true,0x00 );
mContentBmd.draw( displayContent );
}else if( content is BitmapData )
{
mContentBmd = content as BitmapData;
mShapeWid = mContentBmd.width;
mShapeHei = mContentBmd.height;
}
parseScale9Grid( );
}
private function parseScale9Grid( ):void
{
mBmList = new Vector.<Bitmap>( );
var tempRect:Rectangle = new Rectangle( );
var tempPoint:Point = new Point( );
for( var i:int = 1;i <= 9;i ++ )
{
var bm:Bitmap = new Bitmap( );
setRect( i ,tempRect );
var bmd:BitmapData = new BitmapData( tempRect.width,tempRect.height,true,0x00 );
bmd.lock();
bmd.copyPixels( mContentBmd,tempRect,tempPoint );
bmd.unlock();
bm.bitmapData = bmd;
this.addChild( bm );
bm.x = tempRect.x;
bm.y = tempRect.y;
mBmList.push( bm );
}
mContentBmd.dispose( );
mContentBmd = null;
}
private function setRect( id:int,tempRect:Rectangle ):void
{
tempRect.x = tempRect.y = 0;
switch( id )
{
case 1:
tempRect.width = mRect.x;
tempRect.height = mRect.y;
break;
case 2:
tempRect.x = mRect.x;
tempRect.width = mRect.width;
tempRect.height = mRect.y;
break;
case 3:
tempRect.x = mRect.x + mRect.width;
tempRect.width = mShapeWid – tempRect.x;
mInitWidR = tempRect.width;
//tempRect.width = mRect.x;
tempRect.height = mRect.y;
break;
case 4:
tempRect.y = mRect.y;
tempRect.width = mRect.x;
tempRect.height = mRect.height;
break;
case 5:
tempRect.x = mRect.x;
tempRect.y = mRect.y;
tempRect.width = mRect.width;
tempRect.height = mRect.height;
break;
case 6:
tempRect.x = mRect.x + mRect.width;
tempRect.y = mRect.y;
tempRect.width = mShapeWid – tempRect.x;
//tempRect.width = mRect.x;
tempRect.height = mRect.height;
break;
case 7:
tempRect.y = mRect.y + mRect.height;
tempRect.width = mRect.x;
tempRect.height = mShapeHei – tempRect.y;
mInitHeiB = tempRect.height;
//tempRect.height = mRect.y;
break;
case 8:
tempRect.x = mRect.x;
tempRect.y = mRect.y + mRect.height;
tempRect.width = mRect.width;
tempRect.height = mShapeHei – tempRect.y;
// tempRect.height = mRect.y;
break;
case 9:
tempRect.x = mRect.x + mRect.width;
tempRect.y = mRect.y + mRect.height;
tempRect.width = mShapeWid – tempRect.x;
tempRect.height = mShapeHei – tempRect.y;
// tempRect.width = mRect.x;
// tempRect.height = mRect.y;
break;
}
}
private function refresh( ):void
{
var rect:Rectangle = new Rectangle( );
for( var i:uint = 0;i < 9;i ++ )
{
var tempBm:Bitmap = mBmList[ i ];
var id:int = i + 1;
setRect( id,rect );
tempBm.width = rect.width;
tempBm.height = rect.height;
tempBm.x = rect.x;
tempBm.y = rect.y;
}
}
/**
*设置宽 高
* @param wid
* @param hei
*
*/
public function setSize( wid:Number,hei:Number ):void
{
width = wid;
height = hei;
}
override public function set width( num:Number ):void
{
var wid:Number = Math.abs( num – mInitWidL – mInitWidR );
mRect.width = wid;
refresh( );
}
override public function get width( ):Number
{
return mRect.width;
}

override public function set height( num:Number ):void
{
var hei:Number = Math.abs( num – mInitHeiT – mInitHeiB );
mRect.height = hei;
refresh( );
}
override public function get height( ):Number
{
return mRect.height;
}
}
}

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Free Web Hosting