最近在使用Flex Air写桌面应用,因为有个测量的需求,就想着自己写个尺子来用。经过琢磨,写了个简陋版,希望大家指正。 先上图:

以下是代码:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx"showStatusBar="false" minWidth="80" minHeight="80"alpha="0.7" doubleClickEnabled="true"initialize="appInitializeHandler(event)"creationComplete="appCreationCompleteHandler(event)"applicationComplete="init(event)"mouseMove="appMouseMoveHandler(event)"><fx:Script><![CDATA[import mx.controls.Menu;import mx.events.FlexEvent;import mx.events.MenuEvent;import spark.layouts.HorizontalLayout;private var properties:Object = new Object();private var appMenu:Menu;private var mode:String;protected function init(event:FlexEvent):void {this.stage.addEventListener(KeyboardEvent.KEY_DOWN, appKeyDownHandler);this.stage.addEventListener(MouseEvent.RIGHT_CLICK, appRightClickHandler);this.stage.addEventListener(MouseEvent.DOUBLE_CLICK, appDoubleClickHandler);}override protected function createChildren():void {super.createChildren();var menuData:Array = [{label: "退出", id: "AppExt"}];appMenu = Menu.createMenu(this, menuData);appMenu.addEventListener(MenuEvent.ITEM_CLICK, menuItemClickHandler);}protected function menuItemClickHandler(event:MenuEvent):void {if(event.item["id"] == "AppExt") {nativeWindow.close();}}override protected function mouseDownHandler(event:MouseEvent):void {this.nativeWindow.startMove();}protected function appMouseMoveHandler(event:MouseEvent):void {if(!event.altKey) {return;}if(mode == "h") {lineGrp.y = 0;lineGrp.x = mouseX;showText((lineGrp.x + 1) + "");}else if(mode == "v") {lineGrp.x = 0;lineGrp.y = mouseY;showText((lineGrp.y + 1) + "");}}protected function appKeyDownHandler(event:KeyboardEvent):void {if(!(event.keyCode == Keyboard.LEFT && event.keyCode == Keyboard.RIGHT && event.keyCode == Keyboard.DOWN &&event.keyCode == Keyboard.UP)) {return;}if(event.keyCode == Keyboard.LEFT) {if(lineGrp.x == 0) {return;}lineGrp.x -= 1;}if(event.keyCode == Keyboard.RIGHT) {lineGrp.x += 1;}showText((lineGrp.x + 1) + "");}private function showText(text:String):void {display.text = text;}protected function appDoubleClickHandler(event:MouseEvent):void {mode = mode == "h" ? "v" : "h";appChanged();}override public function get minWidth():Number {return 80;}protected function appRightClickHandler(event:MouseEvent):void {appMenu.show(event.stageX, event.stageY);}protected function appInitializeHandler(event:FlexEvent):void {var init:File = File.applicationDirectory.resolvePath("Ruler.ini");var reader:FileStream = new FileStream();reader.open(init, FileMode.READ);var initValues:Array = reader.readUTFBytes(reader.bytesAvailable).split("\r\n");for each(var value:String in initValues) {var property:Array = value.split("=");properties[property[0]] = property[1];}reader.close();}protected function appCreationCompleteHandler(event:FlexEvent):void {mode = getProperty("initMode");appChanged();}private function appChanged():void {if(mode == "h") {lineGrp.x = 20;lineGrp.y = 0;lineGrp.width = 3;lineGrp.percentHeight = 100;line.width = 0;line.percentHeight = 100;ticks.percentWidth = 100;ticks.height = 20;leftResizer.enabled = rightResizer.enabled = true;upResizer.enabled = downResizer.enabled = false;labelGrp.layout = new VerticalLayout();this.width = Number(getProperty("initHWidth"));this.height = Number(getProperty("initHHeight"));}else if(mode == "v") {lineGrp.x = 0;lineGrp.y = 20;lineGrp.percentWidth = 100;lineGrp.height = 3;line.percentWidth = 100;line.height = 0;ticks.width = 20;ticks.percentHeight = 100;leftResizer.enabled = rightResizer.enabled = false;upResizer.enabled = downResizer.enabled = true;labelGrp.layout = new HorizontalLayout();this.width = Number(getProperty("initVWidth"));this.height = Number(getProperty("initVHeight"));}drawTicks();layoutResizer();}override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {if(mode == "v") {unscaledWidth = 80;}else if(mode == "h") {unscaledHeight = 80;}super.updateDisplayList(unscaledWidth, unscaledHeight);}private function getProperty(key:String):String {return properties[key];}private function setProperty(key:String, value:String):void {properties[key] = value;}protected function resizerClickHandler(event:MouseEvent):void {var resizer:String = event.currentTarget.id;if(resizer == "leftResizer") {this.width -= 100;}else if(resizer == "rightResizer") {this.width += 100;}else if(resizer == "upResizer") {this.height -= 40;}else if(resizer == "downResizer") {this.height += 40;}drawTicks();layoutResizer();}private function drawTicks():void {ticks.removeAllElements();var g:Graphics = ticks.graphics;g.clear();g.lineStyle(0, 0x000000);if(mode == "h") {for(var i:int = 0; i < this.width; i++) {if(i % 50 == 0) {g.moveTo(i, 0);g.lineTo(i, 10);var hLabel:Label = new Label();hLabel.text = i + "";hLabel.setStyle("fontSize", 10);hLabel.x = i - (3 * (i + "").length);hLabel.y = 12;ticks.addElement(hLabel);}else if(i % 5 == 0) {g.moveTo(i, 0);g.lineTo(i, 5);}}}else if(mode == "v") {for(var j:int = 0; j < this.height; j++) {if(j % 50 == 0) {g.moveTo(0, j);g.lineTo(10, j);var vLabel:Label = new Label();vLabel.text = j + "";vLabel.setStyle("fontSize", 10);vLabel.x = 12;//i - (3 * (i + "").length);vLabel.y = j - 3;ticks.addElement(vLabel);}else if(j % 5 == 0) {g.moveTo(0, j);g.lineTo(5, j);}}}}private function layoutResizer():void {if(mode == "v") {resizerGrp.x = 80 - 48;}else {resizerGrp.x = this.width - 5 - 48;}resizerGrp.y = this.height - 5 - 48;}protected function resizerDoubleClickHandler(event:MouseEvent):void {event.stopImmediatePropagation();}]]></fx:Script><s:BorderContainer id="ruler" width="100%" height="100%" borderVisible="false"><s:backgroundFill><s:SolidColor color="0x00FF00" alpha="0.4"></s:SolidColor></s:backgroundFill><s:Group id="labelGrp" width="100%" height="100%"><s:layout><s:VerticalLayout /></s:layout><s:Group id="ticks"></s:Group><s:Label id="display" width="100%" height="100%" textAlign="center" verticalAlign="middle" /></s:Group><s:Group id="resizerGrp" width="48" height="48"><s:Image id="upResizer" source="assets/up.png" x="11" y="0" click="resizerClickHandler(event)" doubleClickEnabled="false" doubleClick="resizerDoubleClickHandler(event)" /><s:Image id="downResizer" source="assets/down.png" x="11" y="22" click="resizerClickHandler(event)" doubleClickEnabled="false" doubleClick="resizerDoubleClickHandler(event)" /><s:Image id="leftResizer" source="assets/left.png" x="0" y="11" click="resizerClickHandler(event)" doubleClickEnabled="false" doubleClick="resizerDoubleClickHandler(event)" /><s:Image id="rightResizer" source="assets/right.png" x="22" y="11" click="resizerClickHandler(event)" doubleClickEnabled="false" doubleClick="resizerDoubleClickHandler(event)" /></s:Group><s:HGroup id="lineGrp" x="20" width="3" height="100%" horizontalAlign="center" verticalAlign="middle" ><s:Line id="line" height="100%"><s:stroke><s:SolidColorStroke weight="1" /></s:stroke></s:Line></s:HGroup></s:BorderContainer>
</s:WindowedApplication>

使用方法:按住alt键的同时移动鼠标,可以移动指示线; 在尺子上双击,可以切换横竖模式;点击箭头可以增加减少尺子长度。

可执行文件下载地址: http://download.csdn.net/detail/ptheus/7343231

转载请著名出处,图迹科技www.togeek.cn

Flex Air 实现桌面尺子(Ruler)工具相关推荐

  1. Flash, Flex, Air, Flashplayer之间的相互关系是什么

    Flash, Flex, Air, Flashplayer之间的相互关系是什么? 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:曾嵘 链接:http://www.zhi ...

  2. flex air openWithDefaultApplication 时出现Illegal ...

    2019独角兽企业重金招聘Python工程师标准>>> 今天继续加班加点做air项目 .果然是很多想不到的困难,困难可以有,但我希望每一个问题都能解决才好.今天遇到了什么呢?flex ...

  3. 跨平台桌面应用开发工具Electron v11.0.4

    介绍: Electron是GitHub发布的跨平台桌面应用开发工具,支持Web技术开发桌面应用,其本身是基于C++开发的,GUI核心来自于Chrome,而JavaScript引擎使用v8. v11.0 ...

  4. Nitro-LM保护Flex/AIR应用的安全

    Nitro-LM,可以保护Flex/AIR应用的安全,并且在线管理RIA应用许可的软件.它的管理界面是通过AIR应用来实现的,其中一个叫做Lite的版本是单独针对Flex/AIR应用的加密,经过它加密 ...

  5. windows 10远程连接ubuntu 18.04 Gnome桌面:NoMachine工具使用详解

    文章目录 Gnome桌面环境 NoMachine工具 实际操作 Ubuntu操作 Windows操作 远程连接设置 总结 做为系统管理员,远程连接到各种服务器算是常规操作.如果本地是windows环境 ...

  6. 两款专业的远程桌面连接管理工具:RoyalTS 和 visionapp Remote Desktop (vRD)

    有经常用远程桌面连接的朋友,可以试下这两款专业的远程桌面连接管理工具:RoyalTS 和 visionapp Remote Desktop (vRD) ,这两个软件都是免费的,并且管理你的远程桌面连接 ...

  7. 远程桌面连接的工具及使用方法

    远程桌面连接的工具及使用方法 Windows远程桌面连接 向日葵 ToDesk Windows远程桌面连接 向日葵 ToDesk 目前感觉ToDesk比向日葵体验要好,更加流畅,也更加稳定. 使用方法 ...

  8. 如何让Flex AIR压缩解压缩库airxzip也支持中文文件名

    最近忙个Flex AIR项目要用到压缩和解压缩打包网络传输功能,所以在网上发现了这个库airxzip,接口使用挺方便的,但是一开始就是不支持中文文件名,压缩后的文件名一直是用UTF-8的,后来从air ...

  9. 远程桌面协议(RDP)工具 FreeRDP

    FreeRDP是一个免费开源实现的一个远程桌面协议(RDP)工具,用于从Linux下远程连接到Windows的远程桌面.FreeRDP 0.9版本是基于GPL开源协议,而自FreeRDP 1.0版本后 ...

最新文章

  1. Java总复习(二)
  2. make 命令_Vim 命令大全
  3. 【济宁百瑞达机械设备有限公司——文化拓展学习】2018技术展望:利用现有IT投资扩大云部署...
  4. 前端学习(2351):text组件的使用
  5. oracle 汇总上面所有,Oracle经验技巧汇总
  6. [转]Spring注解-@Configuration注解、@Bean注解以及配置自动扫描、bean作用域
  7. php 页面拖动改变大小,鼠标拖动改变DIV等网页元素的大小的实现方法
  8. 计算机软件录音注意事项,录音笔使用注意事项
  9. Android中更详细的log获取方法
  10. Office2010初次体验之应用程序安全性
  11. 简易秒表Android源代码
  12. 怎么阻止html渲染页面,防止浏览器假死的一个HTML5方案
  13. windows安装mongodb 时msi文件打不开解决方案
  14. Hololens2项目基础开发
  15. Camera ITS当中的test_param_exposure_time测试
  16. 华为扩大内存代码_华为畅享6内存扩大拨号代码 | 手游网游页游攻略大全
  17. wps如何修改已经存在的目录标题内容?
  18. 解决springboot上传图片无法显示问题
  19. ubuntu安装华为云桌面---cloudclient
  20. 关于计算机专业的作文800字,计算机型人类作文800字

热门文章

  1. BERT解析及文本分类应用
  2. 基于微信小程序菜谱查询app设计
  3. 铁轨巡检机器人_上海试点轨道智能巡检机器人
  4. S32K144(4)LED
  5. C语言实现二进制转十进制
  6. 无组织排放管控治一体化解决方案
  7. 三相三线STATCOM仿真模型。无功电流采用ipiq检测,pwm采用滞环控制。
  8. 使用 Busy Dialog 动画阻止 SAP UI5 应用按钮短时间内快速被点击试读版
  9. Mini字幕滚动器/迷你字幕滚动器(单机版/试用版)v1.8 最新版
  10. flash透明的处理办法