Air中TextInput输入汉字或日文引发死机的解决办法

Filed under: Flex @May 8, 2008

在Air中TextInput输入汉字或日文会引发死机
环境Flex3正式版,Air1.01

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:TextInput />
</mx:WindowedApplication>

Bug重现步骤:

1 随便写一个TextInput,或者TextArea,运行程序。

2 在输入框中使用微软智能拼音,Google拼音(我只试过这两个输入法)快速的不停的输入,乱敲键盘即可(按几下字母按一下空格这样不停的按) ,坚持3秒左右,死机Yeah!

王码五笔86版没有测出问题。

日文测试:在输入框中输入hi,按空格选择第2个汉字”日”或”非”,但不要Enter输入,这时按k,死机Yeah!

讨论死机的其它链接:
中文:http://www.riachina.com/showtopic.aspx?forumid=6&topicid=9352&go=next
日文:http://www.fxug.net/modules/xhnewbb/viewtopic.php?viewmode=flat&order=DESC&topic_id=1628&forum=14

解决办法是在这里找到的
http://millay.net/code/archives/001054.php

把AIR Application Descriptor File里的transparent设为true就不会死机了,但不清楚为什么。

<initialWindow>
<systemChrome>none</systemChrome>
<transparent>false</transparent>
</initialWindow>

Air在多语言支持方面急需加强,否则会影响全球范围的普及。

例如mx:HTML组件,据说使用的浏览器核心是Webkit,不支持中文,日文等,就是说如果用mx:HTML来显示一个html,如果有一个输入框我们只能输入字母,不能输入汉字,这还不够影响你使用Air么。

我的解决办法是用TextInput来模拟输入:
当用户点击HTML里的输入框时,Javascript把焦点转移到Air的一个TextInput中,这时你输入文字是可以的,TextInput添加一个Event.change的Listener,用ActionScript把输入到TextInput的值Copy到Html中的输入框中。

虽然解决是解决了,但让用户看起来很怪。

PureMVC中文文档发布了

Filed under: Flex @April 27, 2008

PureMVC中文文档发布了!

PureMVC官方网站: http://www.puremvc.org/

Cairngorm是Adobe官方提供的一个框架,不过相信看过的人都会头大,我认为Cairngorm企业级并且是大型程序开发,小型程序开发使用它并不合适.

具体比较先略过,这里先说一下文档.Cairngorm的文档已经有人翻译为中文了,给大家阅读提供了便利.但发现PureMVC没有人怎么关注,只有个什么十大注意点之类的.可能是因为官方提供了Cairngorm,所以其它的框架被关注就少了吧.

不过PureMVC比Cairngorm要灵活的多,如果你开发的是中小型程序,那么PureMVC要更适合一些,当然我没有说大型程序不能用啊.

经过一星期晚上业余时间的努力,终于译完了,点击下面链接下载.

PureMVC_Implementation_Idioms_and_Best_Practices(zh-cn).pdf

PS: 欢迎和我Mail交流啊。

判断文本文件的编码

Filed under: Others @March 5, 2008

在网上很流行一种说法,读取文本文件的前三个字节来判断文件的编码。其实这种方法不可取,前三个字节是Unicode编码的Byte Order Mark (BOM),

BOM参考: http://www.unicode.org/faq/utf_bom.html#BOM 

BOM对于Unicode编码是可有可无的,只是用记事本编辑另存为Unicode,UTF-8时会在文件流前加上BOM,但如果是程序写文件,比如用Java的IO流,Flex的IO等就不一定会加上BOM,Flex写Utf-8文件是不会加BOM的,Java的虽然没有试过,但多半也不会加。

那到底怎么判断文件编码呢,参考下面的文章:

http://blog.i5un.com/item/21

可以在Mozilla 的代码树中查看最新实现: http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/

或者搜索关键字:一种语言/编码检测的复合方法

这是一个方法的实现:

http://dev.csdn.net/article/10/10961.shtm 

发现EmEditor编码检测就做的很好,可是不是开源的。

ActionScript中初始化static变量的两种方法

Filed under: Flex @February 1, 2008

在Java里,你可以使用static块在加载类的时候给static变量赋值,但是在AS里没有static块语句。
所以如何在加载类的时候确保你的static变量已经被赋值呢,有两种方法。
这里指的赋值是指一系列复杂的语句,不是单纯的一个字符串赋值或new一个对象。

方法一:使用[Mixin]标签
在类定义前加[Mixin]标签,添加一个static init function像一面这样:
static init funciton会在加载类时被执行。

[Mixin]
public class Model{

  public static function init (systemManager : ISystemManager){
    trace (”I get called first”)
  }

}

方法二:在类体中的代码在加载类时会被执行。

public class Model{
  trace('I get called first');
  init();

  public static function init() : void {

    // somethins
    trace('I get called first too.');
  }

  trace("class loaded")

}

参考:
http://flexonrails.net/?p=78
http://flexonrails.net/?p=66
http://livedocs.adobe.com/

用Adobe Flex3开发AIR应用程序–入门指南

Filed under: Flex @January 7, 2008

译自Adobe Help Resource Center

1 安装Adobe AIR 运行时,和java的JVM类似。

Adobe AIR 运行时允许在桌面运行AIR应用程序,脱离游览器的束缚。
下载安装文件http://labs.adobe.com/downloads/air.html
在下载页面有样例程序(Sample Applications)http://labs.adobe.com/technologies/air/samples/

2 安装开发环境
当然我们选择开发效率最高的Flex Builder,此外还有命令行编译的一套工具。
http://labs.adobe.com/technologies/flex/flexbuilder3/下载文件需要在Adobe注册用户。

3 Adobe AIR简介
Adobe® AIR™ 是一个跨平台的运行时,可以使用现有的Web开发技能(Flash, Flex, HTML, JavaScript, Ajax)创建桌面富因特网应用程序。
AIR程序运行基于Adobe AIR Runtime,所以开发的程序在不同的操作系统表现是相同的,就像Java一样。
AIR 允许你使用最熟悉的开发环境,选取你最擅长的工具进行开发。比如

  • Flash / Flex / ActionScript
  • HTML / JavaScript / CSS / Ajax

所以AIR应用程序可以

  • 基于Flash或者Flex,即应用程序的容器是Flash或Flex(swf)
  • 基于包含HTML或PDF的Flash或Flex,即应用程序的容器是Flash/Flex,内含HTML或PDF
  • 基于HTML,应用程序的容器是HTML,JS,CSS
  • 基于包含FLASH/FLEX或PDF的HTML,即容器是HTML,内含FLASH/FLEX,PDF。

4 使用Flex Builder创建第一个Flex AIR应用程序
我们将创建一个基于SWF文件的AIR应用程序,打开Flex Builder3,当然Flex Builder基于Eclipse,实际上它是一个Eclipse的插件。
新建一个Flex Project类型的工程。Flex有两种应用程序类型,一种基于Web在Flash player里运行,一种在桌面运行于Adobe AIR runtime,我们选择桌面应用程序。服务器技术选择none,点击完成。
初始生成两个文件:mxml主文件和xml程序配置文件。

5 编写AIR应用程序
所有的代码都包含在WindowedApplication 标签内,这个标签创建了一个简单的窗口。
以代码视图打开mxml文件进行编辑,给WindowedApplication 标签添加一个title属性,值设定为”Hello world!”
在WindowedApplication元素内添加一个Label组件。
在WindowedApplication开始标签后紧跟着插入Style块,最后代码是这样的:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute" title="Hello World">
<mx:Style>
Application
{
background-image:"";
background-color:"";
background-alpha:"0.5";
}
</mx:Style>
<mx:Label text="Hello AIR" horizontalCenter="0" verticalCenter="0"/>
</mx:WindowedApplication>

选择Adobe AIR Application方式运行。

6 打包应用程序
把应用程序打包成AIR文件发行,AIR文件是包含所有应用程序文件的一个压缩文件,用户可以用AIR文件安装应用程序。
首先确保没有编译错误并运行正常,然后选择导出–Flex Release Version.
导出提示会需要一个数字签名,创建一个,填写必须的信息OK,成功,双击导出的AIR文件安装,测试一下。

Java Streams学习笔记

Filed under: JAVA @December 25, 2007

1 输出一个int值到网络流
有一回需要把一个int值输出到网络流,然后在另一客户端接收这个int值,当然网络传输用的是byte型,所以查找好多资料把int转成四位的byte数组,然后用write(byte[] b)写到流中,到另一端接收四位的byte数组,然后转换回来,很是麻烦。
现在才知道有现成的可以用,java.io.DataOutputStream 提供将一个 int 值以 4-byte 值形式写入基础输出流中的方法writeInt(int v)。
然后有一个现在的java.io.DataInputStream类,用readInt()方法读取输出流写入的int值。

2 缓冲流
如果你需要一个缓冲输出流,而不是DataOutputStream,那么可以这样写:
DataOutputStream dout = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(”data.txt”)));
这样输出流仍然是BufferedOutputStream。

3 write(int b)
write(int b)是一个容易误会的方法,这个方法只是把b的低八位写到输出流中。所以超过0-255的值将会忽略高位的值,相当于把int值截取成一个byte值。

4 输出字节数
每次输出一个字节是非常低效的策略。

5 out.flush()
关闭流之前要调用flush()方法,当然在需要的时候也要调用flush()以避免阻塞。

6
read()方法读取一个字节,所以返回的是一个byte值,但类型却是int。取值区间是-128到127,要转换成byte可以这样
int i = b >= 0 ? b : 256 + b;

7 文件编码
如果要读取一个Unicode文本文件,可以尝试读取前三个字节来判断文件是big-endian UCS-2, little-endian UCS-2, 还是 UTF-8,然后决定用什么编码的Reader。

此方法不可取,原因见: 判断文本文件的编码

Newer Posts »
Powered by WordPress