Archive for July, 2008

มาทำหนังสือพลิกไป~พลิกมากันเถอะ (ภาคละเอียดขึ้น)

จาก entry ก่อนหน้านี้
ผมพูดถึงเรื่องการทำหน้าหนังสือพลิกไป-พลิกมาด้วย Open Source Flash สำเร็จรูป -
ที่ชื่อ Dynamic Page Flip ไปแล้ว
entry นี้เป็นเรื่องต่อเนื่องกับ entry ที่ว่าครับ ..แต่ไม่ได้พูดถึงเรื่องใหม่นะ
จริงๆ แล้วเป็นเรื่องเดิม (กับ entry ที่ว่า) เสียด้วยซ้ำไปครับ

สืบเนื่องจากมี comment หนึ่ง (ณ วันที่พิมพ์ entry นี้ มันมีแค่ comment เดียว )
มาโพสท์ไว้ว่าว่า ‘..ยากไปนิด..’
ทั้งๆ ที่โดยส่วนตัวผมแล้วผมมองว่าเป็นเรื่องที่ค่อนข้างจะเข้าใจได้ไม่ยากนักแล้วนะ..
(เพราะผมคิดเอาว่ามันเป็นเรื่องที่ไม่ต้องไปแตะ Flash เลย ก็สามารถใช้งานได้
และเรื่อง XML แม้จะเป็นเรื่องใหม่สำหรับหลายๆ คน แต่ถ้าในขั้นพื้นฐานก็เป็นสิ่งที่เข้าใจได้ไม่ยาก)

ซึ่งทั้งหมดทั้งมวลแล้ว ..ผมถือว่าเป็นความล้มเหลวของผมที่เขียนเรื่อง (ที่ผมคิดว่า) ง่าย แล้วมีคนไม่เข้าใจครับ
ฉะนั้น.. จึงพยายามเรียบเรียงใหม่ด้วยการเอาตัวอย่างมาว่ากันให้เห็นซะเลย
รอบนี้ถ้ายังจะไม่รู้เรื่องอีก.. ให้มันรู้ไปเอ้า!


เริ่มแรก.. ผมเตรียมไฟล์เพื่อนำมาใช้เป็นหน้าหนังสือตามนี้นะครับ

 

ไฟล์แต่ละไฟล์มีชื่อตามด้านมุมขวา-ล่างของรูปอยู่แล้วครับ
สังเกตุดีๆ ว่าไฟล์แต่ละไฟล์จะเป็นไฟล์นามสกุล .JPG ที่มีขนาด 200×250 pixel (ซึ่งเป็นขนาดของหน้าหนังสือหนึ่งหน้าในตัวอย่างนี้)
..เว้นอยู่ 3 ไฟล์!
หนึ่งคือไฟล์ SPREAD_F+G.JPG (รูปใหญ่ที่สุด) ที่เป็นไฟล์ .JPG ขนาด 400×250 pixel
(ขนาด 400×250 มีความกว้างเป็นสองเท่าของหน้าปกติที่มีขนาด 200×250
ซึ่งนั่นหมายความว่าหน้าหนังสือนี้เป็นหน้าคู่ 2 หน้าติดกันนั่นเองครับ
..ในที่นี้ผมทำไฟล์นี้ขึ้นมาเพื่อจะยกตัวอย่างให้เข้าใจถึงรูปแบบหน้าหนังสือแบบหน้าคู่ที่ไม่ต้องหั่นไฟล์แยกเป็นสองไฟล์)

และอีกสองไฟล์คือไฟล์ TRANSPARENT_I.SWF และ TRANSPARENT_J.SWF
ที่มีขนาดกว้าง x ยาวเท่ากับหน้าปกติหนึ่งหน้าทั่วไป ต่างกันตรงที่ไฟล์สองไฟล์นี้เป็นไฟล์นามสกุล .SWF
(ซึ่งก็คือไฟล์ Flash นั่นเอง ..ในที่นี้ผมพยายามเอาไฟล์ .SWF มาเป็นตัวอย่าง
เพื่อที่จะให้เห็นรูปแบบการทำหน้าโปร่งใส (Transparent) ประกอบกับการมีภาพเคลื่อนไหวภายในหน้าหนังสือ
ซึ่งทั้งสองคุณสมบัติที่ว่ามานั้น ..ไฟล์ .JPG ทำไม่ได้ครับ)

อ้อ ลืมบอก
ไฟล์ .SWF สองไฟล์ตามที่เห็นข้างบน ..จะเห็นว่ามีวงรีอยู่กลางทั้งสองภาพ
นั่นคือส่วนที่ผมทำเป็นส่วนโปร่งใสไว้นะครับ เดี๋ยวพอแสดงตัวอย่างให้ดูจะเห็นภาพครับผม

ทีนี้ผมจะสมมุติว่าอิง path ของไฟล์หน้าหนังสือทั้งหมดรวมถึงไฟล์ PREPAGE.JPG ที่จะทำหน้าที่ไม่ใช่หน้าหนังสือจริง -
ไว้ในโฟลเดอร์ที่ชื่อ pages เช่นเดียวกับที่ไฟล์ที่โหลดจากต้นฉบับเก็บไว้นะครับ
จะได้เข้าใจตรงกันได้ไม่ยาก


ผมขอเกริ่นถึงภาษา XML สักนิดละกันนะครับ จะได้ง่ายต่อการทำความเข้าใจต่อไป
ในที่นี้ขอเกริ่นเฉพาะประเด็นที่เกี่ยวกับเรื่องนี้เท่านั้นละกันครับ อย่างย่อที่สุด
(ขืนพล่ามมากๆ จะกลายเป็น entry เรื่อง XML ไป)

  • สิ่งที่อยู่ในวงเล็บ < > (รวมถึงตัววงเล็บเองด้วย) 1 วงเล็บ เรียกว่า 1 tag
    ตัวอย่างเช่น <family> นับเป็น tag 1 อัน
    ชื่อว่า tag family
  • tag มีสองอย่างใหญ่ๆ คือ tag เปิดและ tag ปิด
    tag ทุก tag จะต้องมีเป็นคู่ คือ ทั้ง tag เปิดและ tag ปิด เสมอ
    ตัวอย่างเช่น <family> </family>
    โดย tag แรก คือ tag เปิด เขียนลักษณะปกติ
    ส่วน tag หลัง คือ tag ปิด สังเกตว่า tag ปิดมีเครื่องหมาย / อยู่หน้าชื่อ tag ด้วย
  • จริงๆ มี tag อีกประเภทหนึ่ง ลักษณะประมาณนี้ <family />
    สังเกตว่ามีเครื่องหมาย / อยู่หลังชื่อ tag เลย และไม่มี tag ปิด
    tag ลักษณะนี้หมายถึง tag ที่ปิดตัวเองเสร็จสรรพในตัว
    ใช้เขียนแทน <family></family>ได้ในกรณีไม่มีข้อมูลแทรกตรงกลางระหว่าง tag เปิดและ tag ปิด
  • tag สามารถเขียนซ้อนคั่นกลางกันได้ เพื่ออธิบายข้อมูลที่เป็นลำดับลงไป
    ตัวอย่างเช่น <family><member /></family>
    สังเกตว่ามี tag member คั่นกลางระหว่าง tag เปิดและปิดของ family
  • สิ่งที่อยู่ระหว่าง tag เปิดและ tag ปิด (รวมถึงตัว tag ที่เปิดและปิดนั้นด้วย)
    เราเรียกทั้งหมดนั้น 1 ชุดว่า element
    ตัวอย่างเช่น <family><member /></family>
    เราเรียก tag เปิดและ tag ปิด (สีแดง) ว่า tag family หนึ่งคู่
    (โดยปกติ ถ้าพูดถึง tag จะหมายถึง tag หนึ่งคู่ นอกจากจะเจาะจงว่า tag เปิดหรือปิด จึงหมายถึง tag 1 อัน)
    แต่ถ้าเรารวมทั้งสีแดงและสีน้ำเงินทั้งหมด นั่นคือ element family หนึ่งอัน
  • tag เปิด (หรือ tag ที่ปิดตัวเองเสร็จสรรพ) สามารถระบุข้อมูลเพิ่มเติมลักษณะนี้ได้..
    <family name=”พาลธมิตรกุล”>
    สังเกตว่ามี name=”พาลธมิตรกุล” เพิ่มขึ้นมาใน tag เปิด family
    ในที่นี้ เราเรียก name ว่าเป็น attribute และ พาลธมิตรกุล เป็นค่าของ attribute ที่ชื่อ name
    ใน 1 tag สามารถกำหนด attribute กี่อันก็ได้ แต่ต้องไม่มีชื่อ attribute ซ้ำกันใน tag เดียวกัน
    เช่น <family name=”พาลธมิตรกุล” address=”พื้นที่ทับซ้อนชุมชนมัฆวาน”>
  • ลำดับของ attribute ไม่เป็นประเด็นนะครับ จะกำหนดอะไรก่อน อะไรหลังก็ได้
    เช่น <family name=”พาลธมิตรกุล” address=”พื้นที่ทับซ้อนชุมชนรักทวาร”>
    มีค่าไม่ต่างกับ <family address=”พื้นที่ทับซ้อนชุมชนรักทวาร” name=”พาลธมิตรกุล”>
    (จริงๆ ลำดับก่อนหลังของ element ชื่อเดียวกันในจุดเดียวกันก็ไม่ถือว่าเป็นประเด็นครับสำหรับ XML ทั่วไป
    แต่ในกรณีของ Dynamic Page Flip มันเป็นประเด็น เพราะต้องลำดับหน้าด้วยลำดับ element)
  • กฎของไวยากรณ์ XML ที่สำคัญอื่นๆ ก็เช่น..
    เอกสาร XML 1 ไฟล์ มี element หลักได้แค่อันเดียวเท่านั้น
    แต่ใน element หลักนั้นจะมี element ยิบย่อยเท่าไหร่ก็ได้
    (เราเรียก element อันนอกสุดอันเดียวที่ครอบข้อมูลทั้งหมดนั้นว่า root element)
    นอกจากนี้ ชื่อของ tag และ attribute ต้องเป็นภาษาปะกิตหรือตัวเลข หรือสัญลักษณ์บางอย่างเท่านั้น
    (ต้องขึ้นต้นชื่อด้วยภาษาปะกิตเท่านั้น)
    ตัวอย่างเช่น <family /> <member /> หรือ <hello123 /> เป็นต้น

ยกตัวอย่างข้อมูล XML เล่นๆ สักหนึ่งชุดละกันครับ

<family name="พาลธมิตรกุล" address="พื้นที่ทับซ้อนชุมชนรักทวาร" >
<member name="แป๊ะยิ้ม ลิ้มดอกทอง" status="หัวหน้าครอบครัว" />
<member name="ลำยอง ผีเมือง " status="รองหัวหน้าครอบครัว" />
<member name="สมสู่ พงษ์ปฏิกูล" />
<member name="สุริยะใส กะโหลกกะลา " />
</family>

หากอ่านข้อมูลดังกล่าวด้วยตาเปล่า ..อาจจะแปลข้อมูลได้ว่า -
เป็นข้อมูลของครอบครัวครอบครัวหนึ่ง (เพราะครอบด้วย tag family)
โดยชื่อตระกูลและที่อยู่ของครอบครัวนี้ถูกระบุใน attribute ชื่อ name และ address ใน tag ชื่อfamily
..ภายในครอบครัวนี้ ประกอบด้วยสมาชิก (แปลจาก tag ชื่อ member)
จากตัวอย่างมี element member อยู่ 4 element ด้วยกัน แปลคร่าวๆ ว่าข้อมูลนี้ระบุว่าครอบครัวนี้มีสมาชิกอยู่ 4 คน
ในแต่ละ element ที่ชื่อ member ระบุชื่อสมาชิกแต่ละคนด้วย attribute ชื่อ name
(attrbute ชื่อ name ใน element ชื่อ family และ member -
แม้จะเขียนเหมือนกัน แต่ก็ให้ค่าต่างกันตาม tag ที่มันอยู่)

นอกจากนี้ หากสังเกตจะเห็นว่า สมาชิกสองคนแรกมี attribute ชื่อ status อธิบายสถานะในครอบครัวเพิ่มเติมด้วย
(แต่สมาชิกอีกสองคนไม่มี ..ซึ่งจริงๆ สำหรับการเขียน XML เบื้องต้นถือว่าถูกต้องตามหลักไวยากรณ์ XML)

เข้าใจคร่าวๆ ตามนี้ก็โอเคครับ..
เริ่มเข้าเนื้อหาจริงได้


เริ่มแรก..ผมจะขอยกตัวอย่างโดยใช้แค่ 4 หน้าปกติก่อนนะครับ

XML

1 <content width="200" height="250" hcover="false" transparency="true" prepage="pages/PREPAGE.JPG">
2
<page src="pages/A.JPG" preLoad="true" />
3
<page src="pages/B.JPG" preLoad="true" />
4
<page src="pages/C.JPG" preLoad="true" />
5
<page src="pages/D.JPG" preLoad="true" />
6 </content>

ตัวเลขหน้าบรรทัดนั่นไม่ใช่ส่วนหนึ่งของ XML นะครับ แต่เป็นเลขบรรทัดที่เอาไว้อ้างอิงเวลาอธิบาย
เวลาจะนำไปใช้หรือจะพิมพ์ XML ขึ้นมา ไม่ต้องพิมพ์เลขบรรทัดนะครับ

อธิบายแยกตามแต่ละส่วนนะครับ

  • บรรทัดที่ 1 เป็น tag เปิดของ root element ของเอกสาร xml นี้
    บรรทัดนี้ค่อนข้างสำคัญทีเดียวครับ เพราะต้องกำหนดรายละเอียดต่างๆ ของภาพรวมของหนังสือ -
    ผ่านทาง attribute ของ element นี้ ที่บรรทัดนี้
  • บรรทัดที่ 2 – 5 เป็น element ที่อธิบายข้อมูลของหน้าหนังสือแต่ละหน้า
    ซึ่งแน่นอนครับ.. หนึ่งบรรทัดในที่นี้หมายถึงหนึ่งหน้าหนังสือนั่นเอง
    (สำหรับผู้ที่โหลดไฟล์ Source ต้นฉบับของ Dynamic Page Flip มา
    คงจะเห็นการเคาะเว้นวรรคบรรทัดของ element ชื่อ page แบบแปลก โดยเคาะเว้นบรรทัดตาม attribute
    ซึ่งถ้าถามว่าอะไรผิด อะไรถูก ..คำตอบคือใช้ได้ทั้งสองแบบนั่นแหละครับ
    เพราะถ้าลบไอ้ที่เคาะเว้นบรรทัดออก ผลลัพธ์ก็เหมือนที่ผมมพิมพ์นี่แหละ)

    ..นอกจากนี้ ถ้าสังเกตดีๆ จะเห็นว่า
    มีการระบุรายละเอียดต่างๆ ของหน้าแต่ละหน้า (ในแต่ละ element ชื่อ page) -
    ด้วย attribute ชื่อ src และ preLoad (จริงๆ มีมากกว่านี้นะครับ แต่นี่แค่ยกตัวอย่างให้เข้าใจภาพรวมทั้งหมดก่อน)
    ..และถ้าสังเกตเพิ่มเติม จะเห็นว่า element ชื่อ page ทั้งหมดนี้เป็น element ที่ปิดในตัวเอง ไม่มี tag ปิดต่อท้าย
    ถ้าใครอยากพิสูจน์ว่าสามารถเปลี่ยนเป็น tag เปิด-ปิดแบบ <page ></page> แทนได้หรือไม่ ก็ลองดูได้ครับ
    (ผู้พัฒนาเขาเขียนตัวอย่างแบบนี้ก็เพื่อลดรูปไม่ให้เยอะเกินไปจนตาลายนั่นเองครับ)
  • บรรทัดที่ 6 คือ tag ปิดของบรรทัดที่ 1 นั่นเองครับ

จากตัวอย่างข้อมูล XML ข้างต้น ..ถ้าแปลความก็อาจจะแปลได้ว่า
ข้อมูลของหนังสือเล่มหนึ่ง (root element ชื่อ content)
ระบุ attribute ใน element ชื่อ content ว่า..

  • width=”200″ หมายถึงหนังสือเล่มนี้มีความกว้าง (แนวนอน) ของหน้าหนังสือแต่ละหน้า 200 pixels (หน่วยเป็น pixel)
    โดยทั่วไปควรกำหนดค่านี้เสมอ โดยที่ค่าของ attribute ควรเป็นจำนวนเต็มบวก
  • height=”250″ หมายถึงความสูงของหน้าหนังสือ (แนวตั้ง) เท่ากับ 200 pixels
    โดยทั่วไปควรกำหนดค่านี้เสมอ ควรเป็นจำนวนเต็มบวกเช่นกัน
  • hcover=”false” หมายถึงกำหนดให้ปกหนังสือเป็นปกแข็ง
    (hcover มาจาก hard cover ..อันนี้เดานะครับ คำเต็มอาจผิดแต่ความหมายถูกล่ะน่า)
    ในที่นี้ระบุ hcover=”false” ซึ่งหมายถึง ปกแข็ง=เป็นเท็จ ซึ่งก็เท่ากับเป็นปกอ่อนนั่นเองครับ
    (ถ้าจะระบุ attribute ให้เป็นปกแข็งก็เปลี่ยนเป็น hcover=”true” ครับ
    ซึ่งแปลว่า ปกแข็ง=เป็นจริง นั่นเอง)

    หากไม่ระบุ attribute นี้ก็ได้นะครับ โดยปกจะถูกกำหนดเป็นปกอ่อนอัตโนมัติ
  • transparency=”true” หมายถึงการกำหนดให้หนังสือเล่มนี้แสดงผลส่วนที่โปร่งใสเป็นแบบพลาสติกใส
    ในที่นี้ระบุค่าใน attribute เป็น true ซึ่งหมายถึงเป็นจริงครับ
    attribute นี้ไม่ระบุก็ได้ โดยค่านี้จะถูกตั้งเป็น false อัตโนมัติ
    (ถ้าจะกำหนดเป็น false ก็คล้ายๆ attribute ตะกี๊ที่อธิบายไป)
    ..ผมเคยบอกไว้ใน entry ก่อนหน้าว่า ถ้ากำหนด transparency เป็น false มักจะพบ bug ในการแสดงผล
    ดังนั้นในตัวอย่างทั้งหมดผมจะกำหนด transparency=”true” ทั้งหมดนะครับ -
    แม้ว่าตัวอย่างจะแสดงผลโปร่งใสหรือไม่ก็ตาม
  • prepage=”pages/PREPAGE.JPG” หมายถึงการกำหนดให้แสดงผลหน้าก่อนหน้าแรก
    ซึ่งถ้าหากจะตัด attribute นี้ทิ้งไปเลยก็ได้ครับหากไม่ต้องการ ซึ่งก็หมายถึงไม่ให้มีหน้า prepage ขึ้นมานั่นเอง
    แต่ในที่นี้แสดงให้ดูก่อนละกัน

เมื่อจบ element ชื่อ content บรรทัดที่ 1 แล้ว
ก็เข้าสู่ element ชื่อ page ซึ่งหมายถึงแต่ละหน้า..
โดย element ชื่อ page มี attribute ตามตัวอย่างดังนี้ครับ..

  • src=”pages/A.JPG” หมายถึง path หรือ URL ของไฟล์ภาพนั้นๆ
  • preLoad=”true” หมายถึง การระบุให้หน้านั้นๆ ถูกโหลดให้เสร็จก่อนเริ่มแสดงผลหนังสือ
    ในที่นี้กำหนดให้มีค่าเป็นจริงทั้งสี่หน้า ซึ่งนั่นหมายถึงไฟล์ถูกโหลดจนเสร็จทั้งหมดแล้วค่อยแสดง
    ..กรณีที่ไม่ได้แสดงผลบนเว็บไซต์ ตั้งค่า attribute นี้เป็นอะไรก็ไม่เป็นประเด็นครับ
    (เพราะคอมพิวเตอร์ดึงไฟล์ในเครื่องได้เร็วจนไม่ต่างกัน)
    แต่ในกรณีบนเว็บไซต์.. ถ้ากำหนด attribute นี้มีค่าเป็น false จะทำให้ไฟล์หน้านั้นๆ ถูกโหลดพลางๆ ระหว่างเปิดหนังสือ
    (ซึ่งอาจจะส่งผลให้การเปิดหนังสือเกิดอาการเพี้ยนๆ แปลกๆ ได้)
    ตรงนี้ใครจะเลือกใช้ยังไงแล้วแต่ประสงค์ครับ แต่ในที่นี้ผมขอยกตัวอย่างแบบนี้

เข้าใจภาพกว้างๆ นะครับ
ทีนี้จะไปเรื่องอื่นๆ บ้าง


ทีนี้จะมาลองทดสอบการกำหนด attribute ชื่อ canTear ซึ่งทำให้สามารถฉีกหน้านั้นทิ้งได้ล่ะครับ

XML

1 <content width="200" height="250" hcover="false" transparency="true" prepage="pages/PREPAGE.JPG">
2
<page src="pages/A.JPG" preLoad="true" />
3
<page src="pages/B.JPG" canTear="true" preLoad="true" />
4
<page src="pages/C.JPG" preLoad="true" />
5
<page src="pages/D.JPG" preLoad="true" />
6 </content>

ข้อมูล XML แทบจะเหมือนกับตัวอย่างแรกเลยครับ
ต่างกันตรงบรรทัดที่ 3 ที่มี attribute ชื่อ canTear ซึ่งมีค่า =”true” เอาไว้ด้วย
(เทียบกับ element ชื่อ page อันอื่นๆ ที่ไม่ได้ระบุ attribute ชื่อ canTear ไว้เลย
เดาได้ใช่ไหมครับว่าถ้าไม่ได้ระบุจะไม่สามารถฉีกหน้านั้นได้ นั่นเพราะค่าเริ่มต้นที่ถูกตั้งไว้คือ false)

ซึ่ง canTear=”true” นี่แหละครับที่สามารถทำให้ฉีกหน้านั้นๆ ได้
ไม่เชื่อก็ลองโลด!

ประเด็นสำหรับการกำหนด attribute ชื่อ canTear คือ
หน้าที่กำหนดต้องเป็นหน้าคู่เท่านั้นครับ (หน้าที่เมื่อพลิกเปิดแล้วอยู่ทางซ้าย)
จริงๆ ผมว่าน่าจะกำหนดที่หน้าไหนก็ได้นะ
แต่ในเมื่อเขาทำมาแบบนั้น.. เราก็ก้มหน้าก้มตาใช้ไป ไม่ควรปริปากบ่น

ในตัวอย่างนี้ผมระบุให้ attribute ชื่อ canTear อยู่ก่อนหน้า attribute ชื่อ preLoad
ก็ตามที่บอกไปก่อนหน้านั่นแหละครับว่ามันไม่เป็นประเด็น จะ attribute ไหนก่อน ไหนหลังก็ได้
จะเอา attribute ชื่อ src ไปไว้หลังสุดก็ได้ ตราบใดที่มันอยู่ใน element เดียวกัน

(ลองฉีกแล้ว..สังเกตเห็นอะไรไหมครับ?
จะเห็นว่า หน้าที่ถูกกำหนดให้ฉีกได้ คือหน้าที่ 2 ของหนังสือทั้งหมด 4 หน้า
ลองนึกตามดีๆ ครับว่าเมื่อหน้าที่ 2 (B.JPG) ถูกฉีก -
หน้าที่ 1 (A.JPG) ซึ่งอยู่ในกระดาษแผ่นเดียวกัน) ต้องถูกฉีกไปพร้อมกันด้วยเสมอ!
มันก็ลักษณะเดียวกับหนังสือจริงๆ น่ะครับ คือคุณจะฉีกหนังสือแค่หน้าเดียวไม่ได้เสมอ ยังไงมันก็ต้องไปทั้งแผ่น ทั้งสองหน้า!
ถ้าหน้าที่ canTear=”true” เป็นหน้าเลขคู่ซึ่งมีค่าเท่ากับ N
หน้า N-1 ก็ถูกฉีกได้เช่นเดียวกัน
นั่นก็แปลว่า.. จากตัวอย่างข้างต้นที่ระบุให้สามารถฉีกหน้าที่ 2 ได้
ลองเริ่มฉีกตั้งกะหน้าที่ 1 เลยครับ สามารถฉีกได้เหมือนกัน เพราะยังไงมันก็แผ่นเดียวกัน!

ปัญหาหนึ่งที่เกิดขึ้นเมื่อกำหนดให้สามารถฉีกหน้าหนังสือได้ คือเรื่องของการเรียกหน้าหนังสือผ่านช่องกรอกหน้าหนังสือด้านล่าง
ลองทดสอบเล่นๆ ดูครับ ว่าเมื่อฉีกหน้าที่ 2 หรือ 1 ไปแล้ว ลองเรียก Go to หน้าที่ 1 หรือ 2 แล้วเกิดผลอะไรขึ้น?


มาลอง attribute ชื่อ isSpread เพื่อกำหนดให้แสดงผลหน้าคู่แบบไม่ต้องหั่นภาพดูครับ

XML

1 <content width="200" height="250" hcover="false" transparency="true" prepage="pages/PREPAGE.JPG">
2
<page src="pages/A.JPG" preLoad="true" />
3
<page src="pages/B.JPG" preLoad="true" />
4
<page src="pages/C.JPG" preLoad="true" />
5
<page src="pages/D.JPG" preLoad="true" />
6
<page src="pages/E.JPG" preLoad="true" />
7
<page src="pages/SPREAD_F+G.JPG" preLoad="true" isSpread="true" />
8
<page src="pages/SPREAD_F+G.JPG" preLoad="true" isSpread="true" />
9
<page src="pages/H.JPG" preLoad="true" />
10 </content>

ตัวอย่างนี้ผมเพิ่ม element ชื่อ page เข้ามาต่อท้ายในข้อมูล XML อีก 4 elements
ซึ่งรวมกับของเดิมที่มีอยู่ 4 elements ทั้งหมดเป็น 8 elements
นั่นก็คือหน้าทั้งหมด 8 หน้า นั่นเองครับ

หน้าที่เป็นประเด็นคือหน้าที่ 6 กับ 7 ครับ (บรรทัดที่ 7 กับ 8)
ซึ่งถ้าสังเกตจะเห็นว่ามี attribute ชื่อ isSpread ระบุค่า =”true” เพิ่มเข้ามาจากตัวอย่างเดิม
(แน่นอนครับ elements อื่นที่ไม่ได้ระบุ ค่าที่กำหนดเริ่มต้นให้คือ isSpread=”false” นั่นเอง)

การระบุค่า isSpread มีประเด็นที่ต้องสังเกตอยู่สองเรื่องครับ
หนึ่ง.. คือ attribute ชื่อ isSpread=”true” ต้องถูกระบุทั้งสองหน้าที่ต่อกันเสมอ
ถ้าระบุแค่หน้าเดียวจะเกิดปัญหาหน้าไม่ต่อเนื่องกัน

..นอกจากนี้ หน้า isSpread ที่ต่อเนื่องกันต้องระบุ src เดียวกันด้วย
นั่นหมายถึงต้องใช้ภาพเดียวกันนั่นเอง ..ถ้าระบุ src ต่าง ไฟล์คนละภาพกัน ก็จะเกิดปัญหา

สอง.. พยายามนึกตามดูครับว่า
หน้าคู่ที่จะแสดงผลนั้น ..ควรจะหรือมักจะเริ่มจากหน้าด้านซ้ายเสมอ ซึ่งก็คือหน้าเลขคู่
ถ้าหน้าเลขคู่นั้นเท่ากับ N หน้าอีกหน้าที่ต้องระบุ URL และ attribute ชื่อ isSpread เหมือนกันคือหน้า N+1
และหน้าเริ่มต้นต้องไม่เริ่มต้นที่หน้าสุดท้าย (หน้าปกหลัง) ของหนังสือ เพราะว่าถ้าเริ่มต้นหน้าคู่ที่หน้าสุดท้าย..ก็ไม่มีหน้าถัดไปให้แสดงผล


ส่วนในเรื่องของ transparent หรือว่าการโปร่งใสของหน้าหนังสือ
ในที่นี้ไม่ต้องกำหนดอะไรเพิ่มเติมครับ เพราะว่ากำหนดตั้งแต่ attribute ชื่อ transparency=”true” ใน root element แล้ว
ถ้าไฟล์หน้าหนังสือที่ใช้มีส่วนไหนโปร่งใส มันก็แสดงผลโปร่งใสให้เองโดยไม่ต้องระบุอะไรเพิ่มเติมนอกจาก URL ครับผม

อ่ะ.. ทีนี้ผมก็จะทำตัวอย่างหนังสือชุดใหญ่เป็นตัวอย่างทั้งหมดละกันครับ
มีทั้ง canTear=”true”, isSpread=”true” และ transparency
ในที่นี้ผมระบุให้สามารถฉีกหน้าที่ 4 D.JPGได้นะครับ
(แน่นอนครับว่าหน้าที่ 3 (C.JPG) ก็ต้องถูกฉีกได้เช่นกัน)

อ้อ ตัวอย่างหลังสุดนี่ผมกำหนดให้เป็นปกแข็ง (hcover=”true” ) ด้วยครับ
แล้วก็ไม่กำหนด prePage ด้วย ..เผื่อจะได้เห็นความต่างทั้งสองกรณี

XML

1 <content width="200" height="250" hcover="true" transparency="true" >
2
<page src="pages/A.JPG" preLoad="true" />
3
<page src="pages/B.JPG" preLoad="true" />
4
<page src="pages/C.JPG" preLoad="true" />
5
<page src="pages/D.JPG" preLoad="true" canTear="true" />
6
<page src="pages/E.JPG" preLoad="true" />
7
<page src="pages/SPREAD_F+G.JPG" preLoad="true" isSpread="true" />
8
<page src="pages/SPREAD_F+G.JPG" preLoad="true" isSpread="true" />
9
<page src="pages/H.JPG" preLoad="true" />
10
<page src="pages/TRANSPARENT_I.SWF" preLoad="true" />
11
<page src="pages/TRANSPARENT_J.SWF" preLoad="true" />
12
<page src="pages/K.JPG" preLoad="true" />
13
<page src="pages/L.JPG" preLoad="true" />
14 </content>

เอ้อ..

ป.ล.

ผมลืมบอกว่าไฟล์ Dynamic Page Flip ที่ผมใช้มันต่างกับต้นฉบับอยู่หน่อยนึงตรงเมนูพลิกหน้าหนังสือด้านล่าง
จริงๆ การใช้งานไม่ได้ต่างกันครับ ..แค่ผมจัดเรียงตกแต่งให้มันดูดีขึ้นหน่อยนึงแค่นั้นเอง
สามารถอ้างอิงใช้งานกับไฟล์ต้นฉบับที่โหลดมาจากผู้พัฒนา Source ได้ครับ

Comments (17) »