Flex4 自定义通用的ImageButton
Flex4与之前版本的一个极大区别就是外观皮肤的分离,虽然进一步解耦,但存在一个不爽的地方就是增加了编码的工作量,你能想象为你的每个自定义组件都写一个对应的皮肤吗?可能仅仅和你之前写过的组件差了那么一点点而已,可是工作量double,更进一步使代码的管理复杂化。
下面是我自己写的一个通用的自定义ImageButton,有呆毛(Demo)才有真相:
1.首先创建一个Skinnable组件,继承自Button(一个很大的好处就是支持defaultButton,普通的组件是不支持的,这是促成我写这个组件的原始动力),类名就定义为ImageButton:
package cn.shawnlee.components
{
import spark.components.Button;
public class ImageButton extends Button
{
public function ImageButton()
{
super();
}
}
}
2.好了,组件已经建立了,然后先建立一个皮肤,再来考虑逻辑,新建MXML外观,定义为ImageButtonSkin,主机组件定位到刚才建立的ImageButton:
<?xml version="1.0" encoding="utf-8"?>
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"> <!-- host component -->
<fx:Metadata>
[HostComponent("cn.shawnlee.components.ImageButton")]
</fx:Metadata> <!-- states -->
<s:states>
<s:State name="disabled" />
<s:State name="down" />
<s:State name="over" />
<s:State name="up" />
</s:states> <!-- SkinParts
name=iconDisplay, type=spark.primitives.BitmapImage, required=false
name=labelDisplay, type=spark.core.IDisplayText, required=false
--> </s:Skin>
3.现在来考虑显示逻辑,我们仅仅需要用图片来代替按钮的默认外观,但考虑到按钮的四种状态,我需要用四个BitmapImage来分别装载四个图片,用来在不同状态下显示,因此,在外观中直接加入
<s:BitmapImage id="imageDisabledDisplay" includeIn="disabled" />
<s:BitmapImage id="imageDownDisplay" includeIn="down" />
<s:BitmapImage id="imageOverDisplay" includeIn="over" />
<s:BitmapImage id="imageUpDisplay" includeIn="up" />
4.由此外观皮肤已经做好了,对,就这么简单,下面只需要在显示逻辑上做文章就可以了,来看看ImageButton类,我们需要把外观中加入的四个BitmapImage在类中进行定义声明,以便可以在代码中进行调用和控制:
[SkinPart(require="false")]
public var imageDisabledDisplay:BitmapImage; [SkinPart(require="false")]
public var imageDownDisplay:BitmapImage; [SkinPart(require="false")]
public var imageOverDisplay:BitmapImage; [SkinPart(require="false")]
public var imageUpDisplay:BitmapImage;
5.接下来考虑显示逻辑,我希望我的组件能够很方便的这么使用:
<cn:ImageButton image="@Embed('./btn.png')" imageDown="@Embed('./btnDown.png')" imageOver="@Embed('./btnOver.png')" />
如果我比较懒,我只是需要一张图片,那么就只定义image,如果我还想详细的定义up,down,over,disabled状态下的图片,则通过imageUp,imageDown,imageOver,imageDisabled来定义,所以我的组件需要自定义五个Style样式:
[Style(name="image", type="Class", format="EmbeddedFile", inherit="no")]
[Style(name="imageDisabled", type="Class", format="EmbeddedFile", inherit="no")]
[Style(name="imageDown", type="Class", format="EmbeddedFile", inherit="no")]
[Style(name="imageOver", type="Class", format="EmbeddedFile", inherit="no")]
[Style(name="imageUp", type="Class", format="EmbeddedFile", inherit="no")]
public class ImageButton extends Button
6.好了,image样式表示默认的图片,如果没有设置对应状态下的图片,则以image样式的图片显示,为此,我需要自定义一个私有方法,来返回各个状态下应该显示出的图片:
private function getImageStyle(styleProp:String):*
{
var value:* = getStyle(styleProp);
return value==null?getStyle("image"):value;
}
7.然后就是自定义组件不可缺少的一步,重写partAdded方法:
override protected function partAdded(partName:String, instance:Object):void
{
super.partAdded(partName, instance);
if(instance == imageDisabledDisplay)
{
imageDisabledDisplay.source = getImageStyle("imageDisabled");
}
if(instance == imageDownDisplay)
{
imageDownDisplay.source = getImageStyle("imageDown");
}
if(instance == imageOverDisplay)
{
imageOverDisplay.source = getImageStyle("imageOver");
}
if(instance == imageUpDisplay)
{
imageUpDisplay.source = getImageStyle("imageUp");
}
}
上面的过程使ImageButton在添加各个BitmapImage子组件时根据对应的Style样式设置各自的图片source属性,至此,组件完成,是不是很简单?
【源代码下载】
Flex4 自定义通用的ImageButton的更多相关文章
- 自定义通用dialogFragment
		
代码地址如下:http://www.demodashi.com/demo/12844.html 前言 之前写过一篇dialogFragmnet封装默认dialog的文章 DialogFragment创 ...
 - 百度小程序自定义通用toast组件
		
百度小程序Toast组件 author: @TiffanysBear 百度小程序自定义通用toast组件 BdToast百度小程序自定义通用组件-github地址 需求 手百小程序的toast仅支持在 ...
 - SpringCloud微服务实战——搭建企业级开发框架(七):自定义通用响应消息及统一异常处理
		
平时开发过程中,无可避免我们需要处理各类异常,所以这里我们在公共模块中自定义统一异常,Spring Boot 提供 @RestControllerAdvice 注解统一异常处理,我们在GitEgg ...
 - 2.Android 自定义通用的Item布局
		
转载:http://www.jianshu.com/p/e7ba4884dcdd BaseItemLayout 简介 在工作中经常会遇到下面的一些布局,如图标红处: 05.png 07.png 08. ...
 - Android 自定义通用的loadingview
		
介绍 好久没有写博客啦,最近在接近新年了,年前的工作都要收尾,所以特别忙,周末抽空写了个通用的加载view,写篇博客分享出来. 功能 1.显示加载视图,加载失败的时候显示加载失败视图,数据为空时显示数 ...
 - WPF报表自定义通用可筛选列头-WPF特工队内部资料
		
由于项目需要制作一个可通用的报表多行标题,且可实现各种类型的内容显示,包括文本.输入框.下拉框.多选框等(自定的显示内容可自行扩展),并支持参数绑定转换,效果如下: 源码结构 ColumnItem类: ...
 - Flex4 自定义分页组件
		
自己写的Flex4分页组件,去伪存真,只实现基本的分页功能,数据过滤神马的都不应该是分页组件干的活,有呆毛才有真相: [源代码下载] Flex自从转手给Apache后人气急跌,本人也很捉鸡,尽管Apa ...
 - 自定义通用Distinct去除重复数据的2中方式
		
由于Lambda Distinct方法默认是按照集合里面的值比较的,所以当集合里面存放的是类的时候,我们一般是按照实体中的某一属性值比较,其实是用默认的Distinct也可以的,自己先定义一个实现了接 ...
 - C# WinForm自定义通用分页控件
		
大家好,前几天因工作需要要开发一个基于WinForm的小程序.其中要用到分页,最开始的想法找个第三方的dll用一下,但是后来想了想觉得不如自己写一个玩一下 之前的web开发中有各式各样的列表组件基本都 ...
 
随机推荐
- Bind9用view配主从
			
We use two Bind server to realize view, master, slave----------------------------------------------- ...
 - 黄聪:利用OpenXml生成Word2007文档(转)
			
原文:http://blog.csdn.net/francislaw/article/details/7568317 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一Op ...
 - 黄聪:Discuz!的SEO优化策略一:如何设置标题 & 如何去掉Powered by Discuz!尾巴
			
1.如何设置标题 进入 管理中心 -- 全局 -- SEO设置 -- 论坛 -- 标题 ,设置你的网站标题和描述. PS:有人问keywords要不要设置,其实现在keywords对SEO的影响已经微 ...
 - (C#) 引用工程中发现有黄色叹号
			
一个Project 引用 另外 一个Project 显示黄色叹号,后来发现 后一本Project的build设定为.Net4.5, 前一个为4.0, 将版本改为一致后,问题解决.
 - PO_PO系列 - 收货管理分析(案例)
			
2014-07-01 Created By BaoXinjian
 - dynamic基元类型
			
C#编译器允许将一个表达式的类型标记为dynamic.还可以将一个表达式的结果放到一个变量中,并将变量的类型标记为dynamic. 代码使用dynamic表达式/变量来调用一个成员是,编译器会生成特殊 ...
 - 键盘-App监听软键盘按键的三种方式
			
前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的sea ...
 - 转-TabHost组件(一)(实现底部菜单导航)
			
http://www.cnblogs.com/lichenwei/p/3974009.html 什么是TabHost? TabHost组件的主要功能是可以进行应用程序分类管理,例如:在用户使用wind ...
 - JavaScript 类
			
一.基础 //定义obj类 var obj = function(){ //声明v1成员 var v1 = ''; //声明get_v1方法,用this关键字定义 this.get_v1 = func ...
 - ORA-30036
			
http://blog.sina.com.cn/s/blog_676255e101018d5s.html