zoukankan      html  css  js  c++  java
  • 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"/>

    基本能看懂吧。

  • 相关阅读:
    UVa 1595
    求树直径及所有直径顶点

    python-sort()/sorted()比较
    MNIST数据集分类简单版本
    Tensorlflow-解决非线性回归问题
    Tensorlflow-神经网络解决非线性回归问题
    tensorflow基础-placeholder
    Tensorflow基础-mnist数据集
    Week 3: Structured Types 5. Tuples and Lists Exercise: odd tuples
  • 原文地址:https://www.cnblogs.com/nianshi/p/1734643.html
Copyright © 2011-2022 走看看