Flex: إنشاء سكتة دماغية مخصصة على Lineseries؟
-
20-09-2019 - |
سؤال
يمكنك بسهولة ضبط ضربة على سلسلة مثل هذا:
<mx:LineSeries yField="apple">
<mx:lineStroke>
<mx:Stroke
color="0x6699FF"
weight="4"
alpha=".8"
/>
</mx:lineStroke>
</mx:LineSeries>
هذا سوف يضع ألفا للسكتة الدماغية بأكملها إلى .8
لكنني أريد أن أكون قادرًا على ضبط ألفا مختلفة على Stoke لكل قطعة بناءً على شيء في DataProvider.
على سبيل المثال yField
في Lineseries هو "Apple" وهو ما يعرف مكان رسمه لخطوط. أريد أن أكون قادرًا على إضافة شيء مثل alphaField
الذي يخبره بما يجب تعيين alpha السكتة الدماغية لكل قطعة.
لذلك إذا كان 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 ثم بنسبة 50 ٪ من السكتة الدماغية من المؤامرة 1 إلى المؤامرة 2.
كيف يمكنني أن أفعل هذا؟؟؟ أنا أبحث في أساليب CommiceProperties () و updatedisplaylist () من الخطوط وليس لدي أي فكرة عما يجب إضافته/تغييره لجعل هذا؟
أنا متأكد تمامًا من أن هذه الفئة يجب أن تستخدم الرسومات. lineto () لرسم كل مؤامرة ، لذلك ستحتاج بشكل أساسي إلى "الحصول على" قيمة Alphafield الحالية بطريقة أو بأخرى ، وتطبيق رسومات. خط.
شكرًا!!
تحديث
لقد اقتربت من إجابتي.
عندما أقوم بتمديد Linerenderer ، أقوم بتجاوز updatedisplaylist () الذي يستدعي الرسومات. drawpolyline ()
أقوم بتمديد الرسومات وأتجاوز الطريقة DrawPolyline () حيث أن هذا هو المكان الذي يتم فيه رسم الخط بالفعل.
يمكنني استدعاء Linestyle () هنا وتغيير ألفا الخط ...
لا يزال لدي شيء واحد لا يمكنني اكتشافه ، من داخل طريقة drawpolyline () كيف يمكنني الوصول إلى تلك البيانات التي تملي ما يجب أن يكون ألفا؟
شكرًا!!!!
المحلول
لقد استخدمت Flex SDK 4.0 ، لكنني أعتقد أنه سيعمل على 3.4 أيضًا.
استخدم ArrayCollection بدلاً من XML ، لأنه لم يكن tsimus.
<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>
نصائح أخرى
هل حاولت استخدام عارض عنصر مخصص؟
<mx:LineSeries>
<mx:itemRenderer>
<mx:Component>
<mx:BoxItemRenderer scaleX="1" scaleY="1" alpha="{data.alpha}"/>
</mx:Component>
</mx:itemRenderer>
</mx:LineSeries>
هذا مجرد مثال سريع ، لكنني أعتقد أن Itemrenderer هو الطريق للذهاب.
في drawPolyLine
وظيفة ستحصل عليها pts:Array
. هذه مجموعة من سلسلة محددة. لسلسلة الخط ستحصل على مجموعة من 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