31 August 2013

เจาะลึกกับการล็อคทิศทางหน้าจอแอปพลิเคชัน

Updated on

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


        สำหรับการล็อคทิศทางของหน้าจอ (Screen Orientation) ทำได้ง่ายๆ โดยกำหนดที่ AndriodManifest.xml ของโปรเจคนั้นๆเลย และสามารถกำหนดแยกกันได้ว่า Activity ไหนจะล็อคหน้าจอทิศใด

        เริ่มจากเปิดไฟล์ AndroidMenifest.xml ของโปรเจคนั้นๆขึ้นมา



        เลื่อนลงมาข้างล่างสุด จะเห็นชื่อ Activity ที่สร้างไว้อยู่ ให้เลือกอันที่ต้องการ แล้วที่ช่องซ้ายมือจะมีให้ตั้งค่า Screen orientation (เลื่อนลงมาหน่อยๆ)



        หรืออีกวิธีก็คือแก้ไขที่โค๊ด xml โดยตรงเลย โดยเพิ่มคำสั่งเข้าไปใน Tag ของ Activity ที่ต้องการ



        เวลาต้องการแยกว่า Activity ไหน ใช้ทิศทางใดก็กำหนดแยกแบบนี้ได้เลย



        เท่านี้ก็สามารถกำหนดได้ตามใจชอบแล้วล่ะ 

        แต่เดี๋ยวก่อน สงสัยมั้ย? มีให้เลือกตั้งหลายอัน มันมีอะไรบ้างละ?


        • unspecified : ไม่ระบุ ก็เหมือนไม่ได้กำหนด หน้าจอก็หมุนไปมาได้
        • landscape : แนวนอน (ทิศทางที่หน้าจอมีความกว้างมากกว่าความสูง)
        • portrait : แนวตั้ง (ทิศทางที่หน้าจอมีความสูงมากกว่าความกว้าง)
        • user : ขึ้นอยู่กับทิศทางการถืออุปกรณ์แอนดอยด์เครื่องนั้นๆ (1)
        • behind : ขึ้นอยู่กับ Activity ก่อนหน้าว่ากำหนดไว้ยังไง (เลิกใช้แล้ว)
        • sensor : ขึ้นอยู่กับตัว Orientaion Sensor (หมุนไปมาได้) (2)
        • nosensor : ไม่สามารถหมุนไปมาได้ ขึ้นอยู่กับทิศทางหลักของเครื่อง (3)
        • sensorLandscape : หมุนไปมาได้เฉพาะแนวนอนเท่านั้น (4)
        • sensorPortrait : หมุนไปมาได้เฉพาะแนวตั้งเท่านั้น (5)
        • reverseLandscape : แสดงทิศทางตรงข้ามกับแนวนอนปกติ
        • reversePortrait : แสดงทิศทางตรงข้ามกับแนวตั้งปกติ
        • fullSensor : ขึ้นอยู่กับตัว Orienation Sensor (หมุนไปมาได้) (2)
        • userLandscape : หมุนไปมาได้เฉพาะแนวนอนเท่านั้น (4)
        • userPortrait : หมุนไปมาได้เฉพาะแนวตั้งเท่านั้น (5)
        • fullUser : ขึ้นอยู่กับทิศทางการถืออุปกรณ์แอนดอยด์เครื่องนั้นๆ (1)
        • locked : ล็อคทิศทางหน้าจอ (ตอนเปิดอยู่ทิศใด ก็อยู่ทิศนั้นไปเลย) (3)

        สำหรับ reverseLandscape, reversePortrait, sensorLandscape sensorPortrait และ fullSensor ถูกเพิ่มมาใน Android 2.3 (API 9)

        สำหรับ userLandscape, userPortrait, fullUser, Locked ถูกเพิ่มเข้ามาใน Android 4.3 (API 18)

        ดังนั้นการกำหนดค่าเหล่านี้จะทำงานไม่ได้ในเวอร์ชันเก่ากว่า

        หมายเหตุ - ก่อนอื่นต้องพูดถึงความต่างของเครื่องกันก่อนเลย เพราะอย่าลืมว่าแอนดรอยด์มีหลายรุ่นหลายเวอร์ชัน ดังนั้นความสามารถในการทำงานก็ต่างกันได้ แม้แต่การหมุนจอ ซึ่งทิศทางในการหมุนจอจะมีทั้งหมด 4 แบบด้วยกันดังนี้




        นอกจากนี้บน Tablet ยังสามารถล็อคทิศทางหน้าจอได้อีกด้วย ซึ่ง Phone ล็อคทิศทางค้างไว้ไม่ได้ (ได้แต่ปิดเปิด Auto Rotate )



        (1) user กับ full User ต่างกันยังไง?

        • เหมือนกันครับ จากที่ลองดูแล้ว 555



        (2) sensor กับ fullSensor ต่างกันยังไง?

        • เดิมทีแล้วคำสั่ง sensor ถือกำเนิดมาตั้งแต่ Android 1.5 (API 3) ซึ่งในตอนนั้นยังไม่มี Tablet จึงไม่ได้ทำเผื่อ Reverse Portrait ดังนั้นเครื่องรุ่นเก่าๆจึงไม่สามารถหมุนแบบ Reverse Portrait ได้ fullSensor จึงถูกเพิ่มเข้ามาเพื่อให้ Tablet หมุนได้ทั้ง 4 ทิศทาง แต่ในขณะนั้น Phone ก็ยังหมุนแบบ Reverse Portrait ไม่ได้อยู่ดี



        (3) nosensor ต่างกับ locked ยังไง?

        • nosensor แปลความหมายก็คือไม่อิงตาม Orientation Sensor แต่ในที่นี้จะหมายถึงอ้างอิงไปตามทิศทางหลักของเครื่องนั้นๆ อย่าง Phone หรือ Tablet 7 นิ้วจะมีทิศทางหลักคือ Normal Portrait ส่วน Tablet 10 นิ้วจะมีทิศทางหลักคือ Normal Landscape


        ซึ่ง nosensor ไม่ค่อยแนะนำ ถ้าไม่ได้แยก Layout ตามทิศทางหลักของเครื่อง

        แต่ในขณะเดียวกัน locked จะสามารถล็อคทิศทางใดทิศทางหนึ่งไว้ สมมติว่าก่อนเปิดแอพเครื่องอยู่ในทิศทาง Reverse Landscape พอเปิดแอพขึ้นมาหน้าจอก็จะล็อคไว้ที่ Reverse Landscape ทันทีหรือก่อนเปิดแอพ เครื่องอยู่ในทิศทาง Normal Portrait พอเปิดแอพขึ้นมาหน้าจอก็จะล็อคไว้ที่ Normal Portrait



        (4) sensorLandscape กับ userLandscape ต่างกันยังไง?

        • sensorLandscape เวลาใช้งานบนบน Tablet Tablet จะไม่สามารถกดล็อคหน้าจอค้างได้ ผลก็คือกดล็อคค้างไว้แล้ว แต่ก็ยังหมุนจอไปมาในแนวนอนได้ แต่ userLandscape เกิดมาเพื่อแก้ปัญหานี้นั่นเอง จึงสามารถล็อคทิศทางค้างไว้ได้ตามต้องการ พอหยุดล็อคหน้าจอก็จะกลับมาหมุนจอตามแนวนอนต่อ


        (5) sensorPortrait กับ userPortrait ต่างกันยังไง?

        • เหมือนข้อ 4 เลย


        จบแล้ว กับเรื่องที่ผู้ที่หลงเข้ามาอ่านหลายๆคนก็คงไม่เคยรู้มาก่อน