`

实现Decorator接口(转载)

阅读更多
说明: 写道
说明:此文转自大漠飞鸿的文章
http://hi.baidu.com/lozu/blog/item/4453c3b13c36035e092302d8.html

 

AsWing入门教程 1.5 2D图形2009-10-09 22:02从ActionSacript3.0发布开始,Flash也有了专门绘制基本图形的工具类Graphics,可以用它来绘制直线、矩形、椭圆等。但是这些绘制非常有限。 

    Graphics2D类封装很多图形操作,用Graphics2D绘制图形很方便,例如图1.5-1的图形。

(图1.5-1)


     如果你要得到一个Graphics2D对象,你只需要将一个普通的Graphics对象封装进去就行了,如:

protected function paint(bounds:IntRectangle) :void {
     super.paint(bounds);
  
     var g2:Graphics2D = new Graphics2D(this.graphics);

      ......
}  


    面板类(JPanel)是容器类(Container)的子类,它们从Component类继承了setBackgroundDecorator方法。setBackgroundDecorator方法允许用一个实现GroundDecorator接口的类作为JPanel的背景。JPanel默认的背景是透明的,就是它什么都不显示。我们可以通过扩展GroundDecorator类来改变JPanel的背景,对于图形编程我们推荐采用这种方式。


    背景装饰器接口(GroundDecorator)是装饰器接口(Decorator)的子类,从Decorator接口当中继承了getDisplay方法,并且GroundDecorator接口还声明了updateDecorator方法,所以实现GroundDecorator就需要实现这两个方法,如下:

class MyBackground implements GroundDecorator {


    private var shape:Shape;


    public function MyBackground() {

          this.shape = new Shape();

    }

    public function updateDecorator(c:Component, g:Graphics2D, bounds:IntRectangle) : void{
          shape.graphics.clear();
          g = new Graphics2D(shape.graphics);    


          ......

    }

    public function getDisplay(c:Component) : DisplayObject{
        return this.shape;
     }
}


    你可以直接用updateDecorator方法的Graphics2D参数进行绘制,但是我们建议新建一个Shape对象并且在新建的Shape对象上进行绘制,AsWing将通过getDisplay方法获取这个Shape对象,并且把它放置到容器当中。


    扩展了GroundDecorator之后需要将扩展的对象作为JPanel的背景面板修饰器(BackgroundDecorator)。如下:

var ground:GroundDecorator = ......

panel.setBackgroundDecorator(ground);

    容器组件(Container)包含一个内容窗格和一个背景窗格,如图1.5-1所示。在上一节当中,我们直接在内容窗格当中绘制,但是由于内容窗格同时也会放置其它组件,所以我们推荐在背景窗格上绘制。


(图1.5-1)

    用Graphics2D绘制形状是很容易的。在绘制之前需要先创建一只笔(Pen)或者一把刷子(Brush),笔用来绘制线条,刷子则可以用来填充颜色。


    构造一只笔(Pen)需要提供颜色和线条的粗细,如下代码定义了一支颜色为黑色,线条为2像素粗的笔:

var pen:Pen = new Pen(ASColor.BLACK, 2);





--------------------------------------------------------------------------------


笔记:

在AsWing当中,颜色被封装到ASColor对象当中,ASColor定义了一些常用的颜色的颜色对象,比如ASColor.WHITE、ASColor.BLACK,如果需要定义特定的颜色,可以通过静态方法ASColor.getASColor来获取所需颜色的颜色对象,比如要得到红色(Red=0xFF,Green=0x0,Blue=0x0),可以用如下代码:

var red:ASColor = ASColor.getASColor(0xFF, 0x0, 0x0); 


关于颜色的操作,在下一节还会继续介绍。



--------------------------------------------------------------------------------




    若要绘制一条直线,需要提供两个端点的坐标(x1,y1)和(x2,y2),如下:

g.drawLine(pen, x1, y1, x2, y2);


    若要绘制一个矩形,需要提供左上角断点的坐标,以及矩形的宽度和高度,语法如下:

g.drawRectangle(pen, x, y, width, height);


    对于椭圆的描述是通过它的外切矩形。所以若要绘制一个椭圆,需要提供其外切矩形左上角顶点的位置和这个外接矩形的长度、宽度,语法如下:

g.drawEllipse(pen, x, y, width, height);


     绘制圆形的时候,需要提供的是圆心的坐标和圆形的半径,如下:

g.drawCircle(pen, x, y, radius); 


     例1-4中的程序绘制了:

一个矩形;
该矩形的内接椭圆;
该矩形的一条对角线;
一个和该矩形同心的圆。
所有图形都绘制在框架的中央,如果框架改变大小,图形也会随之改变

例1-4 DrawTest.as


package
{
    import flash.display.Sprite;
    
    import org.aswing.AsWingManager;
    import org.aswing.Container;
    import org.aswing.GroundDecorator;
    import org.aswing.JFrame;
    import org.aswing.JPanel;

    public class DrawTest extends Sprite
    {
        public function DrawTest() {
            
            AsWingManager.initAsStandard(this);
            
            var frame:JFrame = new JFrame();
            frame.setTitle("Draw test");
            frame.setSizeWH(DEFAULT_WIDTH, DEFAULT_HEIGHT);
            
            var panel:JPanel = new JPanel();
            var ground:GroundDecorator = new MyGroundDecorator();
            panel.setBackgroundDecorator(ground);
            
            var contentPane:Container = frame.getContentPane();
            contentPane.append(panel);
            
            frame.show();
        }
        
        public static const DEFAULT_WIDTH:uint = 400;
        public static const DEFAULT_HEIGHT:uint = 300;
    }
}


import flash.display.Shape;
import flash.display.DisplayObject;
    
import org.aswing.GroundDecorator;
import org.aswing.Component;
import org.aswing.graphics.Graphics2D;
import org.aswing.geom.IntRectangle;
import org.aswing.graphics.Pen;
import org.aswing.ASColor;
   

class MyGroundDecorator implements GroundDecorator {
    
    private var shape:Shape;
    
    public function MyGroundDecorator() {
        this.shape = new Shape();
    }
    
    public function updateDecorator(com:Component, g:Graphics2D, bounds:IntRectangle) : void {
        g = new Graphics2D(shape.graphics);


        //clear before draw
        
        g.clear();
        
        //create a pen for drawing
        
        var pen:Pen = new Pen(ASColor.BLACK);
        
        //draw line
        
        var x1:uint = bounds.x+100;
        var y1:uint = bounds.y+50;
        
        var x2:uint = bounds.x + bounds.width - 100;
        var y2:uint = bounds.y + bounds.height - 50;
        
        g.drawLine(pen, x1, y1, x2, y2);
        
        //draw rectangle 1
        
        var width:uint = x2 - x1;
        var height:uint = y2 - y1;
        
        g.drawRectangle(pen, x1, y1, width, height);
        
        //draw ellipse
        
        g.drawEllipse(pen, x1, y1, width, height);
        
        //draw circle
        
        var x:uint = bounds.x + Math.round(bounds.width/2);
        var y:uint = bounds.y + Math.round(bounds.height/2);
        var radius:uint = Math.round(Math.min(bounds.width, bounds.height)/2);
        
        g.drawCircle(pen, x, y, radius);
    }
    
    public function getDisplay(c:Component) : DisplayObject {
        return this.shape;
    }
}



API:org.aswing.GroundDecorator

updateDecorator(c:Component, g:Graphics2D, bounds:IntRectangle) : void
更新装饰器的显示,这个方法将会在显示区域发上改变的适合哦自动调用,比如框架的尺寸发生改变的时候,还有第一次显示的时候。

参数c是被装饰的组件的引用,也就是这个装饰器的所有者。

g是c上面的2D图形对象(Graphics2D),通过g可以直接在c上绘制,不过我们推荐还是用自己创建的DisplayObject来绘制而不是直接用所有者组件的图形对象。

bounds是绘制的区域信息。你应该只在这个区域当中绘制。这个区域的大小不是固定的,在每次调用这个方法的时候,AsWing都会根据当前的显示布局重新调整bounds的值,所以你的程序应该根据bounds来设置大小

getDisplay(c:Component) : DisplayObject
获取DisplayObject类型的对象,如果你在绘制当中使用了自己新建的DisplayObject类型的对象,那么你应该在这里返回你的对象。


API:org.aswing.Container

setBackgroundDecorator(bg:GroundDecorator):void
设置背景装饰器,这个绘制发生在Container的背景层上。


API:org.aswing.graphics.Pen

Pen(color:ASColor,thickness:uint)
构造一支画笔。画笔是绘制线条的工具。


API:org.aswing.ASColor

ASColor (rgb:uint=0x000000, alpha:Number=1)
构造一个颜色对象。参数rgb是一个6位的16进制数,分别代表了Red、Green、Blue三个通道的数值。参数alpha是一个0到1之间的小数,控制颜色的透明度。0为完全透明,1为完全不透明。


getASColor(r:uint, g:uint, b:uint, alpha:Number=1):ASColor
利用三个通道的数值和透明多获取一个颜色对象


getASColorWithHLS(h:Number, l:Number, s:Number, alpha:Number=1):ASColor
通过HLS的三个通道和透明度获取一个颜色对象


API:org.aswing.graphics.Graphics2D

clear():void
清除已经绘制成的图像内容。


drawCircle(pen:IPen, centerX:Number, centerY:Number, radius:Number):void
绘制一个圆形。


drawEllipse(pen:IPen, x:Number, y:Number, width:Number, height:Number):void
绘制一个椭圆,椭圆的外切矩形的左上角定点位于(x,y),外切矩形的宽度为width,外切矩形的高度为height


drawLine(p:IPen, x1:Number, y1:Number, x2:Number, y2:Number):void
绘制一条直线段,(x1,y1)和(x2,y2)分别是线段的两个端点


drawPolygon(pen:Pen, points:Array):void
绘制一个多边形。points为顶点数组,数组当中的对象为的顶点对象,结构为{x:x0, y:y0}。多边形是封口的,最后一个定点和第一个定点之间会自动绘制连线。


drawPolyline(p:IPen, points:Array):void
绘制一个不封口的多边形边。points为顶点数组,和drawPolygon一样,区别只是DrawPolyline不会自动封口。


drawRectangle(pen:IPen, x:Number, y:Number, width:Number, height:Number):void
绘制一个矩形。矩形的左上角定点位于(x,y),宽度为width,高度为height


drawRoundRect(pen:IPen, x:Number, y:Number, width:Number, height:Number, radius:Number):void
绘制一个圆角矩形。矩形的外切矩形左上角顶点位于(x,y),宽度为width,高度为height。矩形的圆角的曲率半径为radius。圆角和边相切。
 

 

分享到:
评论

相关推荐

    java Decorator装饰模式例子

    4. **Concrete Decorator(具体装饰者)**: 实现Decorator接口,提供具体的附加行为。在Java IO中,`BufferedInputStream`和`DataInputStream`就是装饰器,它们分别增加了缓冲和数据转换的功能。 **装饰模式的结构*...

    设计模式之 Decorator模式和代码实现

    在上述的奇幻RPG游戏中,Decorator模式被用来实现武器的锻造过程,尤其是武器镶嵌宝石的功能。这个过程涉及到对基础武器(如剑)的扩展,以增加不同的属性和效果。 在没有引入Decorator模式之前,我们可能会使用...

    C++ Decorator模式

    3. **装饰器(Decorator)**:持有一个指向组件接口的指针,并且也实现了该接口。这样装饰器可以将自身作为一个组件使用,同时可以通过指针调用实际组件的方法。装饰器类通常会有一个构造函数接受组件对象作为参数。 ...

    装饰器模式[Decorator]

    4. **具体装饰器(Concrete Decorator)**:实现了Decorator接口,并且在Component的基础上添加了新的行为。具体装饰器通常会包含对Component的实例化,并在其内部方法中调用Component的方法。 举个例子,假设我们...

    设计模式 t07Decorator

    4. 具体装饰器(Concrete Decorator):实现了装饰器接口,负责给组件添加特定的行为。 在“t07Decorator”中,可能会包含以下示例代码: - `Component` 类或接口:定义了基本的行为,例如一个简单的图形类,有绘制...

    设计模式之装饰模式(Decorator Pattern)

    3. **装饰器(Decorator)**:实现了组件接口,持有一个组件对象的引用,并负责调用组件接口的方法。装饰器本身也可以被其他装饰器包装,从而实现多层扩展。 4. **具体装饰器(Concrete Decorator)**:实现了装饰器接口...

    decorator-4.1.2.tar.gz

    1. `decorator.py`: 这是核心的装饰器实现,包含了`@decorator`函数,以及其他辅助函数,如`functools.wraps`的实现,用于确保被装饰函数的元数据得以保留。 2. `decoratormodule.c`: 如果可用,这个C扩展模块可能会...

    DecoratorPattern.rar

    - ConcreteDecorator(具体装饰者):实现了Decorator接口,添加了ConcreteComponent对象的新行为或职责。 2. 装饰器模式的优点: - 扩展性:装饰者模式可以在不修改原有对象的基础上,通过添加新的装饰类来增加...

    decorator-4.1.2.rar ,亲测可用

    《Python装饰器深入解析——基于decorator-4.1.2版本》 ...通过正确地使用它,我们可以提高代码的可读性和可维护性,同时实现灵活的功能扩展。无论是初学者还是经验丰富的Python开发者,都应该熟悉并掌握这一重要概念。

    python实现Decorator模式实例代码

    本文研究的主要是python实现Decorator模式,具体介绍如下。 一般来说,装饰器是一个函数,接受一个函数(或者类)作为参数,返回值也是也是一个函数(或者类)。首先来看一个简单的例子: # -*- coding: utf-8 -*- ...

    decorator python(decorator-3.4.0.tar.gz).rar

    这个"decorator python"模块是版本3.4.0的实现,其核心概念是通过函数来包装(即装饰)其他函数,以增强被装饰函数的行为。这个模块可能是由社区成员贡献并分享的,因此它属于"其他资源"类别。 在Python中,装饰器...

    Decorator.rar

    4. **Concrete Decorator(具体装饰器)**:这些是装饰器的具体实现,它们在Component接口的基础上增加新的行为。例如,`ConcreteDecoratorA`和`ConcreteDecoratorB`可能会分别添加不同的功能,如日志记录、性能追踪...

    通过C#实现设计模式-装饰模式(DecoratorPattern).rar

    3、定义一个抽象的装饰器类Decorator,它实现了IComponent接口,并持有一个IComponent的引用。 4、创建具体的装饰器类了。例如,一个ConcreteDecoratorA类,它添加了额外的行为。 5、创建另一个装饰器...

    c++-设计模式之装饰模式(Decorator)

    装饰器(Decorator):持有一个组件接口的引用,并实现相同的接口以增强功能。 具体装饰器(Concrete Decorator):扩展装饰器的功能,提供额外的行为 总结 装饰模式通过在运行时动态地为对象添加功能,增强了系统...

    Decorator-3.4.0

    总的来说,"Decorator-3.4.0"是一个专注于装饰器实现的Python库,提供了丰富的功能,旨在简化和增强Python代码的可维护性和灵活性。通过理解和利用这个库,开发者可以更优雅地实现代码复用,提高程序的性能,并简化...

    Decorator模式

    3. Decorator(装饰器):持有一个Component对象的引用,并且也实现了Component接口。这样,Decorator可以像Component一样被使用,同时可以通过其内部的Component对象调用原始方法。 4. ConcreteDecorator(具体装饰...

    decoratorMode.rar

    4. **ConcreteDecorator(具体装饰者)**:实现了Decorator的接口,添加了具体的行为或责任。 在"MyTest"项目中,我们可能会看到类似以下的类结构: - `IWindow`(Component):定义窗口的基本操作,如打开、关闭...

    设计模式之Decorator

    6. `Component.java` - 这是组件接口,`SalesTicket`实现了这个接口,装饰器类也需实现此接口以保持与组件的兼容性。 在实际的应用中,`Client.java`会创建一个`SalesTicket`对象,然后通过装饰器对其进行包装,...

    Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现

    然后创建一系列装饰者类(Decorator),它们同样实现了Component接口,但可以持有Component的实例,并在需要时对其进行增强。 在C++实现中,首先会定义一个基类`Component`,它定义了组件的基本行为。例如: ```...

    Decorator pattern

    4. **Concrete Decorator(具体装饰者)**:实现了Decorator接口,添加了一些新的行为或属性,具体装饰者通常会持有并调用Component对象的某个方法,然后添加额外的功能。 在提供的"Test"文件中,可能包含了一个...

Global site tag (gtag.js) - Google Analytics