App导航方式纠结——固定底部导航 or 九宫格导航

目前的iPhone和Android上的App大致采用两类主导航方式:固定底部导航和九宫格导航。碰巧我最近设计的两款iPhone应用——“今夜酒店特价”和“爱房 新房,优惠,团购”——前者使用了固定底部导航后者采用了九宫格。对这两种导航方式做了一些分析如下:

九宫格导航

优点:在首页提供了App大部分功能的入口,突破了固定导航5个tab的限制
缺点:在信息层级比较深的情况下会增加用户在功能模块间切换的成本,降低效率,用户较难在短时间内了解App的全部功能

适合于:

  1. App功能多,功能模块之间无耦合关系的应用
  2. 产品有品牌基础,用户对功能已有预期的情况

固定底部导航

优点:导航层级较短,功能模块间切换的成本低,能够便于用户快速的了解App功能,
缺点:导航最多不能超过5项,对于功能模块比较多的应用有局限性

适合于:

  1. App功能模块较少,功能模块间有耦合关系的应用
  2. 适合无品牌基础,希望通过功能点迅速抓住用户的应用

===更多思考的分割线=======================

  1. 在使用九宫格的情况下,如何实现在任何层级下快速返回首页的交互?(类似于“Home”键)
  2. 九宫格和固定导航是否可以结合使用?有何利弊?

在IIS7上部署FluorineFx找不到Fluorine.aspx问题的解决

在IIS7下部署FlourineFx在打开Console的时候会提示Fluorine.aspx找不到的404错误。我开始遇到的时候也很郁闷,还好有万能的Google告诉我有这篇帖子:http://forum.fluorinefx.com/viewtopic.php?f=17&t=151

相信很多使用Win7作为开发环境的同学都会遇到这样的问题,所以把在解决方法记在这里,免得大家走弯路。

  1. 打开IIS7 Manger
  2. 选择部署Fluorine网关的网站
  3. 功能视图->IIS->模块
  4. 添加托管模块:名称-FluorineGateway,类型-FluorineFx.FluorineGateway
  5. 重开Console,搞定!

11月28日 第6届 FLASH开发者交流会

活动在线报名地址:http://www.wedoswf.com/events/2

主讲者和专题介绍

  • 从娑婆物语谈 Isometric TileBased 游戏开发
    主讲人:蔡浩宇(网名:Hugh Tsai)
    蔡浩宇现就读于上海交通大学计算机系,独立游戏开发者,ACG狂热份子,笃信技术宅可以拯救世界,致力于萌化游戏及相关产品创作。
    蔡浩宇的博客:http://hughchy.wordpress.com
  • 松耦合代码之开发方法与工具演示
    主讲人:刘争辉(网名:eidiot)
    06年开始使用AS3,开发过Flash整站、社区、游戏等多种类型产品。爱好新技术,对 Robotlegs、AS3-signals 等前沿开源项目做出贡献,并翻译了 Robotlegs 最佳实践文档。目前就职于北京 MagnetJoy 公司从事 Social Game 开发。
    刘争辉的博客:http://eidiot.net/
  • AIR Android开发的一些心得
    主讲人:邱彦林(网名:walktree)
    多年来,一直从事和Flash技术平台相关的开发工作,曾出版第一本Flex中文教程《Flex第一步》。现就职于Sonic杭州分公司,专注于RIA企业应用的研发。
    邱彦林的博客:http://www.fluidea.cn/blog

    [更多精彩主题即将揭晓...]

议程安排

2010年11月28日 星期日

  • 12:30 ~ 13:00 参会人员签到,入场
  • 13:15 ~ 15:00 主题讨论
  • 15:00 ~ 15:15 茶歇和聊天
  • 15:15 ~ 17:30 主题讨论
  • 18:00 技术交流和讨论

会议地点

畅星大厦•上海
地址:上海浦东新区碧波路888号畅星大厦3楼会议厅
电话:021-38984558
网站:http://www.changxing.sh.cn
交通:地铁2号线张江站(步行5-10分钟即到)

>> 在 Google 地图上查看

Posted in RIA

Molehill 3d APIs – Show on MAX 2010 Develop

Molehill” is the code name for a new set of low-level, GPU-accelerated 3D APIs that will enable advanced 3D experiences across screens through the Adobe® Flash® Platform runtimes. These new low-level APIs will provide advanced 3D and 3D engine developers the flexibility to leverage GPU hardware acceleration for significant performance gains. Today, Adobe Flash Player 10.1, renders thousands of non z-buffered triangles at approximately 30 Hz. With the new 3D APIs, developers can expect hundreds of thousands of z-buffered triangles to be rendered at HD resolution in full screen at around 60 Hz. Using the new 3D APIs in Flash Player and AIR will make it possible to deliver sophisticated 3D experiences across almost every computer and device connected to the Internet.

The 3D capabilities enabled by the new APIs will also be available to the broader developer community through popular ActionScript® 3D frameworks, such as Alternativa3D, Away3d, Flare3D, Sophie3D or Yogurt3D.

百度说吧初体验

早就听说麦田在蚂蚁网结束以后去搞百度微博了,前天才收到麦田的百度说吧邀请,真不够意思!:P

在这里记下两天用下来的一些感受。

隐私

  1. 注册必须输入手机号,但是没有看到任何“隐私协议”
  2. “实名社交平台”这六个字说明百度说吧传承了蚂蚁网的真实交友特色。输入真实姓名和身份证号就可以获得V“认证”,这是和其他微博最大的不同,也许这个V对”有关部门”的意义大于对用户的意义。

功能

  1. 相互关注的人可以“交换手机号”,这个功能见仁见智,419爱好者肯定喜欢,如果有人要和我交换,我可能会觉得尴尬
  2. 目前不支持#插入话题
  3. “回复我的”不会出现在“@提到我的”,这个设计很不习惯,如果这样还不如把“@提到我的”改成“转发我的”
  4. @username不会在微博中生成链接,输入@也不能列出常用Fo供选择
  5. 回复的条目是时间倒序显示的,也就是说“最新的回复”会出现在列表的最上面,这对BBS用户来说肯定不习惯
  6. 手机版马上会推出
  7. 目前没有客户端,也没有任何开放API的消息
  8. 没有微博的实时搜索,这个功能我认为会是说吧的杀手功能,很遗憾,目前还没有

运营

  1. 说吧目前还停留在“What are you doing right now?”的微博初级阶段,静观演化…
  2. 麦田保持了一贯的风格,深入第一线与用户互动,但是距离产生美,这样很容易让用户忘记还有一个官方账号叫@百度说吧
  3. 目前百度内部的人往往都有几千个关注,@百度说吧的号是10000可以理解,Keso的说吧号是80000就不可理解了,天朝不平等的事本来就很多了,在互联网产品里再体现出来就不好了
  4. 在实名基础上,拉近用户距离以后,如何产生“美”
  5. Btw: @百度说吧美女好像比腾讯薇薇漂亮,不过有点太低调了吧

中国微博的先驱已经去做团购了,门户微博的竞争已经进入白热化阶段,百度作为后来者能否迎头赶上,拭目以待!麦田加油!

顺便发一些百度说吧邀请:

  • http://t.baidu.com/i/9443f7d54dbbd008d83ac1ae
  • http://t.baidu.com/i/95cea7f79429a51154c99ad1
  • http://t.baidu.com/i/93ff822840f9b05bb0c01d22
  • http://t.baidu.com/i/6e3592e50ecfe256e1dbab0a
  • http://t.baidu.com/i/c9926462a7c10b088d119785

PV3D初探 – 球形全景

昨晚开始研究PV3D,选了一个常用的的球形全景做测试,对Viewport, Camera的使用有了些了解。全景图片比较大,载入可能比较慢,请耐心等待。(全景图是网上找的,出处不详,如有版权问题请提醒我)

代码:

package
{
	import flash.events.Event;
	import org.papervision3d.cameras.CameraType;
	import org.papervision3d.materials.BitmapFileMaterial;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.view.BasicView;

	/**
	 * 全景测试
	 * @author Xuanfei Liu
	 */
	public class Panorama extends BasicView
	{
		private var sphere:Sphere;
		private var material:BitmapFileMaterial;

		public function Panorama()
		{
			super(600, 400, true, false, CameraType.FREE);
			camera.z = 0;
			camera.focus = 400;
			camera.zoom = 1;
			material = new BitmapFileMaterial("assets/sphere.jpg");
			material.opposite = true;//这行很关键,要把材质贴在球体内部
			material.smooth = true;
			sphere = new Sphere(material, 400, 40, 40);
			scene.addChild(sphere);
			startRendering();
		}

		override protected function onRenderTick(e:Event = null):void
		{
			camera.rotationY += (mouseX - stage.stageWidth/2) * 0.01;
            camera.rotationX += (200 * mouseY / stage.stageHeight - 100 - camera.rotationX) * 0.1;
			super.onRenderTick(e);
		}
	}
}

有时间我再试试Cube全景,有人能提供立方体全景图吗?

Flash RIA的可用性 —— 在Flash Camp 2010上的演讲

周六的Flash Camp 2010活动圆满结束,见到了赶来捧场的云开大哥和做了精彩演讲导致我肚子很饿的接口帝小S弟,很开心。唯一的遗憾是Adobe的平台技术总监Gray Zhu由于航班的原因没有到现场。

我在活动上的演讲题目是“Flash RIA的可用性”,这个话题很大,我这次主要是从Flash开发者的角度讲了一些可用性相关的点,希望由点及面引起开发者对可用性问题的思考,所以演讲的内容偏向常识方面,包括:

  • Flash的浏览器兼容性
  • Flash RIA 如何符合用户的网页浏览习惯
  • 如何利用全屏模式
  • 如何适应不同的屏幕分辨率
  • 如何创建全球化应用

Slideshare的转码有问题,建议把PPT下载下来看。

在这里查看演示,点右键有福利

2010年9月26日更新:
视频出来了…

2010年9月27日更新:
活动视频列表: http://v.ku6.com/playlist/index_3851258.html
活动回顾: http://www.wedoswf.com/posts/988

广告时间:FLASH CAMP 2010

第5届FLASH开发者交流会将于9月18日举行,这次的活动升级为 Flash Camp 2010

Adobe的平台技术总监Gary Zhu会介绍 Adobe 平台技术的发展和Flash移动应用软件的开发,还有诸多高手带来游戏开发和AIR应用的经验之谈。我有幸得到邀请分享Flash RIA可用性方面的一些体会。

活动在线报名地址:http://www.wedoswf.com/events/1

嗯,广告很短,总算完成作业了 :P

9.18,我们不见不散!

Posted in RIA

Flex简单画线组件

一眨眼一定到月底了,这个月的两篇作业还没做,为了证明我是个言而有信的人,临时抱佛脚补上两篇,晚点比没有强!

之前做项目的时候需要在UI上画一些虚线和直线,于是封装了这个Flex简单画线组件,实现在任意两点间画线,可以指定线型,颜色,粗细,虚线还可以指定线段长度和间隔。

具体实现不解释了,代码会说话。

package me.xuanfei.common.component
{
	import flash.display.CapsStyle;
	import flash.display.Shape;

	import mx.core.UIComponent;

	public class SimpleLine extends UIComponent
	{
		public static const SOLID:String = "solid";
		public static const DASH:String = "dash";

		private var _shape:Shape = new Shape();
		private var _type:String = SOLID;
		private var _x1:Number = 0;
		private var _y1:Number = 0;
		private var _x2:Number = 200;
		private var _y2:Number = 0;
		private var _thickness:Number = 0;
		private var _color:uint = 0x000000;

		private var _dashPattern:Array = [3, 2]

		public function SimpleLine()
		{
			super();
		}

		override protected function updateDisplayList(w:Number,h:Number):void{
			super.updateDisplayList(w,h);			

			_shape.graphics.lineStyle(thickness, color, 1, true, "normal", CapsStyle.NONE);
			_shape.graphics.moveTo(x1, y1);
			switch(type)
			{
				case SOLID:
					_shape.graphics.lineTo(x2, y2);
					break;
				case DASH:
					drawDash();
					break;
			}
			addChild(_shape);
		}  

		private function drawDash():void
		{
			var w:Number = x2 - x1;
			var h:Number = y2 - y1;
			var length:Number = Math.sqrt((w)*(w) + (h)*(h));

			var units:Number = length/(dashPattern[0]+dashPattern[1]);
			var dashSpaceRatio:Number = dashPattern[0]/(dashPattern[0]+dashPattern[1]);

			var dashW:Number = (w/units)*dashSpaceRatio;
			var spaceW:Number = (w/units)-dashW;
			var dashH:Number = (h/units)*dashSpaceRatio;
			var spaceH:Number = (h/units)-dashH;

			while (length > 0)
			{
				x1 += dashW;
				y1 += dashH;
				length -= dashPattern[0];
				if (length < 0)
				{
					x1 = x2;
					y1 = y2;
				}

				_shape.graphics.lineTo(x1, y1);
				x1 += spaceW;
				y1 += spaceH;
				_shape.graphics.moveTo(x1, y1);
				length -= dashPattern[1];
			}

			_shape.graphics.moveTo(x2, y2);
		}

		[Bindable]
		public function get type():String
		{
			return _type;
		}

		public function set type(value:String):void
		{
			_type = value;
		}

		[Bindable]
		public function get x1():Number
		{
			return _x1;
		}

		public function set x1(value:Number):void
		{
			_x1 = value;
		}

		[Bindable]
		public function get y1():Number
		{
			return _y1;
		}

		public function set y1(value:Number):void
		{
			_y1 = value;
		}

		[Bindable]
		public function get x2():Number
		{
			return _x2;
		}

		public function set x2(value:Number):void
		{
			_x2 = value;
		}

		[Bindable]
		public function get y2():Number
		{
			return _y2;
		}

		public function set y2(value:Number):void
		{
			_y2 = value;
		}

		[Bindable]
		public function get thickness():Number
		{
			return _thickness;
		}

		public function set thickness(value:Number):void
		{
			_thickness = value;
		}

		[Bindable]
		public function get color():uint
		{
			return _color;
		}

		public function set color(value:uint):void
		{
			_color = value;
		}		

		[Bindable]
		public function get dashPattern():Array
		{
			return _dashPattern;
		}

		public function set dashPattern(value:Array):void
		{
			_dashPattern = value;
		}
	}
}

在MXML中调用也很简单:

<comp:SimpleLine type=”dash” color=”#999999″ x2=”200″/>

这样就可以画一条200px宽的水平灰色虚线(comp是声明的Namespace)。