Android开发入门之从环境搭建到HelloWorld

这两天开始学Android开发,今天折腾了一天总算完成了Android的HelloWorld,并且在Android模拟器顺利启动。只可恨网速实在不给力,一直徘徊在几K到几十K之间。 一、环境搭建 通过AIR For Android来开发Android应用,现在比较成熟完整的开发环境有两种: 1.Flash builder4.5。FB4.5在新建项目的时候增加了两个类型Flex手机项目和ActionScript手机项目,手机项目同时支持Android和iPhone。 2.Flash CS5.5。在FlashCS5.5中已经支持新建Android项目。 当然之前还有Flashbuilder4.0或者FlashCS5配上插件开发之类的,相信FB4.5和FlashCS5.5出来以后,那些过渡期的插件都要被逐渐淘汰了。   除了开发环境还需要用下载AndroidSDK,安装Android模拟器,我选择的是Android2.2版的,也是从这个版本之后,Android才支持AIR2.5的。当然如果你自己有Android手机就再好不过了,模拟器有些功能是没法模拟的,而且速度比较慢,尤其是开机的时候。 Android 2.2 SDK 正式版下载地址(居然被和谐,官方网站需要翻墙):  http://developer.android.com/sdk/android-2.2.html 还有个 google的地址:http://dl.google.com/android/android-sdk\_r10-windows.zip 安装过程,网上很多图文教程,我就不多说了,只要网速够给力,神马都是浮云。 二、实例制作 实例我是用FlashCS5.5制作的,直接新建Android项目即可,在发布的时候可以直接生成Android的安装包apk格式。 说下我遇见的几个问题: 1.发布的时候要注意两个选项,在Android的部署类型上一个是设备发行,一个模拟器发行,要根据自己的测试环境发布相应的格式。 2.如果是用Flash Builder开发的话,也可以用命令行来打包生成apk文件,打包命令如: adt -package -target apk-emulator -storetype pkcs12 -keystore android.p12 Test.apk Test-app.xml Test.swf 3.可以给你的Android模拟器建立个快捷方式,但是直接启动AndroidSDK/tools下的emulator.exe是不行的,在桌面快捷方式的属性/目标那一栏后面加上 @2.2,其中2.2是新建模拟器时的名字,如此就可以启动Android模拟器,当然通过命令行也可以。 暂时就写这么多,这次的没有实例代码,有兴趣的朋友自己找找下载地址安装下软件配置下环境,欢迎留言讨论!

AIR最小化系统托盘

这是一个简单AIR应用HelloWorld,功能描述如下: 1.窗体上可以通过最小化,正常化和最大化,并退出系统。 2.在窗体上按下鼠标可以拖动。 3.能够生成系统的托盘图标,托盘图标目前设置了两个菜单项目,一个是指向本站,还有一个是退出系统。 运行效果如下:     安装包如下:[download id=”12”],可以下载该exe安装包,安装好显示运行效果。   部分重点源码如下: [codesyntax lang=”actionscript3”]

public function createIcon():void
{
NativeApplication.nativeApplication.autoExit = false;

var iconMenu:NativeMenu = new NativeMenu();
var urlCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem(“sqstudio.com”));
urlCommand.addEventListener(Event.SELECT, function(event:Event):void
{
navigateToURL(new URLRequest(“http://www.sqstudio.com"));
}
);
var exitCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem(“退出系统”));
exitCommand.addEventListener(Event.SELECT, function(event:Event):void
{
NativeApplication.nativeApplication.icon.bitmaps = [];
NativeApplication.nativeApplication.exit();
}
);

if (NativeApplication.supportsSystemTrayIcon)
{
NativeApplication.nativeApplication.autoExit = false;
var icon:Loader = new Loader();
icon.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event):void{
NativeApplication.nativeApplication.icon.bitmaps=[e.target.content.bitmapData];

});
icon.load(new URLRequest(“/ico/tubiao1.png”));
var systray:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
systray.tooltip = “AIR-by SQStudio.com”;
systray.menu = iconMenu;
systray.addEventListener(MouseEvent.CLICK,geneCKHandler);
}
}

[/codesyntax]   源码下载:[download id=”13”]  (用Flash CS5 打开)

Air拖拽操作之拖入拖出

最近在做一款AIR的播放器,在做到播放列表部分,就想到用AIR的拖拽操作,特意关注了一下Air拖拽操作的一些文章。 //———————文字描述不擅长,以下借用RIAMeeting的一篇文章的部分描述———————— 我们可以把整个拖拽的过程分为三个阶段:启动,拖动和放下。

  1. 启动:用户通过按住鼠标按键从组件或组件中的项目进行拖动,启动拖放操作。涉及的事件包括nativeDragStart 和nativeDragComplete。启动方式是调取NativeDragManager.doDrag(),这个方法调取后,会启动拖拽的过程。
  2. 拖动:用户在按住鼠标按键的同时,将鼠标光标移至其他组件、应用程序,或移至桌面。涉及的事件包括nativeDragUpdate,nativeDragEnter,nativeDragOver,nativeDragExit。其中nativeDragEnter事件会被我们用于检测数据格式,以决定是否允许接受该数据格式。如果格式合法,我们可以调用NativeDragManager.acceptDragDrop()方法,允许该数据在组件上放下。这个时候屏幕上光标的形状会有所变化。
  3. 放下:用户在符合条件的放置目标上释放鼠标。如果是在AIR应用内部放下,涉及的事件包括nativeDragDrop,我们可以捕获这个事件,来获取剪切板中的数据,如果放下的区域在AIR外部,那么将会由操作系统来确定如何处理该操作。

下图描述了NativeDragEvent的各种类型,不同颜色代表这是由不同的对象调度的。 AIR还提供了一个ClipboardFormats类,定义了各种不同的剪切板描述格式,参见下图(这是AIR1.5的版本,在AIR2中增加了一个新的格式,稍后叙述): 按照数据的来源和去处,我们可以将拖拽分为两种类别:拖出和拖入。 //———————  End    ———————— 借用部分AIRMeeting的图片,AIR的拖拽还是侦听好几个事件就可以了如nativeDragEnter,nativeDragOver等,感觉事件还是有点少,不太够用。 下面是我做的一个小实例,不多少,直接上图,上代码! 实例的效果是 ,拖拽一张jpg或png位图到AIR上,Air会自动显示该图片,同时将桌面上的图片删除至垃圾桶,然后再从AIR上拖出该图片,该图片就会重新生成在桌面上。 局部DragIn类的代码: [codesyntax lang=”actionscript3”]

private function onDragIn(event:NativeDragEvent):void{
var transferable:Clipboard = event.clipboard;
if(transferable.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)){
var files:Array = transferable.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
for each(var file:File in files){
if(file.extension ==”jpg” file.extension ==”png” ){
NativeDragManager.acceptDragDrop(sp);
break;
}
}
} else {
trace(“格式不对,仅接受jpg”);
}
}
public var file:File;
private function onDrop(event:NativeDragEvent):void{
var dropfiles:Array= event.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
file = dropfiles[0];
trace(file.url);
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,picComHandler);
loader.load(new URLRequest(file.url));
}
private function picComHandler(e:Event):void{
var img:Bitmap = (e.currentTarget as LoaderInfo).content as Bitmap;
sp.addChild(img);
file.moveToTrash();
removeListener();
DragOut.getInstance().addListener();
}

[/codesyntax] 局部DragOut代码: [codesyntax lang=”actionscript3”]

private function downHandler(e:MouseEvent):void{
var bmp:Bitmap = sp.getChildAt(0) as Bitmap;
var jpg:JPEGEncoder = new JPEGEncoder();
ba = jpg.encode(bmp.bitmapData);
file = DragIn.getInstance().file;
var transferObject:Clipboard = createClipboard(bmp);
NativeDragManager.doDrag(sp, transferObject, bmp.bitmapData, new Point(-mouseX,-mouseY));
sp.addEventListener(NativeDragEvent.NATIVE_DRAG_START,startHandler);
sp.addEventListener(NativeDragEvent.NATIVE_DRAG_COMPLETE,comHandler);
}
private function startHandler(e:NativeDragEvent):void{
trace(“开始拖拽”);
}
private var file:File;
/**
*拖拽完成
* @param e
*
*/
private function comHandler(e:NativeDragEvent):void{

var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.WRITE);
fileStream.writeBytes(ba,0,ba.length);
fileStream.close();

sp.removeChildAt(0);
sp.removeEventListener(MouseEvent.MOUSE_DOWN,downHandler);
DragIn.getInstance().init();
}
public function createClipboard(image:Bitmap):Clipboard {
var transfer:Clipboard = new Clipboard();
transfer.setData(“bitmap”, image, true);
transfer.setData(ClipboardFormats.BITMAP_FORMAT, image.bitmapData, false);
transfer.setData(ClipboardFormats.FILE_LIST_FORMAT,new Array(file),false);
return transfer;
}

[/codesyntax] 源码下载:[download id=”11” format=”1”] 本次实例的代码写的有点混乱,看不懂的留言哈,重点代码已经列出!这个拖拽的功能应用很广,比如做列表的动态管理,做文件上传等等凡是涉及到文件列表方面的貌似都可以用,期待你的作品哈! 扩展阅读:http://www.riameeting.com/node/486/

AS3右键菜单简析

Flash里的按钮(Button)、影片剪辑(MoiveClip)和文本(TextFiled)都有右键菜单的属性ContentMenu,我们可以新建一个ContextMenu变量来改变右键菜单,然后每个对每个菜单项ContextMenuItem侦听其选中事件(MENU_ITEM_SELECT),来进行响应的操作。 这篇文章只是右键菜单的基本应用知识,比较简单,更加详尽完善的右键菜单可以参照这几个类ContextMenu、ContextMenuBuiltInItems、ContextMenuClipboardItems、ContextMenuEvent和ContextMenuItem。灵活运用这些类的方法属性就可以做出自己需要的右键菜单了。

在上面的swf上点击右键 即可看到效果

局部重点代码: [codesyntax lang=”actionscript3”]

private var myContextMenu:ContextMenu;
private var menuLabel:String = “斯樵工坊(SQStudio.com)”;
private var label:TextField;

public function RightClick() {
myContextMenu = new ContextMenu();
myContextMenu.hideBuiltInItems();
addCustomMenuItems();
this.contextMenu = myContextMenu;
}
/**
*增加菜单项
*
*/
private function addCustomMenuItems():void {
//ContextMenuItem 的参数说明这个看下api文档,第一个参数是名字,第二个是这个菜单项上面要不要显示一个分隔线,
// 第三个参数 就是是否可用,不可用则为灰色 ,第四个参数是否可见

var item1:ContextMenuItem = new ContextMenuItem(menuLabel);
myContextMenu.customItems.push(item1);
item1.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItem1SelectHandler);

var item2:ContextMenuItem = new ContextMenuItem(“QQ聊天”);
myContextMenu.customItems.push(item2);
item2.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItem2SelectHandler);

var item3:ContextMenuItem = new ContextMenuItem(“by 斯樵/Nestor”,true,false);
myContextMenu.customItems.push(item3);

}
/**
*菜单项1的响应事件,即跳转到我博客斯樵工坊
* @param e
*
*/
private function menuItem1SelectHandler(e:ContextMenuEvent):void{
var rqs:URLRequest = new URLRequest(“http://www.sqstudio.com");
navigateToURL(rqs,”_blank”);
}
/**
*菜单项1的响应事件,即和我用QQ即时聊天,如果我在线的话
* @param e
*
*/
private function menuItem2SelectHandler(e:ContextMenuEvent):void{
//*** url我做了修改 ,即123456789,你可以改成自己的QQ号
var rqs:URLRequest = new URLRequest(“http://wpa.qq.com/msgrd?v=3&uin=123456789&site=qq&menu=yes");
navigateToURL(rqs,”_blank”);
}

[/codesyntax] 源码下载: [download id=”10” format=”3”]

FLV—Player视频播放器

功能说明:

1.实现了视频播放、暂停,全屏,显示网站logo,调用广告等常用功能,广告会在暂停时显示,可以手动关闭。

2.单击视频 实现播放和暂停的切换,双击视频实现全屏模式和正常模式的切换,全屏模式下,工具条会在自动隐藏。

3.音量控制,默认0.5,通过拖动滑块和点击音量条两种方式改变音量,直接点击声音按钮实现正常声音和静音的切换。

4.进度条控制,缓冲完成的部分,有时间提示,通过拖动滑块和点击进度条两中方式改变播放的进度。

5.加载预留5秒钟播放长度,即缓冲区数据不足时,自动暂停播放,并开始加载视频流,加载完成足够播放5秒的数据流,自动开始继续播放。

欢迎留言,技术交流,右边栏有我的QQ和微博!

源码暂时还不能提供,但是可以交流下开发的思路,以及遇见的问题!

斯樵-Nestor