AS3:为文本字段设置相对于另一个动态文本字段的动态位置

时间:2010-12-08 19:02:06

标签: xml actionscript-3 actionscript charts css-position

我在AS3中创建一个XML驱动的饼图,每个饼图中有2个文本框。两个文本字段都是动态的,因为它们由XML文档填充,然后告诉它们将自己放在AS3中的位置。我让他们两个都使用相同的x和y位置来放置自己(当然它们正确地将它们放在彼此的顶部),但是我想制作其中一个字段(它就像一个标签或者更大数字和%文本字段的标题)将自身放在另一个文本字段周围的特定位置。我正在寻找的结果是让较小的“标题”文本字段显示在大约5个像素上方并左对齐到较大的“百分比”字段。那有意义吗?我对这类代码很糟糕,所以我期待你们的帮助。并提前感谢。

无论如何,这是我目前得到的两段代码。对于Tags部分,第一个块使用一个好的旧x和y方法设置“百分比”文本字段的位置。对于标题,第二个块正在为较小的“标题”文本设置位置。

//evaluate tags
private function evaluateTags():void{

for(s = 0; s

    //setting the position
    arTags[s].x= -objPie.radius * 
    objTag.distance*Math.cos(objData.midAngles[s]+Math.PI/2) - arTags[s].width/2;
    arTags[s].y= -objPie.radius *objTag.distance*Math.sin(objData.midAngles[s]+Math.PI/2) - arTags[s].height/2;

    //calculatind corner angles
    var angO1:Number = (360+90+Math.atan2(arTags[s].y,arTags[s].x)*180/Math.PI)%360
    var angO2:Number = (360+90+Math.atan2(arTags[s].y+arTags[s].height,arTags[s].x)*180/Math.PI)%360
    var angO3:Number = (360+90+Math.atan2(arTags[s].y,arTags[s].x+arTags[s].width)*180/Math.PI)%360
    var angO4:Number = (360+90+Math.atan2(arTags[s].y+arTags[s].height,arTags[s].x+arTags[s].width)*180/Math.PI)%360

    //min angle
    var minO:Number = Math.min(angO1,angO2);
    minO = Math.min(minO,angO3);
    minO = Math.min(minO,angO4);
    minO = minO * Math.PI / 180;

    //max angle
    var maxO:Number = Math.max(angO1,angO2);
    maxO = Math.max(maxO,angO3);
    maxO = Math.max(maxO,angO4);
    maxO = maxO * Math.PI / 180;

    //evaluating if the tag must be showed or not
    if(minO<objData.iniAngles[s] || maxO>objData.endAngles[s]){
    arTags[s].textShowed = false;
    }else{
    arTags[s].textShowed = true;
    }
    } 
    }

//evaluate titles
private function evaluateTitles():void{
for (s=0; s<nbS; s++) {

    //setting the position
    arTitles[s].x= -objPie.radius * objTitles.distance*Math.cos(objData.midAngles[s]+Math.PI/3) - arTitles[s].width/2;
    arTitles[s].y= -objPie.radius * objTitles.distance*Math.sin(objData.midAngles[s]+Math.PI/3) - arTitles[s].height/2;

    //calculatind corner angles
    var angO1:Number = (360+90+Math.atan2(arTitles[s].y,arTitles[s].x)*180/Math.PI)%360
    var angO2:Number = (360+90+Math.atan2(arTitles[s].y+arTitles[s].height,arTitles[s].x)*180/Math.PI)%360
    var angO3:Number = (360+90+Math.atan2(arTitles[s].y,arTitles[s].x+arTitles[s].width)*180/Math.PI)%360
    var angO4:Number = (360+90+Math.atan2(arTitles[s].y+arTitles[s].height,arTitles[s].x+arTitles[s].width)*180/Math.PI)%360

    //min angle
    var minO:Number = Math.min(angO1,angO2);
    minO = Math.min(minO,angO3);
    minO = Math.min(minO,angO4);
    minO = minO * Math.PI / 180;

    //max angle
    var maxO:Number = Math.max(angO1,angO2);
    maxO = Math.max(maxO,angO3);
    maxO = Math.max(maxO,angO4);
    maxO = maxO * Math.PI / 180;

    //evaluating if the titles must be shown or not
    if(minO<objData.iniAngles[s] || maxO>objData.endAngles[s]){
    arTitles[s].textShowed = false;
    }else{
    arTitles[s].textShowed = true;
    }
    } 
    }

1 个答案:

答案 0 :(得分:0)

一切都很好,我明白了。解决方案是:

//evaluate titles
private function evaluateTitles():void{
for (s=0; s<nbS; s++) {

    //setting the position
    arTitles[s].x= -objPie.radius * objTag.distance*Math.cos(objData.midAngles[s]+Math.PI/2) - arTags[s].width/2;
    arTitles[s].y= -objPie.radius * objTag.distance*Math.sin(objData.midAngles[s]+Math.PI/2) - arTags[s].height/2 -        arTitles[s].height + 4;

    //calculatind corner angles