2011-02-24 60 views
1

假设您有一个具有填充和笔画的通用Graphics对象。是否有一种简单的方法来对该对象进行切片,例如垂直切片,然后获取代表它的一个子集的Graphics对象?关于flex中的图形有点奇怪的问题

换句话说,下面的功能片会是什么样子?

var gOriginal:Graphics; 
var gNew:Graphics; 
gNew = slice(gOriginal, "vertical", "0.5); 

这样,如果gOriginal是一个椭圆,我现在得到一半的椭圆?

谢谢

˚F

+0

谢谢大家的回答。我会尽快尝试并投票。 – 2011-02-25 21:46:19

回答

3

我标注到丹尼尔的概念基本上(除了我有些根深蒂固,原因不明,为degrafa不屑),你应该能够做到这一点:

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       minWidth="955" 
       minHeight="600" 
       creationComplete="application1_creationCompleteHandler(event)"> 
    <s:layout> 
     <s:VerticalLayout/> 
    </s:layout> 
    <fx:Script> 
     <![CDATA[ 
      import mx.core.UIComponent; 
      import mx.events.FlexEvent; 

      import spark.components.Group; 

      public var someGraphics:UIComponent; 
      [Bindable] 
      public var bd:BitmapData; 
      [Bindable] 
      public var finalBD:BitmapData; 
      override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void 
      { 
       super.updateDisplayList(unscaledWidth,unscaledHeight); 
       if(someGraphics) 
       { 
        someGraphics.graphics.beginFill(0xFF0000); 
        someGraphics.graphics.drawEllipse(0,0,100,20); 
        someGraphics.graphics.endFill(); 

        bd.draw(someGraphics); 
        finalBD.copyPixels(bd,new Rectangle(0,0,bd.width*.5,bd.height),new Point()); 
       } 
      } 

      protected function application1_creationCompleteHandler(event:FlexEvent):void 
      { 
       someGraphics = new UIComponent(); 
       bd = new BitmapData(100,100); 
       finalBD = new BitmapData(100,100); 
       invalidateDisplayList(); 
      } 

     ]]> 
    </fx:Script> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <s:BitmapImage source="{bd}" width="100" height="100"/> 
    <s:BitmapImage source="{finalBD}" width="100" height="100"/> 
</s:Application> 

这显然不能从一个漂亮的解决方案但只是将图形转换为具有图形属性的某个对象,然后使用BitmapData绘制方法将像素转换为位图数据,然后将这些像素的一部分复制到另一个BitmapData中进行显示,这可能是更多的内存,但处理器更少比杰里米强。另外我使用的是UIComponent,对draw方法的要求是类实现了IBitmapDrawable,所以无论是最轻量级的实现可能是你想要使用的,UIComponent是一个猜测。

+0

太棒了。可能不漂亮,但这正是我所期待的。你是超级巨星! – 2011-03-01 05:08:02

1

你可以画()成一个位图对象,然后选择一个矩形,包括可能有同样的效果,但这样做的没有简单的方法。

你也可以看看degrafa但可能变得太复杂

+0

谢谢丹尼尔 - 看起来像你种下了伟大的种子... – 2011-03-01 05:09:45

1

没有内置的方法去除Graphics对象的部分。关于“切片”,您很可能需要独特地处理每种形状(矩形,椭圆,多边形)。例如,要切分elipse,类似于从饼图中取出一个切片,您需要使用一个小的三角形来绘制这些形状以创建一个楔形。

下面是用于绘制楔基本功能:

protected function drawWedge():void 
{ 
    var g:Graphics = shape.graphics;  
    g.clear(); 
    g.lineStyle(1, 0xFFFFFF); 
    g.beginFill(0xCCCCCC); 

    var radiusX:Number = 100; 
    var radiusY:Number = 100; 
    var angle:Number = 0; 
    var xpos:Number = 0; 
    var ypos:Number = 0; 
    var segments:Number = 25; 
    var degrees:Number = 45; 
    var inc:Number = degrees/(segments); 

     for(var i:int = 0; i <= segments; i++) 
     { 
      xpos = Math.cos(Math.PI * angle/180) * radiusX; 
      ypos = Math.sin(Math.PI * angle/180) * radiusY; 

      g.lineTo(xpos, ypos); 

      angle += inc; 
     } 

     g.endFill(); 
} 

调整angleXangleY当它们被初始化将开始在沿圆周不同的点绘制楔瓦尔。如果您将degrees更改为360,您将看到一个完整的圆圈,在180度处将会看到一个半圆。更改radiusXradiusY以创建一个椭圆。另外,segments控制图形的分辨率。撞上它,你会得到一个更平滑的曲线。

希望这会有所帮助。

+0

杰里米,谢谢你的建议。这实际上是我所做的,但我认为解决方案shaunhusain描述完美的技巧。 – 2011-03-01 05:09:01