Flex4 实现拖拽缓动

由 marco 在 十月 10th, 2011 发表于 原创文章5 条评论

你有在做类似Google地图这种拖拽缓动效果的应用吗?你还在为写缓动加速算法而头痛吗?如果是那么你看了下面的文章内容后你肯定会大骂一句:“TMD,原来这么简单!”。。。

费话少说,先看一下效果吧(由于是国外服务器,flash和图片加载有点慢,有请耐心等待):

效果怎么样,是不是很流畅呢!
阅读全文 »

Flash Player 11 & AIR 3.0 新特性

由 marco 在 八月 5th, 2011 发表于 行业资讯4 条评论

下一代Flash Player 11和AIR 3的关注领域为跨屏幕,也就是各种终端设备,包换:PC、笔记本、手机、游戏机(PSP)、电视机机顶盒等。

下一代Flash Runtimes新功能和增强主要分为以下七个部分:

1. 软件架构

在软件架构方面,下一代运行时支持64位操作系统(Windows、Mac、Linux)和64位浏览器。

2.桌面能力增强

1) WebKit升级

  1. 与Safari 5.0.5同步内核版本
  2. 支持更多的HTML5标签
  3. Nitro JS引擎,提速30%
  4. PDF渲染加速
  5. PNG Lib升级
  6. XML/XSLT Lib升级
  7. Cairo/Pixman Lib升级

2) Direct Mode

AIR中使用GPU加速StageVideo与Stage3D

3) 运行时绑定

在打包AIR程序时可以把AIR Runtime也打包进去,只支持Windows和Mac系统。

使用场景:

  1. 企业或独立应用
  2. 防火墙内
  3. 无需频繁更新运行时
  4. 无管理员权限

4) 其他

  1. JPEG-XR(俗称HD Photo)支持
  2. 高分辨率位图支持(取决于系统内存),也就是不限制BitmapData的宽和高了。
  3. LZMA高效压缩SWF,SWF的体积会更小。

阅读全文 »

Fex4中使用Group实现滑动翻页

由 marco 在 六月 26th, 2011 发表于 生活随笔评论

在Flex4中Group取代了flex3时代的Canvas和Box容器,成为了主要的布局容器,相比Canvas和Box她更加轻量,因为至少Group中没有实现滚动条的代码。
现在这个例子展示了用Group配合Animate实现分页,并且实现翻页的动画:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" 
			   minWidth="955" minHeight="600">
	<fx:Script>
		<![CDATA[
		import spark.core.NavigationUnit;
 
		/**
		 * 上一页
		 */
		private function prePageHandler():void
		{
			smp.valueBy = hGroup.getHorizontalScrollPositionDelta(NavigationUnit.PAGE_LEFT);
			anmiate.play();
		}
 
		/**
		 * 下一页
		 */
		private function nextPageHandler():void
		{
			smp.valueBy = hGroup.getHorizontalScrollPositionDelta(NavigationUnit.PAGE_RIGHT);
			anmiate.play();
		}
 
		]]>
	</fx:Script>
	<fx:Declarations>
		<s:Animate id="anmiate" target="{hGroup}" duration="800">
			<s:motionPaths>
				<s:SimpleMotionPath id="smp" property="horizontalScrollPosition"/>
			</s:motionPaths>
		</s:Animate>
	</fx:Declarations>
	<s:Panel title="Flex4 Group新特性">
		<s:HGroup id="hGroup" gap="10" height="100" width="320" clipAndEnableScrolling="true">
			<s:Button width="100" height="100" label="1" fontSize="30"/>
			<s:Button width="100" height="100" label="2" fontSize="30"/>
			<s:Button width="100" height="100" label="3" fontSize="30"/>
			<s:Button width="100" height="100" label="4" fontSize="30"/>
			<s:Button width="100" height="100" label="5" fontSize="30"/>
			<s:Button width="100" height="100" label="6" fontSize="30"/>
			<s:Button width="100" height="100" label="7" fontSize="30"/>
		</s:HGroup>
		<s:controlBarContent>
			<s:HGroup width="100%" horizontalAlign="center">
				<s:Button label="上一页" click="prePageHandler()"/>
				<s:Button label="下一页" click="nextPageHandler()"/>
			</s:HGroup>
		</s:controlBarContent>
	</s:Panel>
</s:Application>

使用motionPaths属于Animate可以同时设置目标的多个属于以实现更加复杂的动画,在这里我们只要改变Group的horizontalScrollPosition即可,因为在Group容器在不能把子集全部显示出来的时候,horizontalScrollPosition和verticalScrollPosition会自动计算出来,这个两个属性是给Scroller用的。
最灵活最巧妙的地方就是这两属性不光可以做为滚动条使用,可以通过Animate改变其值,实现滑动的效果。
NavigationUnit是一个枚举类,他定义了PAGE_UP、PAGE_DOWN、PAGE_LEFT、PAGE_RIGHT等等,这里我们用了HGroup,是横向的,所以只用PAGE_LEFT,PAGE_RIGHT就可以了,还有一点非常重要,那就是Group的两个方法:getHorizontalScrollPositionDelta()getVerticalScrollPositionDelta(),使用这个两个人方法和NavigationUnit枚举类的参数,可以计算出左移或者右移当前页时,所需要调整的horizontalScrollPosition值。以此类推,可以使用VGroup实现上下的翻页,TileGroup可以实现上下左右的翻动,而且修改起来非常简单。
就是这样,计算出滚动距离传给SimpleMotionPath 然后播放动画,一切就是这么简单,而且效率极高。

点击查看效果

Flex4中[Client.Error.DeliveryInDoubt]错误经验一例

由 marco 在 二月 12th, 2011 发表于 生活随笔评论

最近遇到一个很奇怪的问题,我在使用RemoteObject调用后台.net rpc服务时老是报一个错:[faultCode:Client.Error.DeliveryInDoubt faultString:'通道已断开' faultDetail:'收到确认前通道已断开']。

把自己的代码查询了半天也找不出任何问题,后来还是调试.net代码的时候找到点眉目,原来.net接口本来应该返回给我视频文件路径的,它却把视频文件的整个二进制流读出来一下子返回给我了。我的RemoteObject是使用的RTMP通道,四个视频文件一共40MB,可能RTMP不支持这么大的数量,导致在传输过程中崩溃了!

希望我的教训对大家有用,在这里祝朋友们新年快乐,大吉大利!

Flex里的空闲检测-IDLE

由 marco 在 十二月 29th, 2010 发表于 生活随笔1 条评论

Flex里面也有空闲检测,本来为了实现这个功能还要去全局侦听鼠标和键盘事件,有了IDLE这下可方便多了。
IDLE由SystemManager进行管理,所以要检测IDLE就要对SystemManager进行侦听,方法如下:

/**
 * 主程序初始化时对systemManager进行侦听
 */
public function init():void
{
	systemManager.addEventListener(FlexEvent.IDLE, idleHandler);
}
 
/**
 * idle事件处理
 */
private function idleHandler(event:FlexEvent):void
{
	var idleCounter:int = systemManager.mx_internal::idleCounter;
	if( idleCounter >= 900)// 100毫秒一次,900就等于90秒
		systmeIdle();
}
 
/**
 * 发送系统空闲消息
 */
private function systmeIdle():void
{
	// TO DO ...
}

这里要注意的是FlexEvent.IDLE事件派发规则是:当 1 秒内没有任何键盘和鼠标活动时,每隔 100 毫秒分派一次
根据API所知,我们不能去设定系统空闲多少秒以后才派发IDLE事件,这里我们只能在idleHandler事件处理方法里面根据systemManager对IDLE事件派发的次数来计算系统已经空闲了多长时间,悲剧的这个事件的派发次数还被隐藏起来了,在mx_internal命名空间下,如果要得到这个值我们不得不使用mx_internal这个命名空间,莫名其妙的多走了一步,方法如下:

// 先把名导入
import mx.core.mx_internal;
 
// 对象.命名空间::属性名
systemManager.mx_internal::idleCounter;

Flash Builder 4安装程序采用AIR技术

由 marco 在 三月 22nd, 2010 发表于 原创文章, 行业资讯2 条评论

刚刚在安装新下载的Flash Builder4正式版,从整个安装向导UI来看极像是用AIR程序做的。

AIR2.0已经支持将程序打包为可直接执行的exe文件。

安装向导用AIR2.0解决方案,即能体现AIR2.0的特性又给自己的产品做了一次值入式广告,真是一举两得!

Flash Builder 4 正式版发布

由 marco 在 三月 22nd, 2010 发表于 行业资讯1 条评论

千呼万唤始出来,期盼已久的Flash Builder4 正式版今天终于发布了。
我也在下载中,希望会有令人心动的改进。
点击这里下载。

Hello Buzz!

由 marco 在 二月 11th, 2010 发表于 生活随笔, 精品收藏5 条评论

Google今天发布一款名为Google Buzz的新产品,用户将可以直接在Gmail内分享信息、连接和照片。谷歌另外还发布了一系列用于Android智能手机的新型社交网络功能。

Buzz类型是Twitter的一个社交平台,信息实时推送。试用一个小时感觉非常不错,总体上继承了Gmail的优良血统,信息会自动保存在Gmail里面以免漏读,可以把信息打上喜欢的标签,共享Picasa, Google Reader, Flickr, Twitter上的内容,还可以对消息记录打包做为邮件发送。

担心! 继Facebook, Twitter, YouTube之后, Buzz会不会也只能在我们眼前昙花一现?

自定义图表刻度标签

由 marco 在 一月 6th, 2010 发表于 原创文章4 条评论

Flex为我们提供了一套非常强大的图表组件,而且这些组件给我们开发人员提供了丰富的接口,在此基础上可以扩展出更加令人兴奋的应用。
下面是我扩展的AxisRenderer类,AxisRenderer是图表轴渲染器,所有图表的轴都是通过这个类来渲染的。而我这个例子所做就是在AxisRenderer的基础上提供几个接口(以Style方式),这几个接口的作用是给轴的刻度标签加上格式、前/后缀、千位符、单位。

Demo


阅读全文 »

StyleBindingUtils可以绑定样式的工具类

由 marco 在 一月 5th, 2010 发表于 原创文章1 条评论

Flex自带的有一个BindingUtils类,可以把两个类的属性绑定起来,但是不能绑定样式(Style),样式是Flex中常用的特性,看其BindingUtils源码,绑定技术本身是依靠于ChangeWatcher,所以照着BindingUtils写一个可以绑定样式的方法。
StyleBindingUtils:

package org.beasy.binding.utils
{
	import mx.binding.utils.ChangeWatcher;
	import mx.styles.IStyleClient;
 
	/**
	 * Flex的绑定功能为我们的日常提供很多的方便
	 * 但是Flex只提供了属性的绑定类->BindingUtils;
	 * 如果要实现绑定控件的Style还要自己用ChangeWatcher去侦听事件
	 * 有了StyleBindingUtils这一切将变的简单
	 * StyleBindingUtils封装了ChangeWatcher进行了Style的绑定实现,
	 * 为您的开发提供了更多方便和快捷
	 * @author Marco
	 */
	public class StyleBindingUtils
	{
		public function StyleBindingUtils()
		{
		}
 
		public static function bindStyle(
			site:IStyleClient, prop:String,
			host:Object, chain:Object,
			commitOnly:Boolean = false):ChangeWatcher
		{
			var w:ChangeWatcher =
				ChangeWatcher.watch(host, chain, null, commitOnly);
 
			if(w != null )
			{
				var assign:Function = function(event:*):void
				{
					site.setStyle(prop, w.getValue());
				}
				w.setHandler( assign );
				assign(null);
			}
 
			return w;
		}
 
	}
}

阅读全文 »