1

次のように、線のシリーズにストロークを簡単に設定できます。

<mx:LineSeries yField="apple">
    <mx:lineStroke>
        <mx:Stroke 
                    color="0x6699FF" 
                    weight="4" 
                    alpha=".8"
        />
    </mx:lineStroke>
</mx:LineSeries>

これにより、ストローク全体のアルファが.8に設定されます

しかし、dataProviderの何かに基づいて、プロットごとにストロークに異なるアルファを設定できるようにしたいと思います。

たとえばyField、lineSeriesのは「Apple」です。これは、lineSeriesのプロット先を知る方法です。alphaField各プロットのストロークアルファを何に設定するかを指示するようなものを追加できるようにしたいと思います。

したがって、私のdataProviderが次の場合:

<result month="Jan-04">
    <apple>81768</apple>
    <alpha>1</alpha>
</result>
<result month="Feb-04">
    <apple>51156</apple>
    <alpha>1</alpha>
</result>
<result month="Mar-04">
    <apple>51156</apple>
    <alpha>.5</alpha>
</result>

alphaField="alpha"次に、プロット0からプロット1までの実線のストロークと、プロット1からプロット2までの50%のアルファストロークを設定しました。

これどうやってするの???LineSeriesのcommitProperties()メソッドとupdateDisplayList()メソッドを調べていますが、これを行うために何を追加/変更する必要があるのか​​わかりませんか?

確かに、このクラスはGraphics.lineTo()を使用して各プロットを描画する必要があるため、基本的には、現在のalphaField値を何らかの方法で「取得」し、それぞれを描画する前に正しいアルファを使用してGraphics.lineStyle()を適用する必要があります。ライン。

ありがとう!!


アップデート

私は自分の答えにずっと近づきました。

LineRendererを拡張すると、GraphicsUtilities.drawPolyLine()を呼び出すupdateDisplayList()をオーバーライドします。

GraphicsUtilitiesを拡張し、メソッドdrawPolyLine()をオーバーライドします。これは、実際に線が描画される場所だからです。

ここでlineStyle()を呼び出して、行のアルファを変更できます...

drawPolyLine()メソッド内から、アルファがどうあるべきかを指示するデータにアクセスするにはどうすればよいか、まだ理解できないことが1つあります。

ありがとう!!!!

4

3 に答える 3

0

drawPolyLine関数では、を取得しますpts:Array。これは、特定のSeriesItemの配列です。Lineシリーズの場合、LineSeriesItemオブジェクトの配列を取得します。したがって、x&y軸の値を取得する場合。xValueのまたはyValueプロパティにアクセスするだけですLineSeriesItem。このように:pts[0].xValueまたはpts[0].yValue


public static function drawPolyLine(g:Graphics, pts:Array,
                                     start:int, end:int,
                                     hProp:String, vProp:String,
                                     stroke:IStroke, form:Object,
                                     moveToStart:Boolean = true):void
于 2010-01-21T09:58:33.253 に答える
0

Flex SDK 4.0 を使用しましたが、3.4 でも動作すると思います。

tsimus ではなかったため、XML の代わりに ArrayCollection を使用しました。

<mx:Application
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:mx="library://ns.adobe.com/flex/halo" >

    <fx:Script><![CDATA[
        import mx.charts.ChartItem;
        import mx.charts.renderers.CircleItemRenderer;
        import mx.collections.ArrayCollection;
        import mx.graphics.IFill;
        import mx.graphics.SolidColor;
        import mx.graphics.Stroke;

        import st.model.ViewModelLocator;

        [Bindable]
        private var modelLocator:st.model.ViewModelLocator = ViewModelLocator.getInstance() ;

        [Bindable]
        public var dp :ArrayCollection = new ArrayCollection([
            { test:0.1,alpha: 1 },
            { test:0.2,alpha: 0.5 },
            { test:0.3,alpha: 0.75 },
            { test:0.4,alpha: 0.25 },
            { test:0.5,alpha: 0.5 }
        ]);

        private function myFillFunction(element:ChartItem, index:Number):IFill {
            return new SolidColor(0x6699FF,Number(element.item.alpha));
        }
    ]]></fx:Script>

    <mx:ColumnChart id="myChart" dataProvider="{dp}">
        <mx:series>
            <mx:LineSeries lineStroke="{new Stroke(0x6699FF,4,0.1)}" width="100" height="100" yField="test" fillFunction="{myFillFunction}" itemRenderer="{new ClassFactory(mx.charts.renderers.CircleItemRenderer)}" />
        </mx:series>
    </mx:ColumnChart>

</mx:Application>
于 2010-01-19T15:33:59.810 に答える
0

カスタム アイテム レンダラーを使用してみましたか?

<mx:LineSeries>
  <mx:itemRenderer>
    <mx:Component>
      <mx:BoxItemRenderer scaleX="1" scaleY="1" alpha="{data.alpha}"/>
    </mx:Component>
  </mx:itemRenderer>
</mx:LineSeries>

これは簡単な例ですが、itemRenderer が適していると思います。

于 2010-01-19T15:36:01.413 に答える