火星文 技术研习社

Noname Cat, Keep Thinking
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Flex AIR:用 mx:Image 实现的动态图片按钮

Posted on 2010-06-14 17:39  剑廿三  阅读(2724)  评论(0编辑  收藏  举报

Spark 主题的 Button 控件在实现动态图片按钮时需要借助 Flash Catalyst 软件把每个图片转换成对应的 mxml 外观文本,不论加载效率,这种做法的门槛似乎有点高。本文使用一大一小两个PNG图片文件实现动态效果,这种方式比较原始,门槛比较低。但笔者估计,这种方式在内存加载效率上可能远不如 Spark 主题推荐的方式。

 

ButtonTest.mxml 的内容如下:

 

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s
="library://ns.adobe.com/flex/spark" 
                       xmlns:mx
="library://ns.adobe.com/flex/mx">
    
<fx:Declarations>
    
</fx:Declarations>
    
<fx:Script>
        
<![CDATA[
            
            import nonamecat.common.style.ImageButtonStyle;
            
        
]]>
    
</fx:Script>
    
<mx:Image x="80" y="80" width="32" height="32" id="imgAdd" source="icon/add32.png" 
              mouseOver
="ImageButtonStyle.onMouseMove(event,'icon/add48.png', 48)" 
              mouseOut
="ImageButtonStyle.onMouseMove(event,'icon/add32.png', 32)"
              mouseDown
="ImageButtonStyle.onClick(event)" 
              mouseUp
="ImageButtonStyle.onClick(event)"/>
</s:WindowedApplication>

 

 

ImageButtonStyle.as 的内容如下:

 

 

package nonamecat.common.style
{
    
import flash.events.MouseEvent;
    
import mx.controls.Image;
    
    
/**
     * 图像按钮的辅助行为
     
*/
    
public class ImageButtonStyle
    {
        
/**
         * 表示鼠标松开按键
         
*/
        
public static var UP:int = -1;
        
        
/**
         * 表示鼠标按下按键
         
*/
        
public static var DOWN:int = 1;
        
        
/**
         * 表示鼠标覆盖对象
         
*/
        
public static var OVER:int = 2;
        
        
/**
         * 表示鼠标离开对象
         
*/
        
public static var OUT:int = 0;
        
        
public function ImageButtonStyle()
        {
        }
        
        
/**
         * 当鼠标移动经过对象上的时候激活的事件
         * 
         * 
@param event 鼠标事件
         * 
@param imageUrl 用于替换的图片的 Url
         * 
@param width 用于替换的图片的宽度
         * 
@param height 用于替换的图片的高度,如果忽略,则视为与宽度一致
         
*/
        
public static function onMouseMove(event:MouseEvent, imageUrl:String, width:Number, height:Number=0):void
        {
            var button:Image 
= event.currentTarget as Image;
            
if(button!=null)
            {
                var state:
int;
                
if(event.localX<=0||event.localX>=button.width||event.localY<=0||event.localY>=button.height)
                {
                    state 
= OUT;            
                }
                
else
                {
                    state 
= OVER;
                }
                
                
if(button.data!= state)
                {
                    button.data 
= state;
                    button.source
=imageUrl;
                    
                    var oldWidth:Number 
= button.width;
                    var oldHeight:Number 
= button.height;
                    var newWidth:Number 
= width;
                    var newHeight:Number 
= height == 0 ? width : height;
                    
                    button.width
=newWidth;
                    button.height
=newHeight;
                    button.x
=button.x-int((newWidth-oldWidth)/2);
                    button.y
=button.y-int((newHeight-oldHeight)/2);
                    
                }
            }
            
        }
        
        
/**
         * 当鼠标点击对象时激活的事件
         * 
         * 
@param button 图像按钮对象
         * 
@param event 鼠标事件
         
*/
        
public static function onClick(event:MouseEvent):void
        {
            var button:Image 
= event.currentTarget as Image;
            
if(button!=null)
            {
                var state:
int;
                
if(event.buttonDown)
                {
                    state 
= DOWN;    
                }
                
else
                {
                    state 
= UP;
                }
                button.data 
= state;
                button.x
=button.x+3*state;
                button.y
=button.y+3*state;
            }
        
            
        }
    }
}