基于AIR的简单下载工具实现

要用AIR实现一个简单的下载工具还是很容易的,因为AIR为我们提供了访问本地系统文件的API,以下是关键代码:

public static function commonDownload(url:String, file:File, downloadedCallback:Function = null):void
		{
			var urlLoader:URLLoader = new URLLoader();
			urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
			urlLoader.addEventListener(IOErrorEvent.IO_ERROR, function (event:IOErrorEvent):void {
				if(downloadedCallback != null)
					downloadedCallback();
			});
			urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function (event:SecurityErrorEvent):void {
				if(downloadedCallback != null)
					downloadedCallback();
			});
			urlLoader.addEventListener(Event.COMPLETE, function (event:Event):void {
				var bytes:ByteArray = urlLoader.data as ByteArray;
				var fs:FileStream = new FileStream();
				fs.openAsync(file, FileMode.UPDATE);
				fs.writeBytes(bytes, 0, bytes.length);
				fs.addEventListener(Event.COMPLETE, function (event:Event):void {
					fs.close();
				});
				fs.addEventListener(IOErrorEvent.IO_ERROR, function (event:IOErrorEvent):void {
					fs.close();
				});
				if(downloadedCallback != null)
					downloadedCallback();
			});
			urlLoader.load(new URLRequest(url));
		}

其中file为要保存到本地文件的File对象引用,downloadedCallback为回调函数。

Posted in AIR. Tags: . 一条评论 »

Flex与Ruby通过socket实现通简易文本聊天

Socket服务器用Ruby语言实现,代码如下:

require "socket"

server = TCPServer.new("localhost", 5000)
sessions = []
while(session = server.accept)
  sessions << session
  Thread.new(session) do |local_session|
    while(true)
      data = local_session.gets
      puts data
      if data.chomp == "quit"
        sessions.delete(local_session)
        local_session.close
      end
      sessions.each do |s|
        s.puts data
      end
    end
  end
end 

flash中有两种类型的socket,分别为XMLSocket和Socket,前者使用起来简单一点,这里我们选用后者,完整代码如下:
(更多…)

Posted in Flex, Ruby. Tags: , , . 没有评论 »

Flex中Image加载图片出错时显示默认图片的几种方法

Flex中Image加载图片出错时显示默认图片的方法主要有以下几种:

方法一:利用 brokenImageSkin 风格显示一个默认的图,只需设置CSS就行了,如下:

<mx:Style>
     Image 
     {
         brokenImageSkin: Embed("assets/404.jpg");
     }
 </mx:Style>
 

方法二:监听Image组件的IOErrorEvent.IO_ERROR事件,代码如下:

private function errorHandler():void
{
    image.source = "assets/404.jpg";
}
<mx:Image id="image" source="http://不存在.jpg" ioError="errorHandler()"/>

方法三:继承Image类,覆盖其set source方法,如下:

override public function set source(value:Object):void
{
    if(!value || value == "")
        value = "assets/404.jpg";
    super.source = value;
}

推荐使用第三种方法,因为第一种方法跟第二种方法有个共同的缺点,如下情况:
(更多…)

Posted in Flex. Tags: . 没有评论 »

基于Flex的flv简易播放器

最近在项目中要用到flv播放器,由于flex自带的VideoDisplay组件不是很好用,就自己简单实现了一个,界面不是很美观,但功能都有了,正可谓麻雀虽小五脏俱全。下面是播放器的代码,还不会用flash做flv播放器的朋友,可以参考参考。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
                 xmlns:local="*" creationComplete="init()">
<mx:Script>
    <![CDATA[
        private function init():void
        {
            player.source = "http://web.qqvideo.tc.qq.com/3/5KjbHbPKnDF.flv";
        }
    ]]>
</mx:Script>
    <mx:VBox width="100%">
        <local:Player id="player" autoPlay="true"/>
    </mx:VBox>
</mx:Application>

由于用的是网络上的视频,加载速度可能有点慢~

播放器组件 (Player.mxml) 代码如下:
(更多…)

Posted in Flex. Tags: , . 没有评论 »

自适应高度的TextArea

很多软件在用户输入文字的时候都会根据输入文字的长度自动换行并改变高度,Flex3中可以用TextArea控件实现这个功能。创建一个基类为mx.controls.TextArea的mxml组件,设置verticalScrollPolicy=”off”, 并实现以下几个方法:
监听mx.controls.TextArea的change事件

private function changeHandler():void
{
    invalidateSize();
}

覆写父类的measure方法

override protected function measure():void 
{
    super.measure();
    measuredHeight = measuredMinHeight = textField.getExplicitOrMeasuredHeight() + 
        borderMetrics.top + borderMetrics.bottom;
}
Posted in Flex. Tags: . 2条评论 »

获得一个AS对象的所有public属性名

有的时候我们可能要取得一个AS对象的属性名数组,AS里面没有显示的提供这样的方法,但是我们可以使用ObjectUtil这个类的getClassInfo方法来获得某个类的一些信息,要取得所有的属性名可以用如下方法:

var allPublicProperties:Array = ObjectUtil.getClassInfo(obj).properties as Array;

注意:以上方法只能获得所有的public属性名。

Posted in Flash & Actionscript. Tags: . 一条评论 »

开源FLV播放器FX Video中的Bug

FX Video是一个开源的基于Flex的flv播放器,不知道有没有人用过,它扩展自Flex中的标准组件VideoDisplay,即支持HTTP,又支持RTMP。最近在做公司的一个项目时用到了,发现它在用RTMP协议播放时,有几个Bug。
1. 还未设置其source属性时,进度条就已经加载了一段。
2. 基于RTMP协议播放时,本来应该是可以随时拖拽进度条的,它却不能。
3. 基于RTMP协议播放时,它不能通过点击进度条上的位置来播放影片的对应时刻。
通过分析其源代码,我找到了相应的解决方案。
1. 修改component.player.controls包下的FXProgressSlider类,将其私有属性_progress的默认值改为0.0001(只要是一个很小的数就行了,但不能是0,原值是20)。
2. 修改component.player.controls包下的FXSlider类,将其原方法:

private function get boundMax():Number
{
    return Math.max(thumb.width/2, bound.width - thumb.width/2) ;
}

改为:

private function get boundMax():Number
{
    return Math.max(thumb.width/2, this.unscaledWidth - thumb.width/2) ;
}

改完后,可以拖拽了,但是如果将进度条直接拖拽到最后时,界面会立即卡在拖拽前的那一帧上,很不友好,可以将原方法:
(更多…)

Posted in Flex. Tags: , , , . 没有评论 »

Red5开发第一步-Hello World

安装好Red5服务器之后,接下来就是测试运行众人皆知的Hello World了。按照教程上一步一步来做,可惜一直没运行起来,老是NetConnection.Connect.Rejected,NetConnection.Connect.Closed,郁闷了半天,最后通过与Red5自带的例子SOSample对比,终于给运行起来了。其过程如下:
第一步:把Red5安装目录中doc\templates文件夹下的myapp文件夹copy到webapps目录下,并改名为hello(或任意名称)。
第二步:把hello目录下的log4j.properties文件删掉,修改web.xml,删除不需要的配置信息,修改后的文件内容如下图。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:"http://java.sun.com/xml/ns/j2ee"
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
		 version="2.4">
		<display-name>hello world</display-name>
		<context-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/red5-*.xml</param-value>
		</context-param>		 
		 <context-param>
		 	<param-name>webAppRootKey</param-name>
		 	<param-value>/hello</param-value>
		 </context-param>
 </web-app>

修改red5-web.xml,修改后的文件内容如下图。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="/WEB-INF/red5-web.properties" />
	</bean>
	<bean id="web.context" class="org.red5.server.Context" autowire="byType" />
	<bean id="web.scope" class="org.red5.server.WebScope" init-method="register">
		<property name="server" ref="red5.server" />
		<property name="parent" ref="global.scope" />
		<property name="context" ref="web.context" />
		<property name="handler" ref="web.handler" />
		<property name="contextPath" value="${webapp.contextPath}" />
		<property name="virtualHosts" value="${webapp.virtualHosts}" />
	</bean>
	<bean id="web.handler" class="com.flexer.Hello" singleton="true" />
</beans>

修改red5-web.properties,将webapp.contextPath的值改为/hello。
第三步:写Java代码
打开Eclipse,建立一个Java Project,命名为hello,并将该Project地址设为我们刚才在Red5安装目录的webapps目录下新建的hello文件夹,点击Next按钮,在这个界面中点击Browse按钮,在WEB-INF中新增classes目录,将其设置为output folder,然后点击Finish。(此处要注意,output folder一定要设置在WEB-INF目录下)。建好Project后别忘了引入位于Red5安装目录下的red5.jar。Java代码如下:
(更多…)

Posted in Flex. Tags: , , . 没有评论 »

开源的flash图表:Open Flash Chart

推荐一个开源的Flash图表组件:Open Flash Chart,效果很不错,不逊色于Adobe提供的收费Chart组件,不仅能显示常见的line, bar, pie等图表,还可以显示特殊的图表。其中包括:Line Charts, Bar Charts, Horizontal Bar Chart, Stacked Bar Chart, Candle Chart, Area Charts, Pie Charts, Scatter Charts, Radar Charts;并且还提供了PHP, Perl, Python, Ruby, .NET, Google Web Toolkit, JAVA等服务器端类库。

相关网址:http://teethgrinder.co.uk/open-flash-chart-2/

Flex + Rails构建Web Application

前一段时间一直忙于做毕业设计,花了半个月左右时间终于完成。我的毕业设计题目是:基于B/S模式的WEB选课系统的设计与实现,因为喜欢Flex开发,再加上Flex完美的用户体验,前端开发技术就毫不犹豫选择了Flex;服务器端技术本打算用Java,因为用Java的话,就可以用LiveCycle Data Services来与Flex高效通信了,但由于我的本本太过陈旧,跑一个独立安装的Flex Builder已经够呛,根本无法同时跑MyEclipse。这时我才深刻领悟“工欲善其事必先利其器“的道理!可是没钱买新本本,就只好想其它的方法!因为以前学过一段时间的Rails,于是就想服务器端可不可以用Rails来做,但因为以前从来没有用Flex+Rails这个组合来开发Web Application,不知道他们之间怎样进行通信,当然用HttpService是可以通信的,但效率不高,用起来也不是很方便,就考虑Rails有没有类似LiveCycle Data Services插件,果然功夫不负有心人,让我找到了Rails的一个插件:RestfulX,下面是官方的简介:

RestfulX is a framework that brings the design principles and productivity ofRails to Adobe Flex and AIRdevelopment and makes integration with RESTful Web Services as simple as possible. If you want to use Ruby on Rails, Merb, Sinatra, CouchDB or Google App Engine and you want a UI that puts the word Rich into Rich Internet Applications give RestfulX a spin. It only takes 5 minutes to get started. Instead of WSDL, SOAP or other complex specifications you’ll find a few common conventions that help you to abstract your application from repetitive CRUD code and switch/synchronize between various data providers with minimal effort.

至于如何使用,大家可访问Restfulx的网站:http://restfulx.github.com/

该插件可以自动生成一些东西,其实也就是生成了一个基于Flex + Rails的、可对数据库进行CRUD操作的Web Application。这个自动生成的例子很好,是学习使用它的最好方法,我就是靠看这个例子的源码来学习使用的,但这个例子只用到了一些最基本的API,如果想深入学习的话,建议去看官方的开发文档。

项目中我还用到了Flex的一个MVC框架,相信Flex开发者们都应该很熟悉了,就是:Cairngorm。这个我就不介绍了。

Posted in Flex. Tags: , , . 没有评论 »