Flex中如何通过扩展RectangularBorder类创建虚线以及控制虚线间间隔的例子
By Minidxer | February 26, 2009
Flex本身并不支持虚线,当然也就不可能有控制虚线间间隔一说了,不过做Web应用的时候,UI部分虚线有时候用的还是比较多的。下面的代码演示了通过扩展RectangularBorder类,实现创建虚线以及控制虚线间间隔。
先创建一个DashBorder.as 文件
- package
- {
- import mx.core.UIComponent;
- public class DashBorder extends UIComponent{
- private var dashlen:Number = 5;
- private var gaplen:Number = 5;
- public function DashBorder(){
- super();
- }
- override protected function updateDisplayList
- (unscaledWidth:Number, unscaledHeight:Number):void{
- super.updateDisplayList(unscaledWidth, unscaledHeight);
- var borderThickness:int = getStyle("borderThickness");
- var borderColor:int = getStyle("borderColor");
- graphics.clear();
- graphics.lineStyle(borderThickness, borderColor, 1)
- if (getStyle("dashlen")) {
- this.dashlen = getStyle("dashlen");
- }
- if (getStyle("gaplen")) {
- this.gaplen = getStyle("gaplen");
- }
- drawBorder(this.x, this.y, unscaledWidth, unscaledHeight,
- this.dashlen, this.gaplen);
- }
- public function drawLine(x1:Number, y1:Number, x2:Number, y2:Number,
- dashlen:Number, gaplen:Number): void {
- if((x1 != x2) || (y1 != y2)){
- var incrlen:Number = dashlen + gaplen;
- var len:Number = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
- var angle:Number = Math.atan((y2 - y1) / (x2 - x1));
- var steps:uint = len / (dashlen + gaplen);
- var dashstepx:Number = dashlen * Math.cos(angle);
- if (x2 < x1) dashstepx *= -1;
- var dashstepy:Number = dashlen * Math.sin(angle);
- var gapstepx:Number = gaplen * Math.cos(angle);
- if (x2 < x1) gapstepx *= -1;
- var gapstepy:Number = gaplen * Math.sin(angle);
- var stepcount:uint = 0;
- while ((stepcount++) < steps) {
- var dashstartx:Number;
- var dashstarty:Number;
- var dashendx:Number;
- var dashendy:Number;
- if(x1 == x2 && y1 != y2){
- dashstartx = dashendx = x1;
- if(y2 > y1){
- dashstarty = y1 + ((stepcount-1) * (dashlen + gaplen));
- dashendy = dashstarty + dashlen;
- }else{
- dashstarty = y1 - ((stepcount-1) * (dashlen + gaplen));
- dashendy = dashstarty - dashlen;
- }
- }else if(y1 == y2 && x1 != x2){
- dashstarty = dashendy = y1;
- if(x2 > x1){
- dashstartx = x1 + ((stepcount-1) * (dashlen + gaplen));
- dashendx = dashstartx + dashlen;
- }else{
- dashstartx = x1 - ((stepcount-1) * (dashlen + gaplen));
- dashendx = dashstartx - dashlen;
- }
- }
- graphics.moveTo(dashstartx, dashstarty);
- graphics.lineTo(dashendx, dashendy);
- }
- }
- }
- private function drawBorder(x1:Number, y1:Number, width:Number, height:Number,
- dashlen:Number, gaplen:Number) : void {
- drawLine(x1, y1, x1 + width, y1, dashlen, gaplen);
- drawLine(x1 + width, y1, x1 + width, y1 + height, dashlen, gaplen);
- drawLine(x1 + width, y1 + height, x1, y1 + height, dashlen, gaplen);
- drawLine(x1, y1 + height, x1, y1, dashlen, gaplen);
- }
- }
- }
下面是例子代码DashBorderExample.mxml:
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
- verticalGap="20">
- <mx:Style>
- DashBorder {
- dashlen: 20;
- gaplen: 20;
- }
- .tightDashBorder {
- dashlen: 2;
- gaplen: 2;
- }
- .tightDashWideGapBorder {
- dashlen: 2;
- gaplen: 20;
- }
- .wideDashTightGapBorder {
- dashlen: 20;
- gaplen: 2;
- }
- </mx:Style>
- <mx:HBox horizontalGap="30">
- <mx:VBox borderSkin="DashBorder"
- borderThickness="1" borderColor="0xFF0000"
- width="200" height="200">
- </mx:VBox>
- <mx:VBox borderSkin="DashBorder"
- borderThickness="1" borderColor="0xFF0000"
- width="200" height="200" styleName="tightDashBorder">
- </mx:VBox>
- </mx:HBox>
- <mx:HBox horizontalGap="30">
- <mx:VBox borderSkin="DashBorder"
- borderThickness="1" borderColor="0xFF0000"
- width="200" height="200" styleName="tightDashWideGapBorder">
- </mx:VBox>
- <mx:VBox borderSkin="DashBorder"
- borderThickness="1" borderColor="0xFF0000"
- width="200" height="200" styleName="wideDashTightGapBorder">
- </mx:VBox>
- </mx:HBox>
- </mx:Application>
英文参考:http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=2&postId=13286
Topics:
Adobe其他 |
No Comments » |
Tags: RectangularBorder, 虚线, 间隔