Flex 给容器设置背景渐变

       Flex和Silverlight在一些UI方面,确实差很多,需要大大改进。Silverlight在渐变,透明等改进,Flex就差得远。目前,flex除了application支持背景渐变色外,其它控件都不支持,近日需要这个功能,在网上搜到些资料整理如下:

类文件Script.GradientBorder.as:

/**   
 * 背景渐变色   
 * whisht   
 * */   
package {   
       
    import flash.display.*;   
    import flash.geom.*;   
    import flash.utils.*;   
       
    import mx.core.EdgeMetrics;   
    import mx.skins.halo.HaloBorder;   
    import mx.utils.ColorUtil;   
    import mx.utils.GraphicsUtil;   
       
    public class GradientBorder extends HaloBorder    
    {   
           
        private var topCornerRadius:Number;        // top corner radius   
        private var bottomCornerRadius:Number;    // bottom corner radius   
        private var fillColors:Array;            // fill colors (two)   
        private var setup:Boolean;   
           
  
        private function setupStyles():void   
        {   
            fillColors = getStyle("fillColors") as Array;   
            if (!fillColors) fillColors = [0xFFFFFF, 0xFFFFFF];   
               
            topCornerRadius = getStyle("cornerRadius") as Number;   
            if (!topCornerRadius) topCornerRadius = 0;       
               
            bottomCornerRadius = getStyle("bottomCornerRadius") as Number;   
            if (!bottomCornerRadius) bottomCornerRadius = topCornerRadius;       
           
        }   
           
           
        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void   
        {   
            super.updateDisplayList(unscaledWidth, unscaledHeight);       
               
            setupStyles();   
               
            var g:Graphics = graphics;   
            var b:EdgeMetrics = borderMetrics;   
            var w:Number = unscaledWidth - b.left - b.right;   
            var h:Number = unscaledHeight - b.top - b.bottom;   
            var m:Matrix = verticalGradientMatrix(0, 0, w, h);   
           
            g.beginGradientFill("linear", fillColors, [1, 1], [0, 255], m);   
               
            var tr:Number = Math.max(topCornerRadius-2, 0);   
            var br:Number = Math.max(bottomCornerRadius-2, 0);   
               
            GraphicsUtil.drawRoundRectComplex(g, b.left, b.top, w, h, tr, tr, br, br);   
            g.endFill();   
                   
        }   
           
    }   
}

调用示例:tester.mxml:

 

<?xml version="1.0" encoding="utf-8"?>   
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"    
    layout="vertical"  backgroundColor="#4C0000">
       
    <mx:Style>   
           
        .box
        {   
	border-style: solid;   
	border-thickness: 1;   
	border-skin:ClassReference("Script.GradientBorder");   
	fill-colors: #830202, #cd0002;   
	corner-radius: 10;   
	drop-shadow-enabled: true;  
	borderColor: #990102;
	borderAlpha: 0.94;
	roundedBottomCorners: false;
	cornerRadius: 0;
	shadowDistance: 2;
	shadowDirection: left;  
        }   
           
    </mx:Style>   
       
    <mx:Script>   
        <![CDATA[   
            private function changeStyle():void   
            {   
                box.setStyle("fillColors", [col1.value, col2.value]);   
                box.setStyle("cornerRadius", corner.value);   
            }   
        ]]>   
    </mx:Script>   
       
    <mx:VBox id="box" styleName="box" width="400" height="300" verticalAlign="middle" horizontalAlign="center">   
        <mx:FormItem label="Color 1:">   
            <mx:ColorPicker id="col1" change="changeStyle()" selectedColor="0x0099FF"/>   
        </mx:FormItem>   
        <mx:FormItem label="Color 2:">   
            <mx:ColorPicker id="col2" change="changeStyle()" selectedColor="0x000099"/>   
        </mx:FormItem>   
        <mx:FormItem label="Corner radius:">   
            <mx:HSlider id="corner" value="10" minimum="0" maximum="100" change="changeStyle()"/>   
        </mx:FormItem>   
    </mx:VBox>   
       
</mx:Application>  





转载于:https://www.cnblogs.com/sinbad/archive/2011/06/03/2072301.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值