FLEX图像工具类-图像变形


我是重晚上搜的。蛮好用的。自己也可以扩展一下哦。

package samples
{
 import flash.display.Bitmap;
 import flash.display.BitmapData;
 import flash.display.DisplayObject;
 import flash.display.DisplayObjectContainer;
 import flash.geom.Matrix;
 import flash.geom.Point;
 import flash.geom.Rectangle;

 /**
  * 一些用于图形的公用静态方法
  * @author flashyiyi
  *
  */
 public final class DisplayUtil
 {
  /**
   * 检测对象是否在屏幕中。主要用于优化。
   *
   * @param displayObj    显示对象
   *
   */
//  public static function inScreen(displayObj:DisplayObject):Boolean
//  {
//   if (displayObj.stage == null)
//    return false;
//
////   var screen:Rectangle=Geom.getRect(displayObj.stage);
////   return screen.containsRect(displayObj.getBounds(displayObj.stage));
//  }


  /**
   * 移除所有子对象
   * @param container     目标
   *
   */
  public static function removeAllChildren(container:DisplayObjectContainer):void
  {
   while (container.numChildren)
    container.removeChildAt(0);
  }

  /**
   * 将显示对象移至顶端
   * @param displayObj    目标
   *
   */
  public static function moveToHigh(displayObj:DisplayObject):void
  {
   if (displayObj.parent)
   {
    var parent:DisplayObjectContainer=displayObj.parent;
    if (parent.getChildIndex(displayObj) < parent.numChildren - 1)
     parent.setChildIndex(displayObj, parent.numChildren - 1);
   }
  }

  /**
   * 同时设置mouseEnabled以及mouseChildren。
   *
   */
  public static function setMouseEnabled(displayObj:DisplayObjectContainer, v:Boolean):void
  {
   displayObj.mouseChildren=displayObj.mouseEnabled=v;
  }

  /**
   * 获取舞台Rotation
   *
   * @param displayObj    显示对象
   * @return
   *
   */
  public static function getStageRotation(displayObj:DisplayObject):Number
  {
   var currentTarget:DisplayObject=displayObj;
   var r:Number=1.0;

   while (currentTarget && currentTarget.parent != currentTarget)
   {
    r+=currentTarget.rotation;
    currentTarget=currentTarget.parent;
   }
   return r;
  }

  /**
   * 获取舞台缩放比
   *
   * @param displayObj
   * @return
   *
   */
  public static function getStageScale(displayObj:DisplayObject):Point
  {
   var currentTarget:DisplayObject=displayObj;
   var scale:Point=new Point(1.0, 1.0);

   while (currentTarget && currentTarget.parent != currentTarget)
   {
    scale.x*=currentTarget.scaleX;
    scale.y*=currentTarget.scaleY;
    currentTarget=currentTarget.parent;
   }
   return scale;
  }

  /**
   * 获取舞台Visible
   *
   * @param displayObj    显示对象
   * @return
   *
   */
  public static function getStageVisible(displayObj:DisplayObject):Boolean
  {
   var currentTarget:DisplayObject=displayObj;
   while (currentTarget && currentTarget.parent != currentTarget)
   {
    if (currentTarget.visible == false)
     return false;
    currentTarget=currentTarget.parent;
   }
   return true;
  }

  /**
   * 将矢量图缓存为位图
   *
   * @param content       容器
   * @param rect  限定转换范围,这个范围是以content的坐标系为基准的。
   *
   * 强制位图缓存一般都是用于缩放,因为FLASH复杂矢量图的缩放极其消耗资源,尤其是幅面较大的时候。
   * 设置此参数可以将缩放范围限定为某一区域,诸如屏幕内,可以大大增强性能。
   * 在缩小图像的时候,需要缓存屏幕之外的图形,可以用Geom.scaleRectByCenter方法将content参数扩大面积
   *
   * @param precision     这个参数是缩放的时候使用的。当放大图形的时候,位图会变得模糊,将这个值设置为最大缩放比,将会以缩放到最大
   * 时的图形精度来缓存位图,这样即使放大位图仍然可以保持图像清晰。
   *
   * @return      返回生成的位图。因此,这个方法也可以顺带作为截屏方法使用。
   */
  public function swapContentForBitmap(content:DisplayObjectContainer, rect:Rectangle=null, precision:Number=1.0):Bitmap
  {
   if (rect == null)
    rect=content.getBounds(content);

   var tmp:Rectangle=rect.clone();
   tmp.inflate((precision - 1) * rect.width, (precision - 1) * rect.height);

   var data:BitmapData=new BitmapData(rect.width * precision, rect.height * precision);
   data.draw(content, new Matrix(precision, 0, 0, precision, -rect.x * precision, -rect.y * precision), null, null, null, true);

   var bitmap:Bitmap=new Bitmap(data);
   bitmap.name="contentBitmap";
   bitmap.x=tmp.x;
   bitmap.y=tmp.y;
   bitmap.scaleX=bitmap.scaleY=1 / precision;

   for (var i:int=0; i < content.numChildren; i++)
    content.getChildAt(i).visible=false;

   content.addChild(bitmap);
   return bitmap;
  }

  /**
   * 取消位图缓存
   *
   * @param content       容器
   *
   */
  public function swapBackToContent(content:DisplayObjectContainer):void
  {
   for (var i:int=0; i < content.numChildren; i++)
   {
    var child:DisplayObject=content.getChildAt(i);
    if (child.name != "contentBitmap" && child is Bitmap)
    {
     content.removeChild(child);
     (child as Bitmap).bitmapData.dispose();
    }
    else
     child.visible=true;
   }
  }

  /**
   * 自定义注册点缩放
   *
   * @param displayObj    显示对象
   * @param scaleX        缩放比X
   * @param scaleY        缩放比Y
   * @param point 新的注册点(相对于原注册点的坐标)
   *
   */
  public static function scaleAt(displayObj:DisplayObject, scaleX:Number, scaleY:Number, point:Point=null):void
  {
   if (!point)
    point=new Point();

   var m:Matrix=new Matrix();
   m.translate(-point.x, -point.y);
   m.scale(scaleX, scaleY);
   m.translate(point.x, point.y);
   displayObj.transform.matrix=m;
  }

  /**
   * 自定义注册点旋转
   *
   * @param displayObj    显示对象
   * @param angle 旋转角度(0 - 360)
   * @param point 新的注册点(相对于原注册点的坐标)
   *
   */
  public static function rotateAt(displayObj:DisplayObject, angle:Number, point:Point=null):void
  {
   if (!point)
    point=new Point();

   var m:Matrix=new Matrix();
   m.translate(-point.x, -point.y);
   m.rotate(angle / 180 * Math.PI);
   m.translate(point.x, point.y);
   displayObj.transform.matrix=m;
  }

  /**
   * 水平翻转
   */
  public static function flipH(displayObj:DisplayObject,txNum:Number =0):void
  {
   var m:Matrix=displayObj.transform.matrix.clone();
   m.a=-1;
   m.tx = txNum;
   displayObj.transform.matrix=m;
  }

  /**
   * 垂直翻转
   */
  public static function flipV(displayObj:DisplayObject):void
  {
   var m:Matrix=displayObj.transform.matrix.clone();
   m.d=-1;
   displayObj.transform.matrix=m;
  }
 }
}

我举一个使用水平翻转的例子:

<mx:Script>

...

private function init():void {

   

    DisplayUtil.flipH(img2,80);

}

...

</mx:Script>

<mx:Image source="@Embed('assets/next.swf')" width="80" height="40" id="img2"/>

基本能看懂吧。

posted on 2010-05-13 15:47  念时  阅读(688)  评论(0编辑  收藏  举报

细节决定成败!态度决定一切!