博客公告(点击显示/隐藏)|  今日心情:神学
2010-07-30 21:09:43
小S吧今天你来了吗?更新速度:每周2-3篇以上!
在俺博客看到有用的东西,学习了之后,记得回访带点人气哦 ^_^ 嘿嘿!
欢迎跟俺交换友情链接啊。。留言,直接QQ等联系我都行啊
转载本博客文章请注明:来源小S吧——sunbright博客,链接地址:http://www.xiaos8.com
今天在写for循环的时候,突然想到为什么一定要用变量"i"来迭代呢?如果用a,b,c等变量命名也不会冲突啊。
相信大部分人都是因为,前辈都用"i",因此我们这些后学的晚生也就用它了。
抱着刨根究底的恶心思想,纠结了几分钟后,突然想起来有个单词叫index,是索引的意思。
然后问了一下周边的C++程序员们,本来还是各抒己见,有个人说应该是index的缩写吧。
于是所有人都一致认为就是这个意思了。

这个问题可能讨论起来没什么意义,不过还是可以无聊的考虑一下,那么你觉得会是什么原因呢?另外第一个用变量"i"的程序员,他当时是不是就是这样想的呢?

下面的代码中有非常详细的注释,以及用途,因此这儿不再讲解该类,下面直接看例子。
(通过我博客侧边栏FireAS框架的svn地址,也可以获取该类最新代码。)

1、没经过任何缩放的原图:
uploads/200815/1.png
图片地址:uploads/200815/1.png

2、拉出一个缩放区域在图片的中央,其高亮之处就表示九宫格缩放区域的中心矩形框的大小。
uploads/200815/2.png
图片地址:uploads/200815/2.png

3、这时候生成的图片和原图就不一样了。
uploads/200815/3.png
图片地址:uploads/200815/3.png

4、拉出一个细长的缩放区域,其高亮之处表示中心区域。
uploads/200815/4.png
图片地址:uploads/200815/4.png

5、这时候生成的图片就成了圆角矩形。
uploads/200815/5.png
图片地址:uploads/200815/5.png

更多测试大家可以拿到源代码后在进行吧。上面例子只是一个抛砖引玉。

package fireas.library.display
{
  import flash.display.Bitmap;
  import flash.display.BitmapData;
  import flash.display.IBitmapDrawable;
  import flash.geom.Matrix;
  import flash.geom.Rectangle;
  
  /**
   * 利用九宫格缩放算法对BitmapData或DisplayObject进行缩放.
   *
   * <p>IBitmapDrawable是flash.display中的一个接口,实现它的具体类有BitmapData和DisplayObject.</p>
   *
   * <p>九宫格缩放指的是将目标对象分割到9个矩形区域的网格中,
   * 在缩放时对中间的网格进行宽高变更操作,对上下两块矩形进行宽度变更操作,
   * 对左右两块矩形进行高度变更操作,对四角的四块矩形不进行任何缩放,
   * 只是将它移至四个角落,从而形成不破坏图片原型的缩放算法.</p>
   *
   * @author sunbright
   */
  public class Zoom9Grid
  {
    private var _width:int;
    private var _height:int;
    private var _scaleX:Number = 1;
    private var _scaleY:Number = 1;
    private var _grid:Rectangle;
    private var data:*;
    
    private var needUpdate:Boolean = true;
    private var image:BitmapData;
    /**
     * 创建九宫格缩放实例.
     *
     * @param source 实现过IBitmapDrawable的对象,其中包括BitmapData和DisplayObject.
     * @param rect 缩放的九个格子中,最中间格子的矩形框.
     */
    public function Zoom9Grid(source:IBitmapDrawable,rect:Rectangle = null)
    {
      data = source;
      _grid = rect;
      _width = data.width;
      _height = data.height;
    }
    /**
     * 更新图像,该方法一般情况下是自动调用.
     */
    public function update():void{
      needUpdate = false;
      
      var width:int = _width * _scaleX;
      var height:int = _height * _scaleY;
      image = new BitmapData(width, height, true, 0);
      if(data.width == width && data.height == height) image.draw(data);
      else{
        var rows:Array = [0, _grid.top , _grid.bottom, data.height];
        var cols:Array = [0, _grid.left, _grid.right , data.width ];
        
        var toRows:Array = [0, _grid.top , height - data.height + _grid.bottom, height];
        var toCols:Array = [0, _grid.left, width - data.width + _grid.right , width ];
        
        var clipRect:Rectangle, matrix:Matrix, r:int, c:int, a:Number, d:Number;
        var r1:int, r2:int, c1:int, c2:int, tr1:int, tr2:int, tc1:int, tc2:int;
        
        for(c = 0; c < 3; c ++){
          for(r = 0; r < 3; r ++){
            r1 = rows [r]; r2 = rows [r + 1];
            c1 = cols [c]; c2 = cols [c + 1];
            tr1 = toRows[r]; tr2 = toRows[r + 1];
            tc1 = toCols[c]; tc2 = toCols[c + 1];
            clipRect = new Rectangle(tc1,tr1,tc2 - tc1,tr2 - tr1);
            a = c == 1 ? clipRect.width / (c2 - c1) : 1;
            d = r == 1 ? clipRect.height / (r2 - r1) : 1;
            matrix = new Matrix(a, 0, 0, d, tc1 - c1 * a, tr1 - r1 * d);
            
            image.draw(data, matrix, null, null, clipRect, true);
          }
        }
      }
    }
    /**
     * 获取最新的图像,如果需要更新,会自动启动更新图像.
     *
     * @return 返回进行过九宫格缩放操作过的图像.
     */
    public function get bitmap():Bitmap{
      if(needUpdate) update();
      return new Bitmap(image);
    }
    /**
     * 获取最新的图像数据,如果需要更新,会自动启动更新图像数据.
     *
     * @return 返回进行过九宫格缩放操作过的图像数据.
     */
    public function get bitmapData():BitmapData{
      if(needUpdate) update();
      return image;
    }
    /**
     * 设置最中心的区域的有效缩放矩形框.
     *
     * @param value 有效缩放矩形框.
     */
    public function set grid(value:Rectangle):void{
      needUpdate = true;
      if(!value) value = new Rectangle;
      _grid = value;
    }
    /**
     * 获取当前有效缩放矩形框.
     *
     * @return 返回当前有效缩放矩形框.
     */
    public function get grid():Rectangle{
      return _grid;
    }
    /**
     * 设置宽度.
     *
     * @param value 宽度.
     */
    public function set width(value:int):void{
      if(value == _width) return;
      needUpdate = true;
      _width = value;
    }
    /**
     * 获取宽度.
     *
     * @return 返回宽度.
     */
    public function get width():int{
      return _width;
    }
    /**
     * 设置高度.
     *
     * @param value 高度.
     */
    public function set height(value:int):void{
      if(value == _height) return;
      needUpdate = true;
      _height = value;
    }
    /**
     * 获取高度.
     *
     * @return 返回高度.
     */
    public function get height():int{
      return _height;
    }
    /**
     * 设置相对于对象的横向缩放比例.
     *
     * @param value (0-1)的缩放比例.
     */
    public function set scaleX(value:Number):void{
      if(value == _scaleX) return;
      needUpdate = true;
      _scaleX = value;
    }
    /**
     * 获取相对于对象的横向缩放比例.
     *
     * @return 返回缩放比例.
     */
    public function get scaleX():Number{
      return _scaleX;
    }
    /**
     * 设置相对于对象的纵向缩放比例.
     *
     * @param value (0-1)的缩放比例.
     */
    public function set scaleY(value:Number):void{
      if(value == _scaleY) return;
      needUpdate = true;
      _scaleY = value;
    }
    /**
     * 获取相对于对象的纵向缩放比例.
     *
     * @return 返回缩放比例.
     */
    public function get scaleY():Number{
      return _scaleY;
    }
  }
}
一位正在初学C++的同事,突然问我一个问题,说用打印函数,只用for循环,怎么输出一个菱形?
想起来这是以前学编程时,非常基础的一个问题
本来以为很简单,于是随便想了一下,发现还真没想象那么简单额
于是乎,努力仔细的想想,于是下面的答案就出来了
当然是Flash写的:
我这个用了3个for循环,不知道有没有用的for循环更少的方法?
(注意哦,只能用for循环和基本的运算)
var k:int, result:String = "", sum:int = 7;
var s:int = Math.abs(- sum / 2);
for(var i:int = 0; i < sum; i ++){
  var n:int = Math.abs(s - i);
  var t:int = sum - n * 2;
  for(k = 0; k < n; k ++){
    result += " ";
  }
  for(k = 0; k < t; k ++){
    result += "*";
  }
  result += "\n";
}
trace(result);

输出结果:
  *
 ***
 *****
*******
 *****
 ***
  *

很少写Flex相关的东西,今天遇到了这个问题,想了很多办法,也查了百度,都没有得到比较正确的办法。
下面是解决的办法,但不知道有没有更简单的办法就是了,俺只是业余摆弄一下Flex做一些AIR小工具。

首先是一段DataGrid相关实例代码:

<mx:DataGrid id="dataComp" dataProvider="{resultList}" width="100%" height="100%" sortableColumns="false" selectable="false"
  resizableColumns="false" draggableColumns="false" resize="dataCompResizeHandle()">
  <mx:columns>
    <mx:DataGridColumn dataField="line" headerText="行数" textAlign="center" width="40"/>
    <mx:DataGridColumn dataField="text" headerText="匹配文本" paddingLeft="5" paddingRight="5"
      itemRenderer="mx.controls.Label"/>
    <mx:DataGridColumn dataField="path1" headerText="路径" paddingLeft="5" paddingRight="5"
      itemRenderer="mx.controls.Label"/>
    <mx:DataGridColumn dataField="times" headerText="次数" textAlign="center" width="40"/>
  </mx:columns>
</mx:DataGrid>

侦听resize事件,当得到resize之后做这样的操作:

//数据对象重设尺寸处理
private var widthList:Array = [40,0.7,0.3,40];
private function dataCompResizeHandle():void{
  dataComp.validateNow();
  var value:Number,display:DataGridColumn,i:int;
  var list:Array = dataComp.columns;
  var length:int = list.length;
  var dataWidth:int = 0;
  for(i = 0; i < length; i ++){
    display = list[i];
    dataWidth += display.width;
  }
  for(i = 0; i < length; i ++){
    display = list[i];
    value = widthList[i];
    if(value > 1){
      dataWidth -= value;
      display.width = int(value);
    }
  }
  for(i = 0; i < length; i ++){
    display = list[i];
    value = widthList[i];
    if(value <= 1) display.width = int(dataWidth * value);
  }
}

要点注释:
1、得到resize之后一定要dataComp.validateNow();,这样取出来的总列宽才是正确的!
2、第一个for循环在计算总列宽,直接取dataComp的宽度是不对的,它会包含滚动条的宽度,我也不知道有没有什么办法可以直接取到总列宽,因此我采用了for循环去累加列宽;
3、第二个for循环在设置widthList中是在设置需要固定列宽的子项,然后从总列宽中减去;
4、第三个for循环在设置widthList中是按百分比设置子项列宽。

前言
标题纠结了很久,刚开始叫“我用反射函数describeType在干吗?”,看到第一位仁兄的回帖,继续纠结,继续推敲,最后就出现了现在的标题。。
如果不知道describeType是什么东西,那么先去看这篇基础教程吧:
http://www.xiaos8.com/article.asp?id=251

下面展出的图片是我在公司开发的内部debug工具的截图,因为我们公司的Flash是跑在C++上,很多接口都是依赖C++实现的,那么很多逻辑都是从C++启动,可能没办法直接打开调试,那么我们得有办法调试,所以下面这个工具就孕育而生了,当然跟市面上的Alcon差不多,不过我们的功能更多,且可以针对网络环境调试,和更多适应我们公司的调试功能。

下面4个截图都是我对一个游戏中AI对象进行数据检查:

1、对象可读属性检查,当然他是用反射函数实现的,检查到反射出来的XML中accessor是可读时,即显示出来
uploads/201005/20100531_1.gif

2、对象的结构检查,当你去调试别人写的类时,特别是结构较为复杂的话,那么用反射函数来帮忙,将所有结构打印出来,他的继承关系,他实现的接口等,将一目了然!
uploads/201005/20100531_2.gif

3、对象的属性检查,还是一样你去调试别人的类,那么用反射函数来帮忙,一眼就可以看到如此多的属性,而且是否是只读属性,还是只写属性,或者是可读可写属性,就连属性返回对象的类型也一目了然!
uploads/201005/20100531_3.gif

4、对象的方法检查,同理调试别人的类,依然用反射函数来帮忙,转瞬间就能知道他所有的方法调用,而且还能知道这个方法是出自哪个类实现的,也能知道该方法会返回什么类型!
uploads/201005/20100531_4.gif