2011-08-12 2 views
1

Label 구성 요소를 BitmapData 객체에 그리는 데 문제가 있습니다. 아무리 노력해도 레이블이 나타나지 않습니다. 표시 목록에 레이블을 추가하기 만하면 모든 것이 잘 작동하지만 성능상의 이유로 옵션이 아닙니다. BitmapData에 다른 종류의 것들 (벡터 아트)을 그리는 데 문제가 없지만이 레이블은 실제로 루프에 나를 던지고 있습니다.BitmapData.draw with spark.components.Label

spark.components.Label 및 mx.controls.Label에서이 문제가 발생했습니다. 이 두 클래스가 모두 IBitmapDrawable을 구현하는 UIComponent를 확장하기 때문에 이렇게 작동해야한다고 생각합니다. 그러나 Flex 프레임 워크에 익숙하지 않아서 무언가를 놓치고 있습니다. 누구든지 아이디어가 있습니까?

관련 Actionscript 및 CSS를 사용하고 있습니다.

AS :

_label = new Label(); 
    _label.styleName = "categoryButton"; 
    _label.width = 500; 
    _label.height = 40; 
    _label.text = "LABEL TEXT"; 

    var bd:BitmapData = new BitmapData(500, 500, true, 0); 
    bd.draw(_label); 
    _labelBitmap = new Bitmap(bd);  

    addChild(_labelBitmap); 

CSS : 당신이 그것을 그릴 때

@font-face { 
     src: url("assets/HelveticaNeueLTStd-Roman.otf"); 
     fontFamily: "HelveticaNeueLT-Roman"; 
     fontStyle: normal; 
     fontWeight: normal; 
     unicode-range: U+0020-U+0040, /* Punctuation, Numbers */ 
      U+0041-U+005A, /* Upper-Case A-Z */ 
      U+005B-U+0060, /* Punctuation and Symbols */ 
      U+0061-U+007A, /* Lower-Case a-z */ 
      U+007B-U+007E; /* Punctuation and Symbols */ 
     advancedAntiAliasing: true; 
     embedAsCFF: true; 
    } 

    s|Label.categoryButton { 
     fontFamily: "HelveticaNeueLT-Roman"; 
     font-size:30; 
     fontStyle:normal; 
     textAlign:center; 
     color:#cc0000; 
    } 

답변

2

으로 더 즉각적인해야하는 대신 TextField를 사용 (TextFieldAutoSize.LEFT-autoSize를 설정하고 당신의 레이블과 동일한 동작을한다)보고, 실패하면 Flex 구성 요소 라이프 사이클과 관련이 있습니다. 아이 컴퍼넌트가 DisplayList가에 따라서 상위 구성 요소에 추가 된 후이 메소드가 불려

mx_internal function childAdded(child:DisplayObject):void { 
    ... 
    UIComponent(child).initialize(); 
    ... 
} 

: UIComponent의 소스 코드를 보라. 보시다시피 자식 구성 요소가 초기화됩니다. 즉, 구성 요소가 표시 목록에 추가 될 때까지 아무 것도 그려지지 않습니다.

다음과 같이 생각할 수 있습니다. "좋아요, 그럼 초기화()를 명시 적으로 호출 할 수 있습니다." 그것도 작동하지 않습니다. 렌더링을 시작하는 기능을 살펴 유무 :

public function validateDisplayList():void 
{   
    if (invalidateDisplayListFlag) 
    { 
     var sm:ISystemManager = parent as ISystemManager; 

그것은 구성 요소가 DisplayList가 추가되지 않았습니다 null의 부모의 DisplayObject를 의미한다. 그리고 그 후에 구성 요소가 제대로 작성되지 않았기 때문에 실패 할 다른 것들이 있습니다. Flex 프레임 워크는 구성 요소가 표시 목록에없는 동안이 메서드를 호출하지 않으며 명시 적으로 호출하면 런타임 오류가 발생합니다.

결론 : Flex 구성 요소를 비트 맵으로 그리려면 displaylist에 추가해야합니다. 또는 @divillysausages가 제안한 바와 같이 순수한 ActionScript 대안을 사용하십시오.

구성 요소가 표시 목록에 추가되어 완전히 렌더링되었으므로 이벤트를 수신해야합니다 (일부 프레임을 건너 뛰라는 제안은 좋지 않으므로 아래 의견 참조).당신이로 validateNow()를 표시 목록에 객체를 추가하거나 적어도 그 폭과 높이를 설정하고 필요하지 않은 경우

var label:Label = new Label(); 
label.text = "hello"; 
label.addEventListener(FlexEvent.CREATION_COMPLETE, nowDrawTheBitmap); 
addElement(label); 
+0

나는 마침내이 일을 얻었다. 전에 레이블을 표시 목록에 추가하고 그림을 그린 다음 제거했습니다. 문제는 부모가 아직 무대에 추가되지 않았다는 것입니다. 프레임을 건너 뛰면 그림이 그 그림을 해결 한 것 같습니다. – ModernCarpentry

+0

FlexEvent.CREATION_COMPLETE을 수신하는 것이 좋습니다. 프레임을 건너 뛰면 구성 요소가 준비되었는지 100 % 확신 할 수 없습니다. – RIAstar

+0

그건 좋은 제안이야, RIAstar, 나는 프레임 스킵이 이것을 처리하는 아주 깨끗한 방법이라고 생각하지 않았다. CREATION_COMPLETE 이벤트에 대해 알아두면 좋을 것 같습니다. 그냥 테스트 해봤는데 작동하는 것처럼 보입니다 - 고마워요! – ModernCarpentry

2

지금, 완전히 레이블 또는 텍스트 만 무엇을 보여주는거야? 라벨에 배경을 설정하면 표시됩니까?

저는 100 % 확신 할 수 없지만 Flex는 무효화 원칙에 따라 작동한다고 생각합니다. 예를 들어 초기화하는 동안 여러 번 변경 될 수있는 무언가를 변경하면 구성 요소가 다음 프레임에서 다시 그리기해야하는 플래그가 설정됩니다. 그것을 그리기 전에 한두 프레임 기다려보십시오.

그건 당신이 단지 텍스트의 이미지를 원하는대로,

+1

무효가 일어나지 않을 것입니다 –

+0

나는 아직도 # 000000, 및로 스타일에서의 backgroundColor 속성을 설정 한 아무것도 나타나지 않습니다. 또한 디스플레이 목록에 추가하고 10 개의 프레임을 기다린 다음 드로잉하여 무대에서 제거했지만 여전히 작동하지 않습니다. 나는 validateNow() – ModernCarpentry

+0

validateNow()도 나를 위해 작동하지 않습니다보십시오. – ModernCarpentry