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

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

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

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

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

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

ใช้เมธอด API การช่วยเหลือพิเศษ

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

dispatchPopulateAccessibilityEvent()
ระบบจะเรียกใช้วิธีการนี้เมื่อมุมมองที่กำหนดเองสร้างเหตุการณ์การช่วยเหลือพิเศษ ค่าเริ่มต้น การใช้งานเมธอดนี้จะเรียกใช้ onPopulateAccessibilityEvent() สำหรับข้อมูลพร็อพเพอร์ตี้นี้ แล้วใช้วิธีการ dispatchPopulateAccessibilityEvent() สำหรับองค์ประกอบย่อยแต่ละรายการ
onInitializeAccessibilityEvent()
ระบบเรียกใช้วิธีการนี้เพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับสถานะของการดูนอกเหนือจาก เนื้อหาข้อความ หากมุมมองที่กำหนดเองของคุณมอบการควบคุมเชิงโต้ตอบที่นอกเหนือจาก TextView หรือ Button ลบล้างเมธอดนี้ แล้วตั้งค่าข้อมูลเพิ่มเติมเกี่ยวกับมุมมองของคุณ เช่น ประเภทช่องรหัสผ่าน ช่องทำเครื่องหมาย ประเภท หรือสถานะที่ระบุการโต้ตอบของผู้ใช้หรือความคิดเห็นเกี่ยวกับเหตุการณ์ โดยใช้ หากคุณลบล้างเมธอดนี้ ให้เรียกการใช้งานขั้นสูงและแก้ไขเฉพาะพร็อพเพอร์ตี้ ที่ Super class ไม่ได้ตั้งไว้
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 คุณสามารถใช้ลำดับชั้นของมุมมองเสมือนได้โดยใช้ไลบรารีการสนับสนุนที่มี 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() เพื่อสร้างเหตุการณ์การช่วยเหลือพิเศษและ ให้จุดแรกเข้าสำหรับบริการการเข้าถึงเพื่อดำเนินการในนามของผู้ใช้ที่ดำเนินการ คลิกกิจกรรม