About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Mar

    7

    主要是用来移动开发时,iOS 与安卓都有大量不同的尺寸图标需要生成,而这个脚本就是用来将一张宽与高相等的大图,批量生成 ICON 不同尺寸的图标。

    将以下脚本保存到一个单独的纯文本文件中,后缀名改为 *.jsx,然后在 PS CS6或 PS CC 2014 新版中通过“文件”菜单—“脚本”—“浏览”运行。如果有参数要改,请直接看注释,反正已经写的很清楚了:

    #target photoshop
    app.bringToFront();

    //尺寸集合
    var sizeList = [1024,512,192,180,152,144,128,120,114,100,96,87,80,76,75,72,66,60,58,57,50,48,44,40,36,32,29,16];

    //任意一个宽与高相等的图像,尺寸大于1024x1024像素。
    var fileRef = File.openDialog ("请选择一个文件""*.png", false);

    //也可以在这里直接定义一个输出文件夹,Folder.selectDialog("然后选择一个输出文件夹");
    //我这里直接使用被选择图片的相同目录
    var outputFolder = fileRef.parent;

    //打开文件
    var activeDocument = app.open(fileRef);

    //运行批处理尺寸
    runNow() ;

    function runNow() 
    {
         if(activeDocument.height != activeDocument.width)
         {
             alert("当前文件宽高尺寸不一致,脚本已中止。");
             return;
         }

         if(activeDocument.height < 1024)
         {  
             alert("选择的原始图像尺寸必须大于等于1024x1024像素。");
             return;
          }


         for(var i = 0; i < sizeList.length; i ++)
         {
             //重置图像尺寸
             activeDocument.resizeImage(UnitValue(sizeList[i],"px"),UnitValue(sizeList[i],"px"),null,ResampleMethod.BICUBIC);

             //图像无论是放大还是缩小,都会变模糊,只是放大时模糊的快一些,缩小时模糊的慢一些
             //所以这里复制一个图像进行锐化,可以让缩小后的图像清晰一点。
             var duplicateLayer = activeDocument.activeLayer.duplicate();

             activeDocument.activeLayer = duplicateLayer;

             duplicateLayer.applySharpen();//应用锐化
             duplicateLayer.opacity = 40;

             activeDocument.flatten();//合并图层

             //保存的文件
             var saveFile = new File(outputFolder + "/" + sizeList[i] +".png")

             //如果文件已经存在就先删除它
              if (saveFile.exists)
              {
                    saveFile.remove();
              }

             //以PNG格式保存,带压缩
             var pngSaveOptions = new ExportOptionsSaveForWeb();
             pngSaveOptions.format = SaveDocumentType.PNG;
             pngSaveOptions.transparency = true;
             pngSaveOptions.includeProfile = false ;
             pngSaveOptions.interlaced = false ;
             pngSaveOptions.PNG8= false ;

             activeDocument.exportDocument(saveFile, ExportType.SAVEFORWEB, pngSaveOptions);

             activeDocument.activeHistoryState = activeDocument.historyStates[0];//还原到打开状态
         }     
         activeDocument.close(SaveOptions.DONOTSAVECHANGES);//原始被打开的文件不保存,关闭源文件
    }

    备注:之所以用脚本的方式是因为修改起来比较方便,它不需要某个开发环境,修改完了之后再需要重新编译、安装再使用等烦人操作。

    Nov

    14

    在使用 Robotlegs2  (简称RL2)作为 MVC 设计框架时,Adobe AIR 如果采用了多个窗口,那么如果生成子窗口(独立窗口),它所对应的 mediator 并不会自动创建。这是因为 Context 是以当前舞台作为上下文背景,而独立的子窗口在生成时,它拥有自己的舞台实例,并不与主窗口共享同一个舞台实例。这在 RL1 中比较难以解决的问题,在 RL2 中比较很容易解决。

    默认情况下,在 AppConfig.as 中配置好了映射,并不会进行多窗口通信,还需要打开子窗口时进行类似如下的操作:

    先在打开的操作处添加视图管理的注入:

    [Inject] 
    public var viewManager:IViewManager;

    然后在视图管理对象中先加到这个子窗口对象(打开之后可以直接移除它):

    var someWin:SomeWindowView = new SomeWindowView ();
    viewManager.addContainer(someWin);
    someWin.open();
    viewManager.removeContainer(someWin);

    如果在打开后没有在视图管理对象中移除,那么也可以在子窗口对应的 mediator 对象中注入 viewManager 与 view 对象,然后在 destroy() 方法中移除它。 

    override public function destroy():void
    {
        super.destroy();
        trace(this,"destroy()");

        viewManager.removeContainer(view);
    }