65.9K
CodeProject 正在变化。 阅读更多。
Home

Flex 移动应用技巧

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2011 年 4 月 18 日

CPOL

5分钟阅读

viewsIcon

26383

在开发了几个 Flex Hero 的演示应用后,我想与您分享一些提高原生应用行为的技巧。

今天,Flash Builder Burrito (仍在测试版) 允许您为 Android 设备和 BlackBerry PlayBook 开发原生应用程序。新的 <s:MobileApplication> 标签和 Flex Hero 的新移动组件极大地改善了您的应用程序设计方式。它已经是开发多屏幕应用程序最高效的框架,而这仅仅是个开始,因为 Adobe 将会支持越来越多的设备。

技巧 #1:关闭您的应用程序

这是 Flash 开发者在 Android 应用方面最常误解的一点。当您退出应用程序时 (例如按下主屏幕按钮),应用程序仍在后台运行。您需要了解这种默认行为并加以控制。这是从 Android 继承来的一个非常强大的行为,但有时会破坏智能手机上的用户体验。让我给您举个例子。AIR 2.5 中引入的 Geolocation API 会实时返回您的坐标。在 Android 上,它直接利用了操作系统的 GPS API,我们都知道这会消耗大量资源。在这个示例中,我只是使用 Geolocation API 来获取我的位置,并在一个文本字段中显示纬度。别忘了在 XML 清单中添加 Android 权限 “ACCESS_FINE_LOCATION”。

SC20101214-060718-175x300.pngSC20101214-060723-175x300.pngSC20101214-060729-175x300.png

在第一个屏幕上,您可以看到我的应用程序正在寻找我的位置,Android GPS 图标出现在了状态栏。然后我点击主屏幕按钮 (屏幕 2)。GPS 仍在后台工作!如果我查看正在运行的服务,tip1quitHandler 应用确实还活着。它毫无意义地消耗着我的资源。

要控制应用程序的行为,您必须侦听原生应用程序上的 DEACTIVATE 事件。只需在您的主 MXML 文件中添加这些代码行:

<?xml version="1.0" encoding="utf-8"?>
<s:MobileApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
		xmlns:s="library://ns.adobe.com/flex/spark"
		firstView="views.tip1quitHandlerHome"
		creationComplete="mobileapplication1_creationCompleteHandler(event)">
	<fx:Script>
		<![CDATA[
			import mx.events.FlexEvent;
 
			protected function mobileapplication1_creationCompleteHandler(
                               event:FlexEvent):void
			{
 
				NativeApplication.nativeApplication.addEventListener(
                                        Event.DEACTIVATE, onDeactivateApp);
			}
 
			protected function onDeactivateApp(event:Event):void
			{
				NativeApplication.nativeApplication.exit();
			}
 
		]]>
	</fx:Script>
</s:MobileApplication>

在这种情况下,当用户返回主屏幕时,我只是关闭了应用程序。您也可以选择移除 Geolocation 的事件侦听器,并在 Event.ACTIVATE 事件触发时重新激活它。这为您在 Android 上的操作提供了前所未有的自由度和控制力。

技巧 #2:在导航到新视图之前加载数据

这是由于新的 MobileApplication 架构而导致的另一个经典错误。当您需要从互联网下载一些数据时,不要在视图中调用该服务。如果您这样做,每次返回该视图时都会发起一个无用的请求。更新主应用程序文件以调用您的服务,并在结果事件上导航到视图。删除 MobileApplication 标签中的 firstView 参数,并在 creationComplete 事件上调用您的服务。当您收到 resultEvent 时,导航到第一个视图,并将 event.result 对象作为 ArrayCollection 传递。

protected function operation1():void
	{
		Operation1Result.token = speakersDevoxx.Operation1();
	}
 
	protected function mobileapplication1_creationCompleteHandler(
             event:FlexEvent):void
	{
		// TODO Auto-generated method stub
		operation1();
	}
 
	protected function Operation1Result_resultHandler(event:ResultEvent):void
	{
		// TODO Auto-generated method stub
		navigator.pushView(views.tip2devoxxHome,
                      event.result as ArrayCollection);
	}

查看视频,了解我是如何在 5 分钟内使用 Flash Builder 4 的 Data Wizard 构建一个连接到 DEVOXX REST 服务的应用程序的。一旦您的数据加载完成,它就会在视图之间保持持久化。在我的示例中,我获取了演讲者的列表并将它们存储在 Array Collection 中。当我想要显示某个演讲者的详细信息时,我只需导航到一个新视图,并将 list.selectedItem 对象传递过去。借助 AIR 2.5,您还可以选择将数据本地存储在 SQLite 数据库中。

技巧 #3:显示自定义标签

在使用移动项目渲染器来滚动数据列表时,可以获得最佳性能。别忘了,在 List 中您也可以使用 labelFunction 参数,而不是经典的 labelField。一个典型的用例是当您想在列表中显示用户的全名时。例如,如果您只从服务中获取名字和姓氏,则可以使用这个简单的技巧。

<fx:Script>
		<![CDATA[
			public function myFullName(obj:Object):String
			{
				return(obj.lastName + " " + obj.firstName);
			}
 
			protected function list1_clickHandler(event:MouseEvent):void
			{
				// TODO Auto-generated method stub
				navigator.pushView(views.mySpeaker,
                                        list.selectedItem);
			}
 
		]]>
	</fx:Script>
	<s:List id="list" width="100%" height="100%" dataProvider="{data}" 
             labelFunction="myFullName" click="list1_clickHandler(event)">
 
	</s:List>

技巧 #4:始终声明一个启动画面

您的 AIR 应用程序启动总是需要一秒钟。Flex Hero 框架对当前的 Preloader 类进行了一些调整,以便在经典的加载体验之前显示一张图像。始终在您的主 MobileApplication 标签中声明一个启动画面 (仅一张静态图像),以改善用户体验。用一张图片来欢迎您的用户总比一个黑色的背景要好。有几个“ratio”参数可用于控制启动画面的显示。您应该考虑 letterbox 和 zoom ratio 缩放模式。使用 MobileApplication 的 splashScreenImage 和 splashScreenScaleMode 参数。

<s:MobileApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
	xmlns:s="library://ns.adobe.com/flex/spark"
	xmlns:speakersdevoxx="services.speakersdevoxx.*"
	creationComplete="mobileapplication1_creationCompleteHandler(event)" 
         title="Loading..."
	splashScreenImage="@Embed('devoxxSplash.png')" splashScreenScaleMode="zoom">

技巧 #5:检查屏幕方向

我非常喜欢 Flex 4 的自定义布局。您可以在此处阅读我关于自定义布局的文章:http://www.riagora.com/2010/05/flex-4-and-custom-layouts/ 默认情况下,移动 List 组件将使用 VerticalLayout 类。根据您显示的内容,VerticalLayout 并不总是最佳选择。根据您设备的屏幕方向 (纵向或横向),您可能还希望更改与列表关联的布局。当我显示图片时,我更喜欢 TileLayout 和“rows”方向,但是当我切换到横向模式时,我更喜欢 TileLayout 和“columns”方向。这里有两个相同的应用程序截图,根据屏幕方向使用两种不同的布局。

SC20101214-080956-175x300.png SC20101214-081008-300x175.png

左边是纵向模式,右边是横向模式。为了检测用户何时旋转屏幕,我侦听视图上的 ResizeEvent…我不确定这是最好的处理方式…但它有效 :)

protected function checkOrientation():void{
				if(navigator.landscapeOrientation == true){
					currentState = "landScapeView";
				}else{
					currentState = "portrait";
				}
			}
 
			protected function onResizeView(event:ResizeEvent):void
			{
				checkOrientation();
			}

然后只需声明应用程序的状态以及与这些状态相关联的布局。

<s:states>
		<s:State name="portrait"/>
		<s:State name="landScapeView"/>
	</s:states>
	<s:List width="100%"  height="100%" dataProvider="{myData}" 
             itemRenderer="views.mySecondIR">
		<s:layout.portrait>
			<s:TileLayout orientation="rows"/>
		</s:layout.portrait>
		<s:layout.landScapeView>
			<s:TileLayout orientation="columns"/>
		</s:layout.landScapeView>
	</s:List>

技巧 #6:使用自定义布局

我尝试使用我的自定义 coverflow 布局,并且我对它在我的 Android 设备上的良好性能感到非常惊讶。查看视频了解它是如何工作的。

SC20101214-083949-300x175.png

技巧 #7:您的技巧

现在我需要您的技巧 ;) 如果您发现了能改善 Flex 移动用户体验的好技巧,请发表评论或链接到您的博客文章。

© . All rights reserved.