私は、チャートのデータチップに関連するこの問題やその他の問題に対処するために非常に長い週を費やしました。私はあなたが見ることができる同様の質問で同様の質問に対する答えを持っています。質問への回答としてマークされていないため、その回答の修正版をここに投稿します:-(
ChartBase.positionDataTips
2つの大規模な関数をオーバーライドする方法についての適切なドキュメントはありませんChartBase.positionAllDataTips
。フレックスチャートを自分の意志に合わせて曲げるために、これらの関数をオーバーライドする最良の方法を決定するために、mxチャートコードを掘り下げて何日も費やしました:-P
これは、データチップターゲットをカスタマイズするための(苦労して得た)コードです。これは、一連のマウスにカーソルを合わせると表示されるデフォルトのくまです。
- 拡張する新しいチャートクラス
ChartBase
またはその子を作成します。
ChartBase
スタイルshowDataTipTargets
、、をfalseに設定します。
showCustomDataTipTargets
カスタムチャートクラスに
新しいスタイルを作成します。
dataTipTargetRenderer
カスタムレンダリングを行うためのスタイルを作成することもできます。これは、はるかに洗練されたソリューションになります。
- オーバーライド
positionDataTips
してpositionAllDatatips
- 正方形を描くコードを書きましたが、より大きな円を作るには、との代わりに独自の値を使用するだけ
TOOLTIP_TARGET_RADIUS
ですTOOLTIP_TARGET_INNER_RADIUS
。
新しいオーバーライドされた関数は次のようになります。
override protected function positionDataTips():void
{
// Setting the showDataTipTargets to false will prevent
// super.positionDataTips() from drawing the default bulls-eyes.
// By setting this style, we allow super.positionDataTips() to do all
// the "heavy-lifting" involved with dataTip positioning and dataTip box rendering
// before we do our customization of the dataTipTargets
this.setStyle("showDataTipTargets", false);
// this will do all the normal rendering of the datatips and callout
// but it will not draw the dataTipTarget because that is dependent upon
// the style, showDataTipTargets
super.positionDataTips();
// now here you draw your custom datatip target.
// Use the code from ChartBase.positionDataTips as a guide,
// I have written code to simply draw a square instead of circle.
// You can do much more complex things here as needed.
if (len > 1)
{
// calloutStroke code is copied verbatim from super function
// However, you can customize the calloutStroke rendering just as easily
// by modifying the following code!
if (calloutStroke)
{
calloutStroke.apply(g,null,null);
if (tipData.isRight)
{
g.moveTo(chartLocalPts.x,
chartLocalPts.y + tipData.height / 2);
g.lineTo(tipData.x,
chartLocalPts.y + tipData.height / 2);
g.lineTo(tipData.x, tipData.y);
}
else
{
if(layoutDirection == LayoutDirection.RTL)
{
g.moveTo(chartLocalPts.x - tipData.width,
chartLocalPts.y + tipData.height / 2);
}
else
{
g.moveTo(chartLocalPts.x + tipData.width,
chartLocalPts.y + tipData.height / 2);
}
g.lineTo(tipData.x,
chartLocalPts.y + tipData.height / 2);
g.lineTo(tipData.x, tipData.y);
}
}
}
// Here is custom dataTipTarget code!!
// It draws a 5x5 square around the point on the series
var tipColor:uint = tipData.hd.contextColor;
g.lineStyle(1, tipColor, 100);
g.moveTo(tipData.x, tipData.y);
g.beginFill(0xFFFFFF, 1);
g.drawRect(tipData.x, tipData.y, 5, 5);
g.endFill();
}
ChartBase.positionDataTip()
以下は、参照用にコピーされたコードです。
if (len > 1)
{
if (calloutStroke)
{
calloutStroke.apply(g,null,null);
if (tipData.isRight)
{
g.moveTo(chartLocalPts.x,
chartLocalPts.y + tipData.height / 2);
g.lineTo(tipData.x,
chartLocalPts.y + tipData.height / 2);
g.lineTo(tipData.x, tipData.y);
}
else
{
if(layoutDirection == LayoutDirection.RTL)
{
g.moveTo(chartLocalPts.x - tipData.width,
chartLocalPts.y + tipData.height / 2);
}
else
{
g.moveTo(chartLocalPts.x + tipData.width,
chartLocalPts.y + tipData.height / 2);
}
g.lineTo(tipData.x,
chartLocalPts.y + tipData.height / 2);
g.lineTo(tipData.x, tipData.y);
}
}
}
var tipColor:uint = tipData.hd.contextColor;
g.lineStyle(1, tipColor, 100);
g.moveTo(tipData.x, tipData.y);
g.beginFill(0xFFFFFF, 1);
g.drawCircle(tipData.x, tipData.y, TOOLTIP_TARGET_RADIUS);
g.endFill();
g.beginFill(tipColor, 1);
g.drawCircle(tipData.x, tipData.y,
TOOLTIP_TARGET_INNER_RADIUS);
g.endFill();