`
ldi543lc
  • 浏览: 12480 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Flash CS5 用户自定义Button组件

 
阅读更多

Flash CS5 用户自定义Button组件
2010年12月24日
  2010/12/24 Flash CS5 用户自定义Button Compoennts
  今天是周五,圣诞前夕,明天是圣诞,所以就没有时间完善了。趁现在又时间,赶紧把自己制作的AS3为基础FlashCS5自定义Button组件讲解一下。
  这个不是采用swz制作方法,而是完全使用代码控制,以制作皮肤为例。最后再在button上面增加一个Label文言显示。
  分为两大步:
  一画面制作
  1.组件画面配置
  2.Skin制作
  二code
  1.Button组件的类
  2.SKin选择的类
  另外写一个Bat文件方便copy组件到Adobe的组件目录下:
  文件名:D:\JavaDevSpace\WorkSpace\FlashToFlash\CreateCompo net.bat
  内容:
  @echo off
  :: ************ SET FILENAME *********************
  SET CURPATH="D:\JavaDevSpace\WorkSpace\FlashToFlash\
  SET fileName=HmiComponent.fla"
  SET TARPATH="C:\Documents and Settings\xuyeding\Local Settings\Application Data\Adobe\Flash CS5\en_US\Configuration\Components\"
  COPY /Y %CURPATH%%fileName% %TARPATH%
  可以看到所以工作目录都是在D:\JavaDevSpace\WorkSpace\FlashToFlash\目录下。
  下面开始制作了。
  一:画面制作
  1.在工作目录下,新建一个HmiComponent.fla文件,上面可以看到。stage属性默认就可以,下面不会用到这些的。
  2.Ctrl + F8新建一个Symbol,Name:UserLabelButton  ,Type:MovieClip。Class:lane.hmi.components.btn.UserLabelButton
  这个是下面主要的Code。
  
  3.对刚才的UserLabelButton的MC进行编辑:右击->Component difine设置如下:
  
  skinFileName是这次制作的讲解例子,所以大家可以只追加skinFileName一栏。
  至此,组件制作完成了,close CS5 执行Bat文件把这个目录下的HmiComponent.fla copy到C:\Documents and Settings\xuyeding\Local Settings\Application Data\Adobe\Flash CS5\en_US\Configuration\Components\下。
  下面制作skin:
  工作目录:D:\JavaDevSpace\WorkSpace\FlashToFlash\下skin目录为:Design\Skin\下新建Btn_Common.fla
  1.打开Btn_Common.fla
  制作四个MC:如图
  
  分别再制作另外三个MC,最终如下图:
  
  四个Class分别为:Sel,Nml,Dis,Act
  保存,生成swf文件。
  至此所以得画面制作就都完成了,很简单吧。下面开始code
  /*------------------------------------------------ --------------*/
  二:code部分
  目录如下:
  
  选择部分为我这次用到的src。
  /* ------------------------------------------ */
  SWFClassLibraryEvent.as
  /************************************************* *****************************
  * @file        SWFClassLibraryEvent.as
  * @brief        SWFClassLibraryEvent
  * @note        Copyright (C) 2009 ThinkinGall PERSONAL. All rights reserved.
  * @author        SHSC Xuyeding
  * @date        2009/12/20
  * @version        1.00
  ************************************************** *****************************/
  package lane.hmi.manager {
  import flash.events.Event;
  public class SWFClassLibraryEvent extends Event {
  /** class is finish loaded */
  public static const CLASS_LOADED:String = "classLoaded";
  /** clas load error */
  public static const LOAD_ERROR:String = "loadError";
  /**
  * Construcotr
  * @param    type
  */
  public function SWFClassLibraryEvent(type:String){
  super(type);
  }
  /**
  * clone
  * @param    none
  * @return    none
  */
  public override function clone():Event {
  return new SWFClassLibraryEvent(type);
  }
  /**
  * to string
  * @param    none
  * @return    none
  */
  public override function toString():String {
  return formatToString("SWFClassLibraryEvent", "type", "bubbles", "cancelable", "eventPhase");
  }
  }
  }
  /* ------------------------------------------ */
  SWFClassLibrary.as
  /************************************************* *****************************
  * @file        SWFClassLibrary.as
  * @brief        SWFClassLibrary
  * @note        Copyright (C) 2009 ThinkinGall PERSONAL. All rights reserved.
  * @author        SHSC Xuyeding
  * @date        2009/12/20
  * @version        1.00
  ************************************************** *****************************/
  package lane.hmi.manager {
  import flash.display.DisplayObject;
  import flash.display.DisplayObjectContainer;
  import flash.display.Loader;
  import flash.display.MovieClip;
  import flash.events.Event;
  import flash.events.EventDispatcher;
  import flash.events.IOErrorEvent;
  import flash.events.SecurityErrorEvent;
  import flash.net.URLRequest;
  import flash.system.System;
  import lane.hmi.utils.DebugLog;
  /**
  *    SWFClassLibrary
  *    @class    SWFClassLibrary
  */
  public class SWFClassLibrary extends EventDispatcher {
  /** self instance container*/
  private static var mySelf:Object = new Object();
  /** swf file name */
  private var _swfFileName:String = null;
  /** loader instance */
  private var loader:Loader = null;
  /** count */
  private var usedCounter:int = 1;
  /** class initialize status */
  public var initStatus:int = INIT_STATE_NONE;
  public static const INIT_STATE_NONE:int = 0;
  public static const INIT_STATE_PROCESSING = 1;
  public static const INIT_STATE_FINISH:int = 2;
  public static const INIT_STATE_ERROR:int = -1;
  /**
  * Constructor
  * @param    swfFileName:index id
  */
  public function SWFClassLibrary(swfFileName:String) {
  _swfFileName = swfFileName;
  mySelf[swfFileName] = this;
  }
  /**
  * get instance from object container
  * @param    swfFileName:index id
  * @return    SWFClassLibrary instance
  */
  public static function getInstance(swfFileName:String):SWFClassLibrary {
  /* if exists get instance*/
  if (mySelf.hasOwnProperty(swfFileName)) {
  SWFClassLibrary(mySelf[swfFileName]).usedCounter++ ;
  return mySelf[swfFileName];
  }
  /* not exist new instance */
  else {
  return new SWFClassLibrary(swfFileName);
  }
  }
  /**
  * initialize
  * @param    none
  * @return    none
  */
  public function initialize():void {
  /* not none */
  if (initStatus != INIT_STATE_NONE) {
  return;
  }
  /* set processing status */
  initStatus = INIT_STATE_PROCESSING;
  /* load file path */
  var urlReq:URLRequest = new URLRequest(_swfFileName);
  loader = new Loader();
  /* add listener */
  loader.contentLoaderInfo.addEventListener(Event.IN IT, initHandler, false, 0, true);
  loader.contentLoaderInfo.addEventListener(IOErrorE vent.IO_ERROR, ioErrorHandler, false, 0, true);
  loader.contentLoaderInfo.addEventListener(Security ErrorEvent.SECURITY_ERROR, securityErrorHandler, false, 0, true);
  //var loaderContext:LoaderContext = new LoaderContext();
  loader.load(urlReq);
  //DebugLog.printTrace(loader.contentLoaderInfo.loa derURL);
  }
  /*--------------event handler------------------*/
  /**
  * initialize finish handler
  * @param    event
  * @return    none
  */
  private function initHandler(event:Event):void {
  initStatus = INIT_STATE_FINISH;
  if (loader.content is DisplayObjectContainer) {
  /* time line class */
  var mainTimeLine:DisplayObjectContainer = DisplayObjectContainer(loader.content);
  /* stop all mc */
  for (var i:int = 0; i error handler
  * @param    event
  * @return    none
  */
  private function ioErrorHandler(event:IOErrorEvent):void {
  initStatus = INIT_STATE_ERROR;
  dispatchEvent(new SWFClassLibraryEvent(SWFClassLibraryEvent.LOAD_ERR OR));
  //DebugLog.printTrace(_swfFileName + " class loaded error");
  }
  /**
  * security error handler
  * @param    event
  * @return    none
  */
  private function securityErrorHandler(event:IOErrorEvent):void {
  initStatus = INIT_STATE_ERROR;
  dispatchEvent(new SWFClassLibraryEvent(SWFClassLibraryEvent.LOAD_ERR OR));
  //DebugLog.printTrace(_swfFileName + " class loaded error");
  }
  /*--------------method------------------*/
  /**
  * get class from swf file name
  * @param    className
  * @return    Class instance
  */
  public function getClass(className:String):Class {
  if (initStatus != INIT_STATE_FINISH) {
  return null;
  }
  try {
  return loader.contentLoaderInfo.applicationDomain.getDefi nition(className) as Class;
  }catch (e:ReferenceError) {
  DebugLog.printFatal(className + " definition not found in " + _swfFileName);
  return null;
  }
  return null;
  }
  /**
  * check if have the defined class
  * @param    className
  * @return    have true;else false
  */
  public function hasClass(className:String):Boolean {
  if (initStatus != INIT_STATE_FINISH) {
  return false;
  }
  return loader.contentLoaderInfo.applicationDomain.hasDefi nition(className);
  }
  /**
  * delete instance
  * @param    event
  * @return    none
  */
  public function deleteInstance():void {
  if (usedCounter-- error
  * @param    event
  * @return    none
  */
  private function skinLoadErrorHandler(event:SWFClassLibraryEvent):v oid {
  /* remove listener */
  btnSkinLibrary.removeEventListener(SWFClassLibrary Event.CLASS_LOADED, skinLoadFinishHandler);
  btnSkinLibrary.removeEventListener(SWFClassLibrary Event.LOAD_ERROR, skinLoadErrorHandler);
  DebugLog.printFatal(event.toString());
  }
  /*----------------setter getter------------------*/
  /** button skin path */
  private var _skinFileName:String = null;
  [Inspectable(category="General",type="String")]
  public function get skinFileName():String {
  return _skinFileName;
  }
  public function set skinFileName(value:String):void {
  if ((value == null) || (value == "")){
  return;
  }
  if (buttonSkin != null){
  removeChild(buttonSkin);
  buttonSkin = null;
  _skinFileName = null;
  btnSkinSelector = null;
  }
  _skinFileName = pathTokenConvert(value);
  /* skin clear */
  if (btnSkinLibrary != null){
  btnSkinLibrary.removeEventListener(SWFClassLibrary Event.CLASS_LOADED, skinLoadFinishHandler);
  btnSkinLibrary.removeEventListener(SWFClassLibrary Event.LOAD_ERROR, skinLoadErrorHandler);
  btnSkinLibrary = null;
  }
  /* skin class loader */
  btnSkinLibrary = SWFClassLibrary.getInstance(_skinFileName); // "Design/Skin/Btn_Common.swf");
  btnSkinLibrary.addEventListener(SWFClassLibraryEve nt.CLASS_LOADED, skinLoadFinishHandler, false, 0, true);
  btnSkinLibrary.addEventListener(SWFClassLibraryEve nt.LOAD_ERROR, skinLoadErrorHandler, false, 0, true);
  btnSkinLibrary.initialize();
  /* load finish */
  if (btnSkinLibrary.initStatus == SWFClassLibrary.INIT_STATE_FINISH){
  /* update button status */
  updateButtonStatus();
  }  /* load error,add listener */else {
  btnSkinLibrary.addEventListener(SWFClassLibraryEve nt.CLASS_LOADED, skinLoadFinishHandler, false, 0, true);
  btnSkinLibrary.addEventListener(SWFClassLibraryEve nt.LOAD_ERROR, skinLoadErrorHandler, false, 0, true);
  btnSkinLibrary.initialize();
  }
  }
  /** button reactive status */
  private var _buttonReactStatus:Boolean = false;
  [Inspectable]
  public function get buttonReactStatus():Boolean {
  return _buttonReactStatus;
  }
  public function set buttonReactStatus(value:Boolean):void {
  _buttonReactStatus = value;
  updateButtonStatus();
  return;
  }
  /** button selected status */
  private var _buttonSelectedStatus:Boolean = false;
  [Inspectable]
  public function get buttonSelectedStatus():Boolean {
  return _buttonSelectedStatus;
  }
  public function set buttonSelectedStatus(value:Boolean):void {
  _buttonSelectedStatus = value;
  updateButtonStatus();
  return;
  }
  /** button disable status */
  private var _buttonDisableStatus:Boolean = false;
  [Inspectable]
  public function get buttonDisableStatus():Boolean {
  return _buttonDisableStatus;
  }
  public function set buttonDisableStatus(value:Boolean):void {
  _buttonDisableStatus = value;
  updateButtonStatus();
  return;
  }
  /** get button label */
  public function get label():String {
  return labelTextField.text;
  }
  /** set button label */
  public function set label(value:String):void {
  labelTextField.text = value;
  return;
  }
  }
  }
  /************************************************* *****************************
  * @file        ButtonSkinSelector.as
  * @brief        ButtonSkinSelector
  * @note        Copyright (C) 2009 ThinkinGall PERSONAL. All rights reserved.
  * @author        SHSC Xuyeding
  * @date        2009/12/13
  * @version        1.00
  ************************************************** *****************************/
  import lane.hmi.manager.SWFClassLibrary;
  /**
  *    ButtonSkinSelector
  *    @class    ButtonSkinSelector
  */
  internal class ButtonSkinSelector {
  /** button status:normal */
  public static const BUTTON_NORMAL:String = "Nml";
  /** button status:reactive */
  public static const BUTTON_REACT:String = "Act";
  /** button status:selected */
  public static const BUTTON_SELECTED:String = "Sel";
  /** button status:disable */
  public static const BUTTON_DISABLED:String = "Dis";
  [ArrayElementType("String")]
  private static var arrSkinStatus:Array = [BUTTON_NORMAL, BUTTON_DISABLED, BUTTON_SELECTED, BUTTON_SELECTED + BUTTON_DISABLED, BUTTON_REACT, BUTTON_REACT + BUTTON_DISABLED, BUTTON_REACT + BUTTON_SELECTED, BUTTON_REACT + BUTTON_SELECTED + BUTTON_DISABLED,];
  /**
  * Constructor
  * @param    swfClassLib
  */
  public function ButtonSkinSelector(swfClassLib:SWFClassLibrary){
  createSkinStatus(swfClassLib);
  }
  /**
  * index of button skin : normal,reactive,selected,disable...
  * @param    act
  * @param    sel
  * @param    dis
  * @return    (100)2:active,(110)2:active + selected,(001)2:disable
  */
  public function skinIndexOf(act:Boolean, sel:Boolean, dis:Boolean):int {
  return (act == true ? 1 : 0)  1 normal */
  index = skinIndexOf(false, false, false);
  if (swfClassLib.hasClass(arrSkinStatus[index]) == false){
  arrSkinStatus[index] = BUTTON_NORMAL;
  }
  /* disable 001 => 1 disable */
  index = skinIndexOf(false, false, true);
  if (swfClassLib.hasClass(arrSkinStatus[index]) == false){
  arrSkinStatus[index] = BUTTON_DISABLED;
  }
  /* selected 010 => 2 selected */
  index = skinIndexOf(false, true, false);
  if (swfClassLib.hasClass(arrSkinStatus[index]) == false){
  arrSkinStatus[index] = BUTTON_SELECTED;
  }
  /* selected,disable 011 => 3 disable */
  index = skinIndexOf(false, true, true);
  if (swfClassLib.hasClass(arrSkinStatus[index]) == false){
  arrSkinStatus[index] = BUTTON_DISABLED;
  }
  /* active 100 => 4 active */
  index = skinIndexOf(true, false, false);
  if (swfClassLib.hasClass(arrSkinStatus[index]) == false){
  arrSkinStatus[index] = BUTTON_REACT;
  }
  /* active,disable 101 => 5 disable */
  index = skinIndexOf(true, false, true);
  if (swfClassLib.hasClass(arrSkinStatus[index]) == false){
  arrSkinStatus[index] = BUTTON_DISABLED;
  }
  /* active,selected 110 => 6 selected */
  index = skinIndexOf(true, true, false);
  if (swfClassLib.hasClass(arrSkinStatus[index]) == false){
  arrSkinStatus[index] = BUTTON_SELECTED;
  }
  /* active,selected,disable 111 => 7 disable */
  index = skinIndexOf(true, true, true);
  if (swfClassLib.hasClass(arrSkinStatus[index]) == false){
  arrSkinStatus[index] = BUTTON_DISABLED;
  }
  }
  /**
  * get skin class name from defined array
  * @param    index
  * @return    skin class name
  */
  public function getSkinClassName(index:int):String {
  return arrSkinStatus[index];
  }
  }
  至此code部分也完成了。
  /* ------------------------------------------ */
  下面可以测试了。
  注意:
  1.关于[Inspectable(defaultValue = "Design/Skin/Btn_Common.swf")]的使用前提是在property define 对话框中Class的设置正确,包括命名空间,这样,后台的Source的只要是定义了Inspectable的标签都会自动设置上去。
  2.Inspectable不可以放置在属性定义头,而是放在Settergetter地方,这样才能自动找到变量名统一。
  还是有个问题:如果所得属性都设置了,组件拉到Stage上,不改变属性的值,这样所有属性就不会再次执行了。导致属性值就获取不到了。奇怪。每次都手工设置属性随便改变一下属性panel的值就可以了。
分享到:
评论

相关推荐

    flash cs5汉化包

    Adobe Flash CS5是一款深受用户喜爱的动画和交互式内容创作软件,主要用于开发网络上的富媒体应用、动画、游戏以及移动应用程序。尽管它在全球范围内广泛使用,但对于中文用户来说,原版的Flash CS5是英文界面,这给...

    FLASH CS5中文帮助文档

    《FLASH CS5中文帮助文档》是一份专为学习和使用Adobe Flash CS5的用户精心编纂的资源,旨在提供全面、详尽的中文指导,帮助用户深入理解和掌握这款强大的动画与交互式内容创作工具。这份文档包含了各种关键概念、...

    flash cs5安装及帮助文件

    "flash_cs5_help.pdf"则是Flash CS5的官方帮助文档,它以PDF格式提供,方便用户打印或在不同设备上阅读。这份文档详细介绍了Flash CS5的新特性、工作流程和API接口,特别强调了AS3.0的使用,这对于开发者来说极其...

    flash_cs5_extending.pdf

    Flash CS5是一款强大的交互式内容创作工具,其扩展功能允许开发者通过JavaScript语言来编程Flash插件,从而实现更丰富的交互性和自定义功能。JavaScript API为开发者提供了与Flash Professional CS5和CS5.5深度集成...

    flash CS5 自学手册

    此外,Flash CS5还具有强大的组件库,包括按钮、影片剪辑和其他交互元素,手册将详细介绍如何使用和自定义这些组件,以提高工作效率。 总的来说,《Flash CS5 自学手册》不仅适合初学者,也适合有一定基础的学习者...

    Adobe创意大学flash cs5配套PPT

    Adobe创意大学的Flash CS5配套PPT是一套深入学习Flash Professional CS5的教育资源,它涵盖了从基础到高级的多个主题,旨在帮助用户掌握这个强大的动画和交互式内容创作工具。Flash CS5是Adobe Creative Suite 5...

    Flash CS5制作网站动画

    《使用Flash CS5制作网站动画》 Flash CS5是一款强大的动画制作软件,尤其适用于创作吸引人的网站动画。它集成了许多新功能,使得动画的制作更为逼真,尤其是对于连贯性和三维效果的呈现。本章节将深入探讨Flash ...

    Flash CS5素材.zip

    Flash CS5动画设计与制作实例教程中的案列。有素材,效果。 章节如下: 第1章 VI设计 第2章 动画设计 第3章 电子相册 第4章 广告设计 第5章 MTV制作 第6章 电子阅读物 第7章 动画片 第8章 游戏制作 第9章 网站应用 ...

    FLASH CS5动画制作完全自学手册.pdf

    综上所述,一本关于FLASH CS5动画制作的完全自学手册应该覆盖了从基本操作界面到高级编程功能的各个方面,为用户搭建起一个全面了解和掌握FLASH CS5的平台。由于没有具体的文档内容,以上知识点是基于FLASH CS5软件...

    adobe创意大学flash cs5配套素材

    这套素材旨在帮助用户深入理解和掌握Flash CS5的各个功能,提升创作技能。 首先,让我们来探讨Flash CS5的核心特性。Flash CS5引入了许多创新功能,包括改进的骨骼动画系统、高级文本引擎(称为“排版引擎”)、更...

    Flash CS5动画制作技术.pdf

    根据提供的文件信息,我们可以从《Flash CS5动画制作技术》这一主题出发,深入探讨与Flash动画制作相关的几个关键知识点。 ### Flash CS5简介 Adobe Flash CS5是Adobe Systems开发的一款功能强大的矢量图形编辑和...

    flash cs5 help中文帮助文件

    flash cs5 help中文帮助文件

    flex 和 flash cs5集合的mp3播放器

    flex 和 flash cs5集合的mp3播放器

    Android Flash Cs5 开发

    Flash CS5是Adobe Creative Suite 5中的一个组件,主要用于创建互动内容、动画、游戏和网络应用程序。它的强大功能在于支持ActionScript 3.0编程语言,使得开发者可以构建复杂的应用程序并提供丰富的用户界面。 **2...

    flash cs5 官方教程

    在Adobe Flash CS5这款多媒体创作软件中,官方教程对图层的管理和使用提供了非常详细的指导。图层是Flash CS5中用来组织和安排场景内容的重要工具,每一个场景都可以包含任意数量的时间轴图层,利用图层和图层文件夹...

    Flash_CS5按钮制作

    Flash CS5是一款由Adobe公司开发的强大的动画制作软件,广泛应用于网页动画、广告展示、游戏制作等领域。在Flash CS5中制作按钮是创建交互式动画的基础。本章将详细介绍Flash CS5中按钮的制作方法与技巧。 首先,...

    中文版Flash_CS5基础培训教程(word文字版1)

    - **组件应用**:了解预置组件,如按钮、滚动条,学会自定义组件。 - **行为使用**:掌握行为面板,实现动画的自动播放、暂停等功能。 #### 10. 商业案例实训 - **设计思维**:培养创新思维,理解商业动画的设计...

Global site tag (gtag.js) - Google Analytics