随着移动设备和移动应用的普及,用户对应用的体验要求越来越高。Flex框架以其强大的功能和灵活性,成为开发移动应用的热门选择。本文将介绍一些实用的技巧,帮助提升Flex移动应用的用户体验。
对于从Flash转向Android开发的开发者来说,一个常见的误解是认为退出应用程序(例如按下Home键)会停止应用。实际上,应用仍在后台运行。需要意识到这一默认行为,并对其进行控制。
例如,AIR 2.5引入的Geolocation API可以实时返回位置坐标。在Android上,它直接利用操作系统的GPS API,这会消耗大量资源。以下是一个示例代码,展示了如何使用Geolocation API获取位置并显示纬度:
<?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触发时再次激活它。这为提供了前所未有的自由度和控制权。
这是由于新的MobileApplication架构导致的另一个常见错误。当需要从互联网下载数据时,不要在视图中调用服务。如果这样做,每次返回视图时都会发起一个无用的请求。更新主应用程序文件,以便在creationComplete事件中调用服务,并在结果事件中推送视图。
移除MobileApplication标签中的firstView参数,并在creationComplete事件中调用服务。当接收到resultEvent时,推送第一个视图,并将event.result对象作为ArrayCollection传递。
protected function operation1():void {
Operation1Result.token = speakersDevoxx.Operation1();
}
protected function mobileapplication1_creationCompleteHandler(event:FlexEvent):void {
operation1();
}
protected function Operation1Result_resultHandler(event:ResultEvent):void {
navigator.pushView(views.tip2devoxxHome, event.result as ArrayCollection);
}
可以查看视频,了解如何使用Flash Builder 4的数据向导在5分钟内构建一个连接到DEVOXX REST服务的应用。一旦数据加载完成,它将在视图之间持久保存。在示例中,获取了演讲者列表并将其存储在Array Collection中。当想显示有关演讲者的详细信息时,只需推送一个新视图,传递list.selectedItem对象。
使用移动项目渲染器可以获得最佳的滚动列表性能。不要忘记,还可以在List中使用labelFunction参数,而不是经典的labelField。一个典型的用例是当想在列表中显示用户的全名。例如,如果只从服务中接收到名字和姓氏,那么使用这个简单的技巧。
<fx:Script>
<![CDATA[
public function myFullName(obj:Object):String {
return (obj.lastName + " " + obj.firstName);
}
protected function list1_clickHandler(event:MouseEvent):void {
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>
这样,就可以在列表中显示用户的全名。
AIR应用程序总是需要一秒钟才能启动。FlexHero框架在当前的Preloader类中添加了一个调整,以在经典的加载体验之前显示一张图片。始终在主MobileApplication标签中声明一个启动屏幕(只是一个静态图像),以改善用户体验。用一张图片欢迎用户总是比黑色背景更好。
<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">
这样,应用程序在启动时会显示一个启动屏幕,而不是黑色背景。
是Flex 4自定义布局的忠实粉丝。可以通过监听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>
这样,就可以根据屏幕方向更改列表的布局。
尝试使用自定义的coverflow布局,结果对Android设备的性能感到惊讶。可以查看视频,了解它是如何工作的。