การป้อนข้อมูลด้วยสไตลัสในช่องข้อความ

ลองใช้วิธีแบบ Compose
Jetpack Compose เป็นชุดเครื่องมือ UI ที่แนะนำสำหรับ Android ดูวิธีใช้สไตลัสในฟีเจอร์เขียน

Android 14 (API ระดับ 34) ขึ้นไปช่วยให้ผู้ใช้เขียนในช่องป้อนข้อความ ใดก็ได้ในแอปใดก็ได้โดยใช้สไตลัส ช่องป้อนข้อความของ Android ซึ่งรวมถึงคอมโพเนนต์ EditText และวิดเจ็ตข้อความ WebView รองรับการป้อนข้อมูลด้วยสไตลัสโดยค่าเริ่มต้น

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

รูปที่ 1 การป้อนข้อมูลด้วยลายมือโดยใช้สไตลัส

EditText

ระบบจะเปิดใช้การเขียนด้วยลายมือโดยใช้สไตลัสสำหรับช่อง EditText ทั้งหมดโดยค่าเริ่มต้นใน Android 14 ขึ้นไป ระบบจะเริ่มโหมดลายมือสำหรับ EditText เมื่อตรวจพบเหตุการณ์การเคลื่อนไหวของสไตลัส ภายในขอบเขตลายมือของมุมมอง

ขอบเขตลายมือประกอบด้วยระยะห่างแนวตั้ง 40 dp และระยะห่างแนวนอน 10 dp รอบๆ มุมมอง ปรับขอบเขตลายมือด้วย setHandwritingBoundsOffsets() ปิดใช้การเขียนด้วยลายมือด้วย setAutoHandwritingEnabled(false)

ฟิลด์อินพุตที่มีสี่เหลี่ยมล้อมรอบซึ่งระบุขอบเขตสำหรับการตรวจหาเหตุการณ์การเคลื่อนไหวของสไตลัส
รูปที่ 2 ขอบเขตของลายมือของฟิลด์ EditText

การมอบสิทธิ์อินพุต

แอปสามารถแสดงองค์ประกอบ UI ตัวยึดตำแหน่งที่ดูเหมือนช่องป้อนข้อความ แต่จริงๆ แล้วเป็นเพียงองค์ประกอบ UI แบบคงที่ที่ไม่มีความสามารถในการป้อนข้อความ ฟิลด์การค้นหาเป็นตัวอย่างที่พบบ่อย การแตะองค์ประกอบ UI แบบคงที่จะทําให้เกิดการเปลี่ยน ไปยัง UI ใหม่ที่มีช่องป้อนข้อความที่ใช้งานได้ซึ่งโฟกัสสําหรับการป้อนข้อมูล

รูปที่ 3 การมอบสิทธิ์อินพุตจากองค์ประกอบ UI แบบคงที่ไปยังช่องป้อนข้อความ

การมอบสิทธิ์อินพุตสไตลัส

ใช้ API การมอบสิทธิ์การเขียนด้วยลายมือเพื่อรองรับการป้อนข้อมูลการเขียนด้วยลายมือโดยใช้สไตลัสสำหรับ ช่องป้อนข้อมูลตัวยึดตำแหน่ง (ดู setHandwritingDelegatorCallback() และ setIsHandwritingDelegate()) ระบบจะกำหนดค่าองค์ประกอบ UI ตัวยึดตำแหน่งเพื่อมอบสิทธิ์การเขียนด้วยลายมือไปยัง ช่องป้อนข้อมูลที่ใช้งานได้ เช่น

Kotlin

if (Build.VERSION.SDK_INT >= 34) {
    placeholderInputField.setHandwritingDelegatorCallback {
        showAndFocusDelegateInputField()
    }
    delegateInputField.setIsHandwritingDelegate(true)
}

Java

if (Build.VERSION.SDK_INT >= 34) {
    placeholderInputField.setHandwritingDelegatorCallback(this::showAndFocusInputFieldDelegate);
    delegateInputField.setIsHandwritingDelegate(true);
}

การเคลื่อนที่ของสไตลัสเหนือมุมมองช่องป้อนข้อความที่มีตัวยึดตำแหน่งจะเรียกใช้การเรียกกลับ การเรียกกลับจะทริกเกอร์การเปลี่ยน UI เพื่อแสดงและโฟกัสช่องป้อนข้อมูลที่ใช้งานได้ โดยปกติแล้ว การติดตั้งใช้งานการเรียกกลับจะเหมือนกับการติดตั้งใช้งาน สำหรับ Listener การคลิกในองค์ประกอบตัวยึดตำแหน่ง เมื่อช่องป้อนข้อมูลที่ใช้งานได้ สร้าง InputConnection โหมดลายมือของสไตลัสจะเริ่มทำงาน

รูปที่ 4 การมอบสิทธิ์การป้อนข้อมูลด้วยสไตลัสจากองค์ประกอบ UI แบบคงที่ไปยังช่องป้อนข้อความ

ดีไซน์ Material

ไลบรารี com.google.android.material.search มีคลาส SearchBarและ SearchView เพื่อช่วยในการติดตั้งใช้งานรูปแบบ UI ของตัวยึดตำแหน่ง

มุมมองการค้นหาตัวยึดตำแหน่งและฟังก์ชันการทำงานจะลิงก์กับ setUpWithSearchBar()

การมอบสิทธิ์การเขียนด้วยลายมือได้รับการกำหนดค่าในไลบรารี Material โดยไม่ต้องมีการพัฒนาเพิ่มเติมในแอป

ทับซ้อนกับพื้นผิวสำหรับวาดเขียน

หากแอปมีพื้นผิวการวาดที่มีช่องข้อความซ้อนทับพื้นผิว คุณอาจต้องปิดใช้ลายมือที่เขียนด้วยสไตลัสเพื่อให้ผู้ใช้วาดได้ ดูsetAutoHandwritingEnabled()

การทดสอบ

การเขียนด้วยลายมือโดยใช้สไตลัสรองรับในอุปกรณ์ Android 14 ขึ้นไปที่มี อุปกรณ์ป้อนข้อมูลสไตลัสที่เข้ากันได้และโปรแกรมแก้ไขวิธีการป้อนข้อมูล (IME) ที่ รองรับ Android 14 Stylus Handwriting API

หากไม่มีอุปกรณ์ป้อนข้อมูลด้วยสไตลัส ให้จำลองการป้อนข้อมูลด้วยสไตลัสในอุปกรณ์ใดก็ได้ ที่มีสิทธิ์เข้าถึงระดับรูท (รวมถึงโปรแกรมจำลอง) โดยใช้คำสั่ง Android Debug Bridge (adb) ต่อไปนี้


// Android 14
adb shell setprop persist.debug.input.simulate_stylus_with_touch true && adb shell stop && adb shell start

// Android 15 and higher
// Property takes effect after screen reconfiguration such as orientation change.
adb shell setprop debug.input.simulate_stylus_with_touch true

ใช้ Gboard เวอร์ชันเบต้าเพื่อทดสอบหากคุณใช้อุปกรณ์ที่ไม่รองรับสไตลัส

แหล่งข้อมูลเพิ่มเติม