ฟีเจอร์การนําทางด้วยท่าทางสัมผัส "กลับโดยประมาณ" ช่วยให้ผู้ใช้ดูตัวอย่างตําแหน่งที่การปัดกลับจะนําไป
เช่น การใช้ท่าทางสัมผัสเพื่อกลับอาจแสดงตัวอย่างภาพเคลื่อนไหวของหน้าจอหลักที่อยู่เบื้องหลังแอป ดังที่แสดงในภาพตัวอย่างในรูปที่ 1
ตั้งแต่ Android 15 เป็นต้นไป ตัวเลือกสำหรับนักพัฒนาแอปสำหรับภาพเคลื่อนไหวแบบคาดเดาการย้อนกลับจะไม่มีให้ใช้งานอีกต่อไป ตอนนี้ภาพเคลื่อนไหวของระบบ เช่น กลับไปที่หน้าจอหลัก ข้ามงาน และข้ามกิจกรรม จะปรากฏในแอปที่เลือกใช้ท่าทางสัมผัสย้อนกลับแบบคาดเดาทั้งหมดหรือที่ระดับกิจกรรม
คุณสามารถทดสอบภาพเคลื่อนไหวการกลับไปที่หน้าแรกนี้ (ตามที่อธิบายไว้ในส่วนถัดไปของหน้านี้)
การรองรับท่าทางสัมผัสเพื่อย้อนกลับแบบคาดการณ์ต้องอัปเดตแอปโดยใช้ API ที่รองรับย้อนหลัง OnBackPressedCallback
AppCompat 1.6.0-alpha05 (AndroidX) ขึ้นไป หรือใช้ OnBackInvokedCallback
API แพลตฟอร์มใหม่ แอปส่วนใหญ่ใช้ AndroidX API ที่เข้ากันได้แบบย้อนหลัง
การอัปเดตนี้แสดงเส้นทางการย้ายข้อมูลเพื่อขัดจังหวะการนำทางย้อนกลับอย่างเหมาะสม ซึ่งเกี่ยวข้องกับการเปลี่ยนการขัดจังหวะการย้อนกลับจาก KeyEvent.KEYCODE_BACK
และคลาสที่มีเมธอด onBackPressed
เช่น Activity
และ Dialog
ด้วย Back API ของระบบใหม่
วิดีโอเกี่ยวกับ Codelab และ Google I/O
นอกจากการใช้เอกสารประกอบในหน้านี้แล้ว โปรดลองใช้ Codelab ซึ่งให้บริการการใช้งาน Use Case ทั่วไปของ WebView ที่จัดการท่าทางสัมผัสย้อนกลับแบบคาดการณ์โดยใช้ AndroidX Activity API
นอกจากนี้ คุณยังดูวิดีโอ Google I/O ของเราได้ด้วย ซึ่งจะแสดงตัวอย่างเพิ่มเติมในการใช้งาน AndroidX และ API ของแพลตฟอร์ม
อัปเดตแอปที่ใช้การนําทางกลับเริ่มต้น
การอัปเดตแอปให้รองรับฟีเจอร์นี้นั้นง่ายมากหากแอปไม่ได้ใช้ลักษณะการกดกลับที่กำหนดเอง (กล่าวคือ ปล่อยให้ระบบจัดการการกดกลับ) เลือกใช้ฟีเจอร์นี้ตามที่อธิบายไว้ในคู่มือนี้
หากแอปใช้ Fragments หรือคอมโพเนนต์การนำทาง ให้อัปเกรดเป็น AndroidX Activity 1.6.0-alpha05 ขึ้นไปด้วย
อัปเดตแอปที่ใช้การนําทางกลับที่กําหนดเอง
หากแอปใช้ลักษณะการกดย้อนกลับที่กำหนดเอง เส้นทางการย้ายข้อมูลจะแตกต่างกันไป ขึ้นอยู่กับว่าแอปใช้ AndroidX หรือไม่ และวิธีจัดการการนําทางกลับ
แอปของคุณใช้ AndroidX | วิธีที่แอปจัดการการนําทางกลับ | เส้นทางการย้ายข้อมูลที่แนะนํา (ลิงก์ในหน้านี้) |
ใช่ | API ของ AndroidX | ย้ายข้อมูลการติดตั้งใช้งาน AndroidX ที่มีอยู่กลับ |
API ของแพลตฟอร์มที่ไม่รองรับ | ย้ายข้อมูลแอป AndroidX ที่มี API การนำทางกลับที่ไม่รองรับไปยัง AndroidX API | |
ไม่ | API ของแพลตฟอร์มที่ไม่รองรับ แต่ย้ายข้อมูลได้ | ย้ายข้อมูลแอปที่ใช้ API การนําทางกลับที่ไม่รองรับไปยัง API ของแพลตฟอร์ม |
API ของแพลตฟอร์มที่ไม่รองรับ แต่ย้ายข้อมูลไม่ได้ | เลื่อนการเลือกรับจนกว่าฟีเจอร์นี้จะกลายเป็นฟีเจอร์ที่ต้องใช้งาน |
ย้ายข้อมูลการใช้งานการนําทางกลับของ AndroidX
Use Case นี้เป็นกรณีการใช้งานที่พบบ่อยที่สุด (และแนะนํามากที่สุด) นโยบายนี้มีผลบังคับใช้กับแอปใหม่หรือแอปที่มีอยู่ที่ใช้การจัดการการนำทางด้วยท่าทางสัมผัสที่กำหนดเองด้วย OnBackPressedDispatcher
ตามที่อธิบายไว้ในระบุการนําทางย้อนกลับที่กําหนดเอง
หากแอปของคุณจัดอยู่ในหมวดหมู่นี้ ให้ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มการรองรับท่าทางสัมผัสย้อนกลับแบบคาดการณ์
โปรดอัปเกรดเป็น AndroidX Activity 1.6.0-alpha05 เพื่อให้ API ที่ใช้
OnBackPressedDispatcher
API อยู่แล้ว (เช่น ฟragment และคอมโพเนนต์การนําทาง) ทํางานร่วมกับท่าทางสัมผัสย้อนกลับแบบคาดการณ์ได้อย่างราบรื่น// In your build.gradle file: dependencies { // Add this in addition to your other dependencies implementation "androidx.activity:activity:1.6.0-alpha05"
เลือกใช้ท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้ตามที่อธิบายไว้ในหน้านี้
ย้ายข้อมูลแอป AndroidX ที่มี API การนำทางกลับที่ไม่รองรับไปยัง AndroidX API
หากแอปใช้ไลบรารี AndroidX แต่ติดตั้งใช้งานหรืออ้างอิง API การนำทางกลับที่ไม่รองรับ คุณจะต้องเปลี่ยนไปใช้ AndroidX API เพื่อรองรับลักษณะการทำงานใหม่
วิธีย้ายข้อมูล API ที่ระบบไม่รองรับไปยัง AndroidX API
ย้ายข้อมูลตรรกะการจัดการ Back ของระบบไปยัง
OnBackPressedDispatcher
ของ AndroidX ด้วยการติดตั้งใช้งานOnBackPressedCallback
ดูคําแนะนําโดยละเอียดได้ที่หัวข้อระบุการนําทางกลับที่กําหนดเองปิดใช้
OnBackPressedCallback
เมื่อพร้อมที่จะหยุดขัดจังหวะท่าทางสัมผัสย้อนกลับหยุดการขัดจังหวะเหตุการณ์ "กลับ" ผ่าน
OnBackPressed
หรือKeyEvent.KEYCODE_BACK
อย่าลืมอัปเกรดเป็น AndroidX Activity 1.6.0-alpha05
// In your build.gradle file: dependencies { // Add this in addition to your other dependencies implementation "androidx.activity:activity:1.6.0-alpha05"
เมื่อย้ายข้อมูลแอปเรียบร้อยแล้ว ให้เลือกใช้ท่าทางสัมผัสเพื่อกลับไปยังหน้าแรกแบบคาดการณ์ (ตามที่อธิบายไว้ในหน้านี้) เพื่อดูภาพเคลื่อนไหวของระบบในการกลับไปยังหน้าแรก
ย้ายข้อมูลแอปที่ใช้ API การนําทางกลับที่ไม่รองรับไปยัง API ของแพลตฟอร์ม
หากแอปใช้ไลบรารี AndroidX ไม่ได้ แต่ใช้หรืออ้างอิงการนําทางกลับที่กําหนดเองโดยใช้ API ที่ไม่รองรับแทน คุณต้องย้ายข้อมูลไปยัง OnBackInvokedCallback
platform API
ทําตามขั้นตอนต่อไปนี้เพื่อย้ายข้อมูล API ที่ระบบไม่รองรับไปยัง Platform API
ใช้
OnBackInvokedCallback
API ใหม่ในอุปกรณ์ที่ใช้ Android 13 ขึ้นไป และใช้ API ที่ระบบไม่รองรับในอุปกรณ์ที่ใช้ Android 12 หรือต่ำกว่าลงทะเบียนตรรกะการย้อนกลับที่กำหนดเองใน
OnBackInvokedCallback
ด้วยonBackInvokedDispatcher
ซึ่งจะป้องกันไม่ให้กิจกรรมปัจจุบันเสร็จสมบูรณ์ และเพื่อให้การเรียกกลับมีโอกาสตอบสนองต่อการดำเนินการ "กลับ" เมื่อผู้ใช้ไปยังส่วนต่างๆ ของระบบโดยกด "กลับ" จนเสร็จสมบูรณ์ยกเลิกการลงทะเบียน
OnBackInvokedCallback
เมื่อต้องการหยุดขัดจังหวะท่าทางสัมผัสเพื่อย้อนกลับ มิเช่นนั้น ผู้ใช้อาจเห็นลักษณะการทำงานที่ไม่พึงประสงค์เมื่อใช้การนําทางกลับของระบบ เช่น "ค้าง" ระหว่างมุมมองต่างๆ และบังคับให้ผู้ใช้ปิดแอปตัวอย่างวิธีย้ายข้อมูลตรรกะออกจาก
onBackPressed
มีดังนี้Kotlin
@Override fun onCreate() { if (BuildCompat.isAtLeastT()) { onBackInvokedDispatcher.registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT ) { /** * onBackPressed logic goes here. For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/window/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } } }
Java
@Override void onCreate() { if (BuildCompat.isAtLeastT()) { getOnBackInvokedDispatcher().registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT, () -> { /** * onBackPressed logic goes here - For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/view/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } ); } }
หยุดการขัดจังหวะเหตุการณ์ Back ผ่าน
OnBackPressed
หรือKeyEvent.KEYCODE_BACK
สำหรับ Android 13 ขึ้นไปเมื่อย้ายข้อมูลแอปเรียบร้อยแล้ว ให้เลือกใช้ท่าทางสัมผัสเพื่อย้อนกลับแบบคาดการณ์ (ตามที่อธิบายไว้ในหน้านี้) เพื่อให้
OnBackInvokedCallback
ใช้งานได้
คุณสามารถลงทะเบียน OnBackInvokedCallback
กับ PRIORITY_DEFAULT
หรือ PRIORITY_OVERLAY
ซึ่งไม่พร้อมใช้งานใน AndroidX OnBackPressedCallback
ที่คล้ายกัน การลงทะเบียนการติดต่อกลับด้วย PRIORITY_OVERLAY
จะมีประโยชน์ในบางกรณี
ซึ่งจะมีผลเมื่อคุณย้ายข้อมูลจาก onKeyPreIme()
และ Callback ของคุณต้องได้รับการจับมือกลับแทน IME ที่เปิดอยู่ IME จะลงทะเบียนการเรียกกลับกับ PRIORITY_DEFAULT
เมื่อเปิด
ลงทะเบียนการเรียกกลับด้วย PRIORITY_OVERLAY
เพื่อให้แน่ใจว่า OnBackInvokedDispatcher
จะส่งท่าทางสัมผัสกลับไปยังการเรียกกลับแทน IME ที่เปิดอยู่
เลือกใช้ท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้
เมื่อคุณกำหนดวิธีอัปเดตแอปตามกรณีของคุณแล้ว ให้เลือกรับเพื่อรองรับท่าทางสัมผัสเพื่อย้อนกลับแบบคาดการณ์
หากต้องการเลือกใช้ ให้ตั้งค่า Flag android:enableOnBackInvokedCallback
เป็น true
ในแท็ก <application>
ของ AndroidManifest.xml
<application
...
android:enableOnBackInvokedCallback="true"
... >
...
</application>
หากไม่ระบุค่า ค่าเริ่มต้นจะเป็น false
และดำเนินการต่อไปนี้
- ปิดใช้ภาพเคลื่อนไหวของระบบสำหรับท่าทางสัมผัสย้อนกลับแบบคาดเดา
- ละเว้น
OnBackInvokedCallback
แต่การเรียกใช้OnBackPressedCallback
จะยังคงทำงานต่อไป
เลือกใช้ที่ระดับกิจกรรม
ตั้งแต่ Android 14 เป็นต้นไป Flag android:enableOnBackInvokedCallback
จะช่วยให้คุณเลือกใช้ภาพเคลื่อนไหวของระบบตามการคาดการณ์ที่ระดับกิจกรรมได้ ลักษณะการทำงานนี้ช่วยให้ย้ายข้อมูลแอปขนาดใหญ่ที่มีหลายกิจกรรมไปยังท่าทางสัมผัสย้อนกลับแบบคาดการณ์ได้ง่ายขึ้น ใน Android 15 ฟีเจอร์การย้อนกลับแบบคาดการณ์จะไม่อยู่หลังตัวเลือกสำหรับนักพัฒนาแอปอีกต่อไป แอปสามารถเลือกรับการกดย้อนกลับแบบคาดการณ์ได้ทั้งหมดหรือในระดับกิจกรรม
โค้ดต่อไปนี้แสดงตัวอย่างการใช้ enableOnBackInvokedCallback
เพื่อเปิดใช้ภาพเคลื่อนไหวของระบบที่กลับไปยังหน้าแรกจาก MainActivity
<manifest ...>
<application . . .
android:enableOnBackInvokedCallback="false">
<activity
android:name=".MainActivity"
android:enableOnBackInvokedCallback="true"
...
</activity>
<activity
android:name=".SecondActivity"
android:enableOnBackInvokedCallback="false"
...
</activity>
</application>
</manifest>
ในตัวอย่างก่อนหน้านี้ การตั้งค่า android:enableOnBackInvokedCallback=true
for
".SecondActivity"
จะเปิดใช้ภาพเคลื่อนไหวของระบบข้ามกิจกรรม
โปรดคำนึงถึงข้อควรพิจารณาต่อไปนี้เมื่อใช้ Flag android:enableOnBackInvokedCallback
- การตั้งค่า
android:enableOnBackInvokedCallback=false
จะปิดภาพเคลื่อนไหวย้อนกลับแบบคาดการณ์ที่ระดับกิจกรรมหรือระดับแอป ทั้งนี้ขึ้นอยู่กับตำแหน่งที่คุณตั้งค่าแท็ก และสั่งให้ระบบไม่สนใจการเรียกใช้ API ของแพลตฟอร์มOnBackInvokedCallback
อย่างไรก็ตาม การเรียกOnBackPressedCallback
จะยังคงทำงานต่อไปเนื่องจากOnBackPressedCallback
ใช้งานย้อนหลังได้และเรียกใช้onBackPressed
API ซึ่งระบบไม่รองรับก่อน Android 13 - การตั้งค่า Flag
enableOnBackInvokedCallback
ที่ระดับแอปจะกำหนดค่าเริ่มต้นสำหรับกิจกรรมทั้งหมดในแอป คุณสามารถลบล้างค่าเริ่มต้นต่อกิจกรรมได้โดยการตั้งค่า Flag ที่ระดับกิจกรรม ดังที่แสดงในตัวอย่างโค้ดก่อนหน้า
แนวทางปฏิบัติแนะนำสำหรับการโทรกลับ
แนวทางปฏิบัติแนะนำในการใช้ระบบการเรียกกลับจากระบบที่รองรับมีดังนี้
BackHandler
(สำหรับเขียน), OnBackPressedCallback
หรือ
OnBackInvokedCallback
ระบุสถานะ UI ที่เปิดและปิดใช้การเรียกกลับแต่ละรายการ
สถานะ UI เป็นพร็อพเพอร์ตี้ที่อธิบาย UI เราขอแนะนําให้ทําตามขั้นตอนระดับสูงเหล่านี้
ระบุสถานะ UI ที่เปิดและปิดใช้การเรียกกลับแต่ละรายการ
กําหนดสถานะนั้นโดยใช้ประเภทตัวเก็บข้อมูลที่เฝ้าสังเกต เช่น
StateFlow
หรือ Compose State และเปิดหรือปิดใช้การเรียกกลับเมื่อสถานะเปลี่ยนแปลง
หากก่อนหน้านี้แอปของคุณเชื่อมโยงตรรกะการกดกลับกับคำสั่งเงื่อนไข การดำเนินการนี้อาจหมายความว่าคุณกำลังตอบสนองต่อเหตุการณ์การกดกลับหลังจากที่เหตุการณ์ดังกล่าวเกิดขึ้นแล้ว หลีกเลี่ยงรูปแบบนี้กับคอลแบ็กเวอร์ชันใหม่ หากเป็นไปได้ ให้ย้ายการเรียกกลับไว้นอกคำสั่งเงื่อนไขและเชื่อมโยงการเรียกกลับกับประเภทตัวเก็บข้อมูลแบบสังเกตได้แทน
ใช้การเรียกกลับระบบสําหรับตรรกะ UI
ตรรกะ UI กำหนดวิธีแสดง UI ใช้การเรียกกลับเมื่อระบบย้อนกลับเพื่อเรียกใช้ตรรกะ UI เช่น การแสดงป๊อปอัปหรือเรียกใช้ภาพเคลื่อนไหว
หากแอปเปิดใช้การเรียกกลับระบบสำหรับการกดย้อนกลับ การเคลื่อนไหวแบบคาดเดาจะไม่ทำงานและคุณต้องจัดการเหตุการณ์การกดย้อนกลับ อย่าสร้างการเรียกกลับเพื่อเรียกใช้ตรรกะที่ไม่เกี่ยวข้องกับ UI เท่านั้น
เช่น หากคุณจะขัดขวางเหตุการณ์ Back เพื่อบันทึกเท่านั้น ให้บันทึกภายในวงจรของกิจกรรมหรือ Fragment แทน
- สําหรับกรณีกิจกรรมต่อกิจกรรมหรือกรณีจากเหตุการณ์ต่อกิจกรรม ให้บันทึกหาก
isFinishing
ภายในonDestroy
เป็นtrue
ภายในวงจรของกิจกรรม - สําหรับกรณีจากข้อมูลโค้ดหนึ่งไปยังอีกข้อมูลโค้ดหนึ่ง ให้บันทึกหาก
isRemoving
ภายในonDestroy
เป็นจริงภายในวงจรชีวิตของมุมมองข้อมูลโค้ด หรือเข้าสู่ระบบโดยใช้วิธีonBackStackChangeStarted
หรือonBackStackChangeCommitted
ภายในFragmentManager.OnBackStackChangedListener
สําหรับเคสการเขียน ให้บันทึกภายในการเรียกกลับ onCleared()
ของ ViewModel
ที่เชื่อมโยงกับปลายทางการเขียน นี่เป็นสัญญาณที่ดีที่สุดในการระบุว่ามีการนำปลายทางการเขียนออกจากกองซ้อนด้านหลังและทำลายแล้ว
สร้างการเรียกกลับที่มีความรับผิดชอบเดียว
คุณสามารถเพิ่มการเรียกกลับหลายรายการลงในตัวจัดเตรียมได้ ระบบจะเพิ่มการเรียกกลับลงในกองซ้อน ซึ่งการเรียกกลับที่เปิดใช้ซึ่งเพิ่มล่าสุดจะจัดการท่าทางสัมผัสกลับครั้งถัดไป โดยมี 1 การเรียกกลับต่อท่าทางสัมผัสกลับ
การจัดการสถานะ "เปิดใช้" ของคอลแบ็กจะง่ายขึ้นหากคอลแบ็กดังกล่าวมีหน้าที่เพียงอย่างเดียว เช่น
รูปที่ 2 แสดงวิธีที่คุณสามารถมีคอลแบ็กหลายรายการในกอง โดยแต่ละรายการจะมีหน้าที่รับผิดชอบอย่างละอย่าง โค้ดเรียกซ้ำจะทำงานก็ต่อเมื่อปิดใช้โค้ดเรียกซ้ำที่อยู่เหนือในกองเท่านั้น ในตัวอย่างนี้ ระบบจะเปิดใช้การเรียกกลับ "คุณแน่ใจไหม..." เมื่อผู้ใช้ป้อนข้อมูลลงในแบบฟอร์ม และปิดใช้ในกรณีอื่นๆ การเรียกกลับจะเปิดกล่องโต้ตอบการยืนยันเมื่อผู้ใช้ปัดกลับเพื่อออกจากแบบฟอร์ม
แบ็กคอลอื่นๆ อาจรวมถึงคอมโพเนนต์ Material ที่รองรับการย้อนกลับแบบคาดการณ์ ทรานซิชัน AndroidX ที่ใช้ Progress API หรือแบ็กคอลที่กำหนดเองอื่นๆ
การทำงานของคอลแบ็กของ childFragmentManager
จะทำงานหากคอลแบ็กข้างต้นถูกปิดใช้และกองซ้อนที่ย้อนกลับสำหรับ FragmentManager
นี้ไม่ว่างเปล่า โดยที่ childFragmentManager
แนบอยู่ใน Fregment ในตัวอย่างนี้ แคล็กแบ็กภายในนี้จะปิดอยู่
ในทำนองเดียวกัน ฟังก์ชันการเรียกกลับภายในของ supportFragmentManager
จะทำงานหากการเรียกกลับข้างต้นปิดอยู่และกองซ้อนของ supportFragmentManager
ไม่ได้ว่างเปล่า ลักษณะการทำงานนี้มีความสอดคล้องกันเมื่อใช้ FragmentManager
หรือ NavigationComponent
เพื่อไปยังส่วนต่างๆ เนื่องจาก NavigationComponent
ต้องใช้ FragmentManager
ในตัวอย่างนี้ แคล็กแบ็กนี้จะทำงานหากผู้ใช้ไม่ได้ป้อนข้อความในแบบฟอร์ม ซึ่งทำให้แคล็กแบ็ก "คุณแน่ใจไหม..." ปิดอยู่
สุดท้าย super.onBackPressed()
คือการเรียกกลับระดับระบบที่จะทํางานอีกครั้งหากการเรียกกลับข้างต้นปิดอยู่ หากต้องการเรียกให้ภาพเคลื่อนไหวของระบบแสดง เช่น กลับไปที่หน้าจอหลัก ข้ามกิจกรรม และข้ามงาน กองซ้อนของ supportFragmentManager
ต้องว่างเปล่าเพื่อให้การเรียกกลับภายในปิดอยู่
ทดสอบภาพเคลื่อนไหวของท่าทางสัมผัสการย้อนกลับแบบคาดเดา
หากยังใช้ Android 13 หรือ Android 14 อยู่ คุณจะทดสอบภาพเคลื่อนไหวของฟีเจอร์กลับไปที่หน้าแรกซึ่งแสดงในรูปที่ 1 ได้
หากต้องการทดสอบภาพเคลื่อนไหวนี้ ให้ทำตามขั้นตอนต่อไปนี้
ในอุปกรณ์ ให้ไปที่การตั้งค่า > ระบบ > ตัวเลือกสำหรับนักพัฒนาแอป
เลือกการเคลื่อนไหวย้อนกลับแบบคาดเดา
เปิดแอปที่อัปเดตแล้ว และใช้ท่าทางสัมผัสเพื่อดูการทํางาน