การปรับค่าลักษณะต่างๆของ Text แต่ละบรรทัดใน RichEditableText by Ziah
Jul0
จากบล็อคที่แล้วที่ได้แสดงถึงการสร้าง Chat ด้วย RichEditableText ในบล็อคนี้จะอธิบายอีกหนึ่งความสามารถของ RichEditableText ที่มีความยืดหยุ่นมากกว่า TextArea อีกอย่างนึงครับ
โดยปกติแล้ว TextArea จะสามารถแก้ไข Property ของ Text ได้ แต่ว่าจะทำการแก้ไขทั้งหมดไม่สามารถแก้ไขเป็นส่วนๆได้ ซึ่งความสามารถนี้มีใน RichEditableText ตามชื่อของมันเลย เรามาเริ่มจากการดู Property ของมันกันเลยครับ
จากการนั่งเจาะดู Property ของมันทำให้ผมเห็นได้ว่า จริงๆแล้วการเก็บ Text ของ RichEditableText นั้นสามารถเก็บแยกๆกันเป็น Paragraph ได้เท่านี้ก็พอเดาได้ใช่ไหมครับว่าเราจะแก้ไข Text แยกกันเป็นส่วนๆได้อย่างไร โดยโค้ดมีหน้าตาดังนี้ครับ
var pe:ParagraphElement = new ParagraphElement; //สร้างตัวแปรย่อหน้า
var se:SpanElement = new SpanElement; //สร้างตัวแปรบรรทัด
se.text = obj.message; //ใส่ค่ากับ Span0
se.color = "#00FFFF"; //ใส่สี ในส่วนนี้สามารถกำหนดค่าลักษณะต่างๆของ Text ส่วนนี้ได้เลยครับ
pe.addChild(se) //กำหนดเสสร็จแล้วก็จับใส่ตัวแปรย่อหน้าเลยครับ
txtChat.content.addChild(pe); //แล้วก็ไปจับใส่ RichEditableText ได้เลยครับ โดยนำไป addChild ใส่ Property content ที่เป็น TextFlow
จากโค้ดข้างต้นเราจะใช้โค้ดดังกล่าวแทน txtChat.text+=obj.message เหมือนทั่วๆไป แต่เราจะสร้างตัวแปรเพื่อกำหนัดคุณลักษณะต่างๆของ Text ก่อนแล้วค่อยในไปใส่ RichEditableText ของเรา แล้วเราจะได้ผลลัพธ์ดังนี้เลยครับ
สร้างห้อง Chat โดยใช้ Spark ของ Adobe Flex by Ziah
Jul1
ในที่จริงแล้วการสร้างห้อง Chat ดูเหมือนจะง่าย แต่หลังจากได้ทำแล้วส่วนที่มีปัญหาคือการเลื่อน Scrollbar อัตโนมัติทำงานไม่ถูกต้องเท่าที่ควร ในวันนี้ผมเลยจะมาเสนอวิธีการสร้างห้อง Chat และทำให้มีการ Scroll ที่ถูกต้องครับ
<s:TextInput id="txtChatInput" keyDown="sendChat(event)" text="" x="7" y="133"/>
<s:RichEditableText id="txtChat" clipAndEnableScrolling="true" x="13" y="28" width="201" height="97" editable="false" selectable="false"/>
<s:VScrollBar id="scrllChat" viewport="{txtChat}" fixedThumbSize="true" skinClass="components.chat_scrollVerticalScrollbar" x="213" y="27"/>
จากด้านบน
- TextInput คือส่วนที่จะให้ผู้ใช้ได้กรอกข้อความ
- RichEditableText เป็นคอมโพเนนท์ที่คล้ายๆ TextArea แต่ว่าเป็นของ Tag Spark โดยมันมีความสามารถต่างๆเพิ่มเข้ามาทำให้ใช้งานได้ดีมากยิ่งๆขึ้นส่วนสำคัญคือสามารถใช้กับ Custom ScrollBar ของเราได้ดังข้อถัดไป
- VScrollBar จากที่เห็นจะเป็นการใส่สกินของเราเองและใส่ viewport คือ RichEditableText ของเรา
ทีนี้โดยทั่วไปแล้ว เมื่อผู้ใช้ได้รับค่าเข้ามาเพื่ออัพเดท Chat เราจะทำการเลื่อนไปที่ล่างสุดโดยอัติโนมัติ แต่โค้ดโดยทั่วไปและ ตาม website ต่างๆได้เสนอมาว่าให้ใส่โค้ดดังนี้ในฟังก์ชั่นอัพเดทค่าห้อง Chat ของเรา ( id ของคอมโพเนนท์ อ้างอิงจากคอมโพเนนท์ด้านบน)
txtChat.appendText("\n"+obj.message); //เพิ่มค่าใน Chat
txtChat.validateNow(); //อัพเดทค่าล่าสุด
scrllChat.value = txtChat.contentHeight; //แบบที่ 1 ให้ Scroll ไปที่ส่วนที่ท้ายสุดของ chat
scrllChat.value = scrllChat.maximum ; //แบบที่ 2 ให้ Scroll เป็นค่าที่สูงที่สุด(ท้ายสุด) ของ Scroll
แต่ว่าทั้งสองแบบนั้น เมื่อเราทำการพิมหลายๆบรรทัดก็ยังคงทำให้เกิดบั๊คตามมา (แบบที่1มักเป็นกับแค่เพียงภาษาไทย แบบที่สองเป็นทั้งสองภาษา)
ซึ่งหลังจากที่ได้อ่าน Property ต่างๆของ RichEditableText ทำให้ได้การเขียนคำสั่งที่ทำให้ Chat สามารถทำงานได้อย่างถูกต้องตลอดดังนี้ครับ
txtChat.appendText("\n"+obj.message); //เพิ่มค่าใน Chat
txtChat.validateNow(); //อัพเดทค่าล่าสุด
txtChat.scrollToRange(txtChat.text.length,txtChat.text.length); //ใช้ฟังก์ชั่นเลื่อน Scroll ไปที่ตำแหน่งสุดท้ายของอักษรใน Chat ของเรา
จากด้านบนจะทำให้การเลื่อน Scroll อัตโนมัติของเราเลื่อลงมาล่าสุดได้ตลอดถูกต้องแล้วล่ะครับ
Reference : http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/RichEditableText.html
วาดเส้นง่ายๆกับแท็ก Spark Path by Ziah
Feb0
โดยปกติแล้วโปรแกรมเมอร์อย่างๆเรา วาดเส้นต่างๆก็ลำบากแล้วใช่ไหมล่ะครับ
อย่างเช่นถ้าจะให้วาดสามเหลี่ยมเป็นกราฟ ปกติแล้วก็คงจะสร้าง MovieClip มาแล้วใช้ AS3 วาดเส้นเอาโดยใช้ฟังก์ชั่นวาดรูปพื้นฐาน graphics.lineTo แบบนี้
var triangleShape:Shape = new Shape();
triangleShape.graphics.moveTo(0,0);
triangleShape.graphics.lineTo(100,0);
triangleShape.graphics.lineTo(100,100);
triangleShape.graphics.lineTo(0,100);
แต่แล้วใน Flex 4 หลังจากมี Spark แท็กเราก็สามารถวาดเส้นง่ายๆได้แล้วล่ะครับ
โดยวิธีที่จะมาเสนอในวันนี้คือแท็ก <s:Path> ครับ โดยแท็กนี้เราสามารถวาดเส้นต่างๆภายในบรรทัดเดียวได้เลยล่ะครับ!
โดยเจ้า Spark Path นี้มี Attribute ที่สำคัญหลักๆตัวเดียวเลยครับคือ data ที่มีไทป์เป็น String ธรรมดาๆนี่แหละครับ
เราสามารถวาดเส้นได้ดังนี้ครับ
ตัวอย่าง:
<s:Path data=”M 0 0 L 100 0 L 100 100 L 0 100 Z”>
<s:stroke>
<s:SolidColorStroke color=”#333333″ caps=”square” joints=”miter” />
</s:stroke>
<s:fill>
<s:SolidColor color=”#00CCFF” />
</s:fill>
</s:Path>
Stroke จะมีไว้กำหนดลักษณะของเส้น และ fill จะมีไว้กำหนดลักษณะของสีด้านในครับ
ทีนี้พระเอกของเราคือเจ้า data โดยเจ้า data จะเป็นตัวกำหนดรูปร่างของเส้นวาดๆของเราครับ
วิธีใช้ก็เพียงแค่ใส่ตัวหนังสือที่ระบุความสมารถนำหน้าแล้วเคาะเว้นตามด้วยค่าต่างๆครับ
โดยตัวหนังสือจะกำหนดสิ่งต่างๆดังนี้
- M / m
- L / l
- C / c
- Q / q
- H / h
- V / v
- Z / z
ทีนี้เราก็เพียงนำค่าต่างๆมาต่อกันเป็น String โดยมีเว้นวรรคคั่นก็สามารถวาดรูปในบรรทัดเดียวได้แล้วครับ
ถ้าค่าของเราต้องเปลี่ยนจากการคำนวนก็เพียงตั้ง id ให้กับ Path ของเราแล้วเซ็ทค่า data ให้ตรงกับ String ที่ผ่านการคำนวนมาแล้ว
เช่นดังนี้ครับ
graphStat.data = “M “+musicX+” “+musicY+” L “+entertainX+” “+entertainY+” L “+charmX+” “+charmY+” Z”;
เท่านี้เราก็จะได้กราฟสามเหลี่ยมตามค่าที่เราตั้งไว้ได้ครับ
การเปลี่ยนโค้ดจาก MX Compenent (Flex 3) มาเป็น Spark Component (Flex 4) by Ziah
Mar0
จากครั้งที่แล้วที่ผมได้อธิบายถึงการเปลี่ยนโค้ดจาก Flex 3 มาใช้ใน Flex 4 นะครับซึ่งจะเป็นรูปแบบของโค้ดหรือการทำงาน ซึ่งในครั้งนี้ผมจะอธิบาย Component ต่างๆที่ส่วนมากจะถูกเปลี่ยนมาใช้กับ Spark ใน Flex 4 กันนะครับ
แท็กที่ถูกเปลี่ยนจาก MX มาใช้แบบ Spark
MX Component (Flex 3) | Spark Component (Flex 4) |
<mx:Button> | <s:Button> |
<mx:ButtonBar> | <s:ButtonBar> |
<mx:CheckBox> | <s:CheckBox> |
<mx:ComboBox> | <s:DropDownList> |
<mx:HorizontalList> | <s:List>* |
<mx:HRule> | <s:Line> |
<mx:HScrollBar> | <s:HSlider> |
<mx:List> | <s:List>** |
<mx:NumericStepper> | <s:NumericStepper> |
<mx:RadioButton> | <s:RadioButton> |
<mx:RadioButtonGroup> | <s:RadioButtonGroup> |
<mx:TextArea> | <s:TextArea> |
<mx:TabBar> | <s:TabBar> |
<mx:TextInput> | <s:TextInput> |
<mx:TileList> | <s:List>*** |
<mx:ToggleButtonBar> | <s:ButtonBar> |
<mx:VideoDisplay> | <s:VideoPlayer> |
<mx:VRule> | <s:Line> |
<mx:VScrollBar> | <s:VScrollBar> |
<mx:VSlider> | <s:VSlider> |
<mx:Application> | <s:Application> |
<mx:Window> | <s:Window> |
<mx:WindowedApplication> | <s:WindowedApplication> |
<mx:Canvas> | <s:Group> |
<mx:HBox> | <s:HGroup> |
<mx:Panel> | <s:Panel> |
<mx:Tile> | <s:Group>*** |
<mx:VBox> | <s:VGroup> |
*กำหนด Layout เป็น HorizontalLayout โดยใช้แท็ก <s:layout>
**กำหนด Layout เป็น VerticalLayout โดยใช้แท็ก <s:layout>
***กำหนด Layout เป็น TileLayout โดยใช้แท็ก <s:layout>
ตัวอย่างการใช้แท็ก Layout
<s:List>
<s:layout>
<s:TileLayout />
</s:layout>
</s:List>
แล้วอย่าลืมเปลี่ยน namespace อย่างที่ได้อธิบายใน การนำโปรเจ็คแอปพลิเคชั่นใน Flex Builder 3 ไปใช้งานใน Flash Builder 4 ไว้แล้วนะครับ เท่านี้ก็สามารถเปลี่ยน MX component ที่ใช้ใน Flex 3 มาเป็น Spark component ของ Flex 4 ได้แล้วล่ะครับ