ทำให้มุมมองที่กำหนดเองเข้าถึงได้ง่ายขึ้น (มุมมอง)

แนวคิดและการใช้งาน Jetpack Compose

หากแอปพลิเคชันของคุณต้องใช้คอมโพเนนต์มุมมองที่กำหนดเอง คุณต้องทำให้มุมมองเข้าถึงได้มากขึ้น ขั้นตอนต่อไปนี้จะช่วยปรับปรุงการช่วยเหลือพิเศษของมุมมองที่กำหนดเอง ตามที่อธิบายไว้ในหน้านี้

  • จัดการการคลิกตัวควบคุมทิศทาง
  • ใช้เมธอด Accessibility API
  • ส่งออบเจ็กต์ AccessibilityEvent ที่เฉพาะเจาะจงกับมุมมองที่กําหนดเอง
  • ป้อนข้อมูล AccessibilityEvent และ AccessibilityNodeInfo สำหรับข้อมูลพร็อพเพอร์ตี้

จัดการการคลิกตัวควบคุมทิศทาง

ในอุปกรณ์ส่วนใหญ่ การคลิกมุมมองโดยใช้ตัวควบคุมทิศทางจะส่ง KeyEventพร้อม KEYCODE_DPAD_CENTER ไปยังมุมมองที่โฟกัสอยู่ มุมมอง Android มาตรฐานทั้งหมดจะจัดการ KEYCODE_DPAD_CENTERได้อย่างเหมาะสม เมื่อสร้างตัวควบคุมที่กำหนดเอง View โปรดตรวจสอบว่าเหตุการณ์นี้มีผลเช่นเดียวกับการแตะมุมมองบนหน้าจอสัมผัส

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

ใช้เมธอด Accessibility API

เหตุการณ์การช่วยเหลือพิเศษคือข้อความเกี่ยวกับการโต้ตอบของผู้ใช้กับคอมโพเนนต์อินเทอร์เฟซภาพของแอป บริการการช่วยเหลือพิเศษจะจัดการข้อความเหล่านี้ ซึ่งจะใช้ข้อมูลในเหตุการณ์เหล่านี้เพื่อสร้างความคิดเห็นและพรอมต์เสริม วิธีการช่วยเหลือพิเศษ เป็นส่วนหนึ่งของชั้นเรียน View และ View.AccessibilityDelegate โดยมีวิธีดังนี้

dispatchPopulateAccessibilityEvent()
ระบบจะเรียกใช้เมธอดนี้เมื่อมุมมองที่กำหนดเองสร้างเหตุการณ์การช่วยเหลือพิเศษ การติดตั้งใช้งานเริ่มต้นของเมธอดนี้จะเรียก onPopulateAccessibilityEvent() สำหรับมุมมองนี้ แล้วเรียกเมธอด dispatchPopulateAccessibilityEvent() สำหรับแต่ละรายการย่อยของมุมมองนี้
onInitializeAccessibilityEvent()
ระบบจะเรียกใช้เมธอดนี้เพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับสถานะของมุมมองนอกเหนือจาก เนื้อหาข้อความ หากมุมมองที่กำหนดเองมีการควบคุมแบบอินเทอร์แอกทีฟที่นอกเหนือจาก TextView หรือ Button ให้ลบล้างเมธอดนี้ และตั้งค่าข้อมูลเพิ่มเติมเกี่ยวกับมุมมอง เช่น ประเภทช่องรหัสผ่าน ประเภทช่องทำเครื่องหมาย หรือสถานะที่ให้การโต้ตอบของผู้ใช้หรือความคิดเห็นลงในเหตุการณ์ โดยใช้เมธอดนี้ หากคุณลบล้างเมธอดนี้ ให้เรียกใช้การติดตั้งใช้งานระดับบนสุดและแก้ไขเฉพาะพร็อพเพอร์ตี้ ที่ไม่ได้ตั้งค่าโดยคลาสระดับบนสุด
onInitializeAccessibilityNodeInfo()
วิธีนี้จะให้ข้อมูลเกี่ยวกับสถานะของมุมมองแก่บริการการช่วยเหลือพิเศษ การติดตั้งใช้งานเริ่มต้นViewมีชุดพร็อพเพอร์ตี้ของมุมมองมาตรฐาน แต่หากมุมมองที่กำหนดเอง มีการควบคุมแบบอินเทอร์แอกทีฟนอกเหนือจาก TextView หรือ Button ให้ลบล้างเมธอดนี้และตั้งค่าข้อมูลเพิ่มเติมเกี่ยวกับมุมมองของคุณ ในออบเจ็กต์ AccessibilityNodeInfo ที่เมธอดนี้จัดการ
onPopulateAccessibilityEvent()
วิธีนี้จะตั้งค่าพรอมต์ข้อความที่พูดของ AccessibilityEvent สำหรับมุมมองของคุณ นอกจากนี้ ระบบจะเรียกใช้เมธอดนี้หากมุมมองเป็นมุมมองย่อยของมุมมองที่สร้างเหตุการณ์การช่วยเหลือพิเศษ
onRequestSendAccessibilityEvent()
ระบบจะเรียกใช้เมธอดนี้เมื่อองค์ประกอบย่อยของมุมมองสร้าง AccessibilityEvent ขั้นตอนนี้ช่วยให้มุมมองสำหรับพ่อแม่ดูและแก้ไขเหตุการณ์การช่วยเหลือพิเศษ พร้อมข้อมูลเพิ่มเติมได้ ใช้เมธอดนี้เฉพาะในกรณีที่มุมมองที่กำหนดเองมี มุมมองย่อย และหากมุมมองระดับบนสามารถให้ข้อมูลบริบทแก่เหตุการณ์การช่วยเหลือพิเศษ ซึ่งเป็นประโยชน์ต่อบริการช่วยเหลือพิเศษ
sendAccessibilityEvent()
ระบบจะเรียกใช้เมธอดนี้เมื่อผู้ใช้ดำเนินการกับมุมมอง ระบบจะจัดประเภทเหตุการณ์ด้วย ประเภทการดำเนินการของผู้ใช้ เช่น TYPE_VIEW_CLICKED โดยทั่วไป คุณต้องส่ง AccessibilityEvent ทุกครั้งที่เนื้อหาของมุมมองที่กำหนดเองมีการเปลี่ยนแปลง
sendAccessibilityEventUnchecked()
ใช้วิธีนี้เมื่อโค้ดที่เรียกใช้ต้องควบคุมการตรวจสอบโดยตรงว่า มีการเปิดใช้การช่วยเหลือพิเศษในอุปกรณ์หรือไม่ (AccessibilityManager.isEnabled()) หากใช้วิธีนี้ ให้เรียกใช้ราวกับว่ามีการเปิดใช้การช่วยเหลือพิเศษ ไม่ว่าการตั้งค่าระบบจะเป็นอย่างไรก็ตาม โดยปกติแล้ว คุณไม่จำเป็นต้องใช้วิธีนี้สำหรับมุมมองที่กำหนดเอง

หากต้องการรองรับการช่วยเหลือพิเศษ ให้ลบล้างและใช้วิธีการช่วยเหลือพิเศษข้างต้นโดยตรงในคลาสของมุมมองที่กำหนดเอง

อย่างน้อย ให้ใช้เมธอดการช่วยเหลือพิเศษต่อไปนี้สำหรับคลาสมุมมองที่กำหนดเองของคุณ

  • dispatchPopulateAccessibilityEvent()
  • onInitializeAccessibilityEvent()
  • onInitializeAccessibilityNodeInfo()
  • onPopulateAccessibilityEvent()

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้เมธอดเหล่านี้ได้ที่ส่วนเกี่ยวกับ การป้อนข้อมูลเหตุการณ์การช่วยเหลือพิเศษ

ส่งเหตุการณ์การช่วยเหลือพิเศษ

ขึ้นอยู่กับรายละเอียดของมุมมองที่กําหนดเอง คุณอาจต้องส่งออบเจ็กต์ AccessibilityEvent ในเวลาที่ต่างกันหรือสําหรับเหตุการณ์ที่การติดตั้งใช้งานเริ่มต้นไม่ได้จัดการ คลาส View มีการติดตั้งใช้งานเริ่มต้นสำหรับประเภทเหตุการณ์ต่อไปนี้

โดยทั่วไป คุณต้องส่ง AccessibilityEvent ทุกครั้งที่เนื้อหาของมุมมองที่กำหนดเองมีการเปลี่ยนแปลง ตัวอย่างเช่น หากคุณกําลังใช้แถบเลื่อนที่กําหนดเองซึ่งช่วยให้ผู้ใช้เลือกค่าตัวเลขได้โดยการกดปุ่มลูกศรซ้ายหรือขวา มุมมองที่กําหนดเองจะต้องปล่อยเหตุการณ์ของ TYPE_VIEW_TEXT_CHANGED ทุกครั้งที่ค่าแถบเลื่อนเปลี่ยนแปลง ตัวอย่างโค้ดต่อไปนี้แสดงการใช้เมธอด sendAccessibilityEvent() เพื่อรายงานเหตุการณ์นี้

Kotlin

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
    return when(keyCode) {
        KeyEvent.KEYCODE_DPAD_LEFT -> {
            currentValue--
            sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED)
            true
        }
        ...
    }
}

Java

@Override
public boolean onKeyUp (int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
        currentValue--;
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
        return true;
    }
    ...
}

ป้อนข้อมูลกิจกรรมการช่วยเหลือพิเศษ

แต่ละ AccessibilityEvent มีชุดพร็อพเพอร์ตี้ที่จำเป็นซึ่งอธิบายสถานะปัจจุบันของมุมมอง พร็อพเพอร์ตี้เหล่านี้รวมถึงสิ่งต่างๆ เช่น ชื่อคลาสของมุมมอง คำอธิบายเนื้อหา และสถานะที่เลือก พร็อพเพอร์ตี้ที่เฉพาะเจาะจงซึ่งจำเป็นสำหรับเหตุการณ์แต่ละประเภทจะอธิบายไว้ใน AccessibilityEvent เอกสารอ้างอิง

การติดตั้งใช้งาน View จะระบุค่าเริ่มต้นสำหรับพร็อพเพอร์ตี้ที่ต้องระบุเหล่านี้ ค่าเหล่านี้หลายค่า รวมถึงชื่อคลาสและการประทับเวลาของเหตุการณ์ จะระบุโดยอัตโนมัติ หากสร้างคอมโพเนนต์มุมมองที่กำหนดเอง คุณต้องระบุข้อมูล เกี่ยวกับเนื้อหาและลักษณะของมุมมอง ข้อมูลนี้อาจเป็นเพียงป้ายกำกับปุ่ม และอาจรวมถึงข้อมูลสถานะเพิ่มเติมที่คุณต้องการเพิ่มลงในเหตุการณ์

ใช้วิธีการ onPopulateAccessibilityEvent() และ onInitializeAccessibilityEvent() เพื่อป้อนหรือแก้ไขข้อมูลใน AccessibilityEvent ใช้ onPopulateAccessibilityEvent()เมธอดสำหรับการเพิ่มหรือแก้ไขข้อความ เนื้อหาของเหตุการณ์โดยเฉพาะ ซึ่งจะเปลี่ยนเป็นข้อความแจ้งที่ได้ยินโดยบริการช่วยเหลือพิเศษ เช่น TalkBack ใช้เมธอด onInitializeAccessibilityEvent() เพื่อป้อนข้อมูลเพิ่มเติม เกี่ยวกับเหตุการณ์ เช่น สถานะการเลือกของมุมมอง

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

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีลบล้างเมธอดทั้ง 3 นี้ในมุมมอง

Kotlin

override fun onPopulateAccessibilityEvent(event: AccessibilityEvent?) {
    super.onPopulateAccessibilityEvent(event)
    // Call the super implementation to populate its text for the
    // event. Then, add text not present in a super class.
    // You typically only need to add the text for the custom view.
    if (text?.isNotEmpty() == true) {
        event?.text?.add(text)
    }
}

override fun onInitializeAccessibilityEvent(event: AccessibilityEvent?) {
    super.onInitializeAccessibilityEvent(event)
    // Call the super implementation to let super classes
    // set appropriate event properties. Then, add the new checked
    // property that is not supported by a super class.
    event?.isChecked = isChecked()
}

override fun onInitializeAccessibilityNodeInfo(info: AccessibilityNodeInfo?) {
    super.onInitializeAccessibilityNodeInfo(info)
    // Call the super implementation to let super classes set
    // appropriate info properties. Then, add the checkable and checked
    // properties that are not supported by a super class.
    info?.isCheckable = true
    info?.isChecked = isChecked()
    // You typically only need to add the text for the custom view.
    if (text?.isNotEmpty() == true) {
        info?.text = text
    }
}

Java

@Override
public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
    super.onPopulateAccessibilityEvent(event);
    // Call the super implementation to populate its text for the
    // event. Then, add the text not present in a super class.
    // You typically only need to add the text for the custom view.
    CharSequence text = getText();
    if (!TextUtils.isEmpty(text)) {
        event.getText().add(text);
    }
}

@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
    super.onInitializeAccessibilityEvent(event);
    // Call the super implementation to let super classes
    // set appropriate event properties. Then, add the new checked
    // property that is not supported by a super class.
    event.setChecked(isChecked());
}

@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfo(info);
    // Call the super implementation to let super classes set
    // appropriate info properties. Then, add the checkable and checked
    // properties that are not supported by a super class.
    info.setCheckable(true);
    info.setChecked(isChecked());
    // You typically only need to add the text for the custom view.
    CharSequence text = getText();
    if (!TextUtils.isEmpty(text)) {
        info.setText(text);
    }
}

คุณสามารถใช้วิธีการเหล่านี้ได้โดยตรงในคลาสมุมมองที่กำหนดเอง

ระบุบริบทการช่วยเหลือพิเศษที่ปรับแต่งแล้ว

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

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

รูปที่ 1 มุมมองปฏิทินที่กำหนดเองซึ่งมีองค์ประกอบวันให้เลือก

ในตัวอย่างในรูปที่ 1 ปฏิทินทั้งหมดได้รับการติดตั้งใช้งานเป็นมุมมองเดียว ดังนั้นบริการช่วยเหลือพิเศษ จึงไม่ได้รับข้อมูลเพียงพอเกี่ยวกับเนื้อหาของมุมมองและการเลือกของผู้ใช้ ภายในมุมมอง เว้นแต่ว่านักพัฒนาแอปจะให้ข้อมูลเพิ่มเติม ตัวอย่างเช่น หากผู้ใช้คลิกวันที่ที่ติดป้ายกำกับว่า 17 เฟรมเวิร์กการช่วยเหลือพิเศษจะได้รับข้อมูลคำอธิบาย สำหรับตัวควบคุมปฏิทินทั้งหมดเท่านั้น ในกรณีนี้ บริการการช่วยเหลือพิเศษของ TalkBack จะประกาศว่า "ปฏิทิน" หรือ "ปฏิทินเดือนเมษายน" และผู้ใช้จะไม่ทราบว่ามีการเลือกวันใด

เฟรมเวิร์กมีวิธีระบุลำดับชั้นการแสดงผลเสมือนเพื่อให้ข้อมูลบริบทที่เพียงพอสำหรับบริการการช่วยเหลือพิเศษในสถานการณ์เช่นนี้ ลำดับชั้นการแสดงผลเสมือนจริงเป็นวิธีที่นักพัฒนาแอปใช้เพื่อจัดเตรียมลำดับชั้นการแสดงผลเสริมให้กับบริการการช่วยเหลือพิเศษ ซึ่งจะตรงกับข้อมูลบนหน้าจอมากขึ้น แนวทางนี้ช่วยให้บริการช่วยเหลือพิเศษสามารถให้ข้อมูลบริบทที่เป็นประโยชน์มากขึ้นแก่ผู้ใช้ได้

อีกสถานการณ์ที่อาจต้องใช้ลำดับชั้นการแสดงผลเสมือนคืออินเทอร์เฟซผู้ใช้ที่มี ชุดViewตัวควบคุมที่มีฟังก์ชันที่เกี่ยวข้องอย่างใกล้ชิด ซึ่งการดำเนินการในตัวควบคุมหนึ่ง จะส่งผลต่อเนื้อหาขององค์ประกอบอย่างน้อย 1 รายการ เช่น ตัวเลือกตัวเลขที่มีปุ่มขึ้น และลงแยกกัน ในกรณีนี้ บริการช่วยเหลือพิเศษจะไม่ได้รับข้อมูลที่เพียงพอเนื่องจาก การดำเนินการในตัวควบคุมหนึ่งจะเปลี่ยนเนื้อหาในอีกตัวควบคุมหนึ่ง และความสัมพันธ์ของตัวควบคุมเหล่านั้นอาจไม่ ชัดเจนสำหรับบริการ

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

หากต้องการระบุลำดับชั้นการแสดงผลเสมือนสำหรับมุมมอง ให้ลบล้างเมธอด getAccessibilityNodeProvider() ในมุมมองที่กำหนดเองหรือกลุ่มการแสดงผล แล้วส่งคืนการใช้งานของ AccessibilityNodeProvider คุณสามารถใช้ลำดับชั้นมุมมองเสมือนได้โดยใช้ Support Library กับเมธอด ViewCompat.getAccessibilityNodeProvider() และระบุการติดตั้งใช้งานด้วย AccessibilityNodeProviderCompat

หากต้องการลดความซับซ้อนของงานในการให้ข้อมูลแก่บริการการช่วยเหลือพิเศษและการจัดการโฟกัสการช่วยเหลือพิเศษ คุณสามารถใช้ExploreByTouchHelperแทนได้ โดยจะให้ AccessibilityNodeProviderCompat และสามารถแนบเป็น AccessibilityDelegateCompat ของมุมมองได้โดยการเรียกใช้ setAccessibilityDelegate ดูตัวอย่างได้ที่ ExploreByTouchHelperActivity ExploreByTouchHelper ยังใช้โดยวิดเจ็ตเฟรมเวิร์ก เช่น CalendarView ผ่าน มุมมองย่อย SimpleMonthView

จัดการเหตุการณ์การสัมผัสที่กำหนดเอง

การควบคุมมุมมองที่กำหนดเองอาจต้องใช้ลักษณะการทำงานของการโต้ตอบแบบสัมผัสที่ไม่เป็นไปตามมาตรฐาน ดังที่แสดงใน ตัวอย่างต่อไปนี้

กำหนดการกระทำที่อิงตามการคลิก

หากวิดเจ็ตใช้อินเทอร์เฟซ OnClickListener หรือ OnLongClickListener ระบบจะจัดการการดำเนินการ ACTION_CLICK และ ACTION_LONG_CLICK ให้คุณ หากแอปใช้วิดเจ็ตที่ปรับแต่งมากขึ้นซึ่งอาศัยอินเทอร์เฟซ OnTouchListener ให้กำหนดตัวแฮนเดิลที่กำหนดเองสำหรับการดำเนินการเพื่อการช่วยเหลือพิเศษที่อิงตามการคลิก โดยเรียกใช้เมธอด replaceAccessibilityAction() สําหรับการกระทําแต่ละอย่าง ดังที่แสดงในข้อมูลโค้ดต่อไปนี้

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    ...

    // Assumes that the widget is designed to select text when tapped, and selects
    // all text when tapped and held. In its strings.xml file, this app sets
    // "select" to "Select" and "select_all" to "Select all".
    ViewCompat.replaceAccessibilityAction(
        binding.textSelectWidget,
        ACTION_CLICK,
        getString(R.string.select)
    ) { view, commandArguments ->
        selectText()
    }

    ViewCompat.replaceAccessibilityAction(
        binding.textSelectWidget,
        ACTION_LONG_CLICK,
        getString(R.string.select_all)
    ) { view, commandArguments ->
        selectAllText()
    }
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...

    // Assumes that the widget is designed to select text when tapped, and select
    // all text when tapped and held. In its strings.xml file, this app sets
    // "select" to "Select" and "select_all" to "Select all".
    ViewCompat.replaceAccessibilityAction(
            binding.textSelectWidget,
            ACTION_CLICK,
            getString(R.string.select),
            (view, commandArguments) -> selectText());

    ViewCompat.replaceAccessibilityAction(
            binding.textSelectWidget,
            ACTION_LONG_CLICK,
            getString(R.string.select_all),
            (view, commandArguments) -> selectAllText());
}

สร้างเหตุการณ์คลิกที่กำหนดเอง

ตัวควบคุมที่กำหนดเองสามารถใช้onTouchEvent(MotionEvent)เมธอด Listener เพื่อตรวจหาเหตุการณ์ACTION_DOWNและACTION_UP และทริกเกอร์กิจกรรมการคลิกพิเศษ โค้ดที่จัดการกิจกรรมการคลิกที่กำหนดเองนี้ต้องทำสิ่งต่อไปนี้เพื่อให้ยังคงใช้งานร่วมกับบริการการช่วยเหลือพิเศษได้

  1. สร้าง AccessibilityEvent ที่เหมาะสมสำหรับการดำเนินการคลิกที่ตีความ
  2. เปิดใช้บริการการช่วยเหลือพิเศษเพื่อดำเนินการคลิกที่กำหนดเองสำหรับผู้ใช้ที่ไม่สามารถใช้หน้าจอสัมผัส ได้

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

Kotlin

class CustomTouchView(context: Context) : View(context) {

    var downTouch = false

    override fun onTouchEvent(event: MotionEvent): Boolean {
        super.onTouchEvent(event)

        // Listening for the down and up touch events.
        return when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                downTouch = true
                true
            }

            MotionEvent.ACTION_UP -> if (downTouch) {
                downTouch = false
                performClick() // Call this method to handle the response and
                // enable accessibility services to
                // perform this action for a user who can't
                // tap the touchscreen.
                true
            } else {
                false
            }

            else -> false  // Return false for other touch events.
        }
    }

    override fun performClick(): Boolean {
        // Calls the super implementation, which generates an AccessibilityEvent
        // and calls the onClick() listener on the view, if any.
        super.performClick()

        // Handle the action for the custom click here.

        return true
    }
}

Java

class CustomTouchView extends View {

    public CustomTouchView(Context context) {
        super(context);
    }

    boolean downTouch = false;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        // Listening for the down and up touch events
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downTouch = true;
                return true;

            case MotionEvent.ACTION_UP:
                if (downTouch) {
                    downTouch = false;
                    performClick(); // Call this method to handle the response and
                                    // enable accessibility services to
                                    // perform this action for a user who can't
                                    // tap the touchscreen.
                    return true;
                }
        }
        return false; // Return false for other touch events.
    }

    @Override
    public boolean performClick() {
        // Calls the super implementation, which generates an AccessibilityEvent
        // and calls the onClick() listener on the view, if any.
        super.performClick();

        // Handle the action for the custom click here.

        return true;
    }
}

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