2009-08-21 25 views
6

Cách tốt nhất để hiển thị một số UIComponent chưa được thêm vào giai đoạn là gì? (Tôi đang sử dụng UIComponents làm trình kết xuất đồ họa cho các đối tượng và muốn hiển thị các bản sao mới để xuất, lọc hình ảnh, v.v.)Flex: Hiển thị UIComponent chưa được thực hiện thành BitmapData?

Hai chiến lược mà tôi đã thấy/sử dụng cho đến nay bao gồm việc thực hiện thành phần để đảm bảo nó gọi tất cả phương pháp vòng đời:

  1. Thêm thành phần vào Application.application, kết xuất với BitmapData.draw(), xóa thành phần. Điều này cũng tương tự như những gì tôi đã thấy được thực hiện để in các thành phần chưa được thực hiện.

  2. Thêm thành phần vào cửa sổ bật lên, hiển thị bằng BitmapData.draw(), loại bỏ cửa sổ bật lên sau khi hoàn tất hiển thị.

Tôi tin rằng cả hai chỉ dựa vào giao diện người dùng không làm mới trong khi luồng/sự kiện hiện tại đang thực thi, mặc dù (1) cũng có thể dựa vào thành phần đó.

Có cách nào tốt hơn không?

+0

Tại sao bạn cần UIComponent? Bạn có cần tương tác UI không? Nếu bạn chỉ cần nó để vẽ một cái gì đó trên, sử dụng Sprite, nó có trọng lượng nhẹ hơn. – CookieOfFortune

Trả lời

10

Những gì tôi đã sử dụng trong thời gian qua với nhiều thành công như sau:

  1. Tạo một thể hiện mới của thành phần của bạn
  2. Thêm một event listener cho FlexEvent.CREATION_COMPLETE
  3. Set thể nhìn thấy = false vào thành phần
  4. Thêm các thành phần như một đứa trẻ trong những ứng dụng chính
  5. Khi các thành phần được tạo ra, các chức năng nghe sự kiện sẽ được gọi. Phần còn lại của logic phải được đặt vào/được gọi từ chức năng trình nghe sự kiện của bạn
  6. Xóa trình xử lý sự kiện mà bạn đã thêm ở bướC# 2.
  7. Sử dụng ImageSnapshot.captureImage() hoặc captureBitmapData() để nắm bắt được trình bày trực quan của thành phần.
  8. Xóa thành phần khỏi Ứng dụng chính
  9. Xử lý dữ liệu hình ảnh khi bạn cần.

Tôi đã sử dụng tính năng này để chụp nhanh các thành phần biểu đồ Flex khác nhau để sử dụng trong PDF được tạo ở phía máy chủ. Sau khi nhận được BitmapData tôi sử dụng các lớp PNGEncoder hoặc JPEGEncoder để nén dữ liệu, sau đó mã hóa nó trong Base64 trước khi tải lên máy chủ.

+0

Chỉ cần một lưu ý, bạn có thể muốn xem xét PurePDF để làm phía khách hàng thế hệ thay vì máy chủ, nhưng phụ thuộc vào những gì bạn đang làm. Thư viện tuyệt vời! – JTtheGeek

2

Tôi khá chắc chắn bạn có thể sử dụng phương thức draw() trong BitmapData mà không cần phải có thành phần của bạn trên DisplayList.

Ví dụ: sử dụng nó khi tôi cần sửa đổi hình ảnh tôi tải với Lớp tải. Trong trình xử lý init, tôi tạo một thể hiện BitmapData và vẽ Bitmap từ thuộc tính loadInfo.content, sau đó copyPixels() hoặc bất cứ thứ gì tôi cần sửa đổi hình ảnh đã tải

+0

Bạn có thể, nhưng kể từ khi UIComponent là chưa thực hiện nó đã không đặt ra chính nó được nêu ra. Vì vậy, ví dụ, chiều cao và chiều rộng của nó là 0. –

+0

oh yeah! Tôi nhớ điều gì đó về thành phần đo với cha mẹ, vẽ trẻ em, làm mất hiệu lực, v.v. Đã không sử dụng flex trong một thời gian. Bạn không thể tạo thành phần, thêm nó vào danh sách hiển thị, nhưng thiết lập có thể nhìn thấy sai và mang trên bản vẽ? –

1

Do đó, bố cục của UIComponent có thể được gắn với nó bối cảnh. Điều này đặc biệt đúng đối với nhiều dẫn xuất của nó (ví dụ: HBox) vì tính lưu động của bố cục được gắn với kích thước của bố mẹ và số lượng anh chị em chia sẻ không gian bố mẹ của nó.

Ngoài ra, Flex có thể là một sự kiện thực sự để có được cập nhật trực quan. Thường các chức năng hiển thị quan trọng không được thực hiện đồng bộ ... có callLater, callLater2 và các phương pháp tiếp cận hacky khác giúp xử lý các thuộc tính bố cục tự động ma thuật của UIComponents một nhức đầu lớn. Thậm chí không gọi validateNow hoặc updateDisplayList có thể đảm bảo bố cục sẽ chính xác trên khung hiện tại (thay vì một vài khung hình trong tương lai).

Tôi đề nghị điều tốt nhất bạn có thể làm là không sử dụng UIComponent và thử sử dụng Sprite hoặc chương trình khác.

Cách tiếp cận của bạn để đính kèm nó nhưng làm cho nó ẩn (alpha = 0, mouseEnabled = false, mouseChildren = false) là phong nha. Bạn nên lắng nghe cuộc gọi lại FlexEvent.CREATION_COMPLETE trước khi bạn chắc chắn nó được đặt đúng. Sau đó, bạn có thể bitmapData.draw và sau đó xóa nó khỏi vùng hiển thị. Nếu bạn phải sử dụng UIComponents thì tôi không biết cách nào tốt hơn.

0

Bạn có thể gọi hàm vòng đời theo cách thủ công trước khi sử dụng BitmapData.draw(). Làm như sau.

  1. createChildren().
  2. commitProperties().
  3. updateDisplayList().
  4. bmd.draw().

2 bước đầu tiên không cần 100%, bạn có thể đặt tất cả mã vào bản cập nhậtDisplayList(). Bởi vì bạn gọi hàm bằng tay, bạn không phải lo lắng điều này được gọi bởi khung công tác Flex nhiều lần.