สร้างภาพเคลื่อนไหวการเปลี่ยนที่กำหนดเอง

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

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

หน้านี้จะสอนวิธีบันทึกค่าของพร็อพเพอร์ตี้และสร้างภาพเคลื่อนไหวเพื่อสร้าง การเปลี่ยนด้วยตนเอง

ขยายคลาสการเปลี่ยน

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

Kotlin

class CustomTransition : Transition() {

    override fun captureStartValues(transitionValues: TransitionValues) {}

    override fun captureEndValues(transitionValues: TransitionValues) {}

    override fun createAnimator(
        sceneRoot: ViewGroup,
        startValues: TransitionValues?,
        endValues: TransitionValues?
    ): Animator? {}

}

Java

public class CustomTransition extends Transition {

    @Override
    public void captureStartValues(TransitionValues values) {}

    @Override
    public void captureEndValues(TransitionValues values) {}

    @Override
    public Animator createAnimator(ViewGroup sceneRoot,
                                   TransitionValues startValues,
                                   TransitionValues endValues) {}
}

ส่วนต่อไปนี้จะอธิบายวิธีลบล้างฟังก์ชันเหล่านี้

บันทึกค่าของพร็อพเพอร์ตี้ข้อมูลพร็อพเพอร์ตี้

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

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

บันทึกค่าเริ่มต้น

หากต้องการส่งค่ามุมมองเริ่มต้นไปยังเฟรมเวิร์ก ให้ใช้เมธอด captureStartValues(transitionValues) เฟรมเวิร์กนี้เรียกใช้ฟังก์ชันนี้สำหรับทุกมุมมองในฉากเริ่มต้น ฟังก์ชัน เป็นออบเจ็กต์ TransitionValues ที่มีการอ้างอิง ไปยังข้อมูลพร็อพเพอร์ตี้และอินสแตนซ์ Map ซึ่งคุณสามารถจัดเก็บค่าการดูที่คุณ ต้องการ ในการใช้งาน ให้ดึงค่าพร็อพเพอร์ตี้เหล่านี้และส่งกลับไปยัง โดยจัดเก็บลงในแผนที่

เพื่อให้แน่ใจว่าคีย์สำหรับค่าพร็อพเพอร์ตี้ไม่ขัดแย้งกับ TransitionValues คีย์ ให้ใช้รูปแบบการตั้งชื่อต่อไปนี้

package_name:transition_name:property_name

ข้อมูลโค้ดต่อไปนี้แสดงการใช้งานฟังก์ชัน captureStartValues()

Kotlin

class CustomTransition : Transition() {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private val PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background"

    override fun captureStartValues(transitionValues: TransitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues)
    }

    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private fun captureValues(transitionValues: TransitionValues) {
        // Get a reference to the view
        val view = transitionValues.view
        // Store its background property in the values map
        transitionValues.values[PROPNAME_BACKGROUND] = view.background
    }

    ...

}

Java

public class CustomTransition extends Transition {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private static final String PROPNAME_BACKGROUND =
            "com.example.android.customtransition:CustomTransition:background";

    @Override
    public void captureStartValues(TransitionValues transitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues);
    }


    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private void captureValues(TransitionValues transitionValues) {
        // Get a reference to the view
        View view = transitionValues.view;
        // Store its background property in the values map
        transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground());
    }
    ...
}

บันทึกค่าสิ้นสุด

เฟรมเวิร์กนี้เรียกใช้ฟังก์ชัน captureEndValues(TransitionValues) 1 ครั้งสำหรับแต่ละมุมมองเป้าหมายในฉากจบ ในแง่อื่นๆ captureEndValues() จะทำงานเหมือนกับ captureStartValues()

ข้อมูลโค้ดต่อไปนี้แสดงการใช้งานฟังก์ชัน captureEndValues()

Kotlin

override fun captureEndValues(transitionValues: TransitionValues) {
    captureValues(transitionValues)
}

Java

@Override
public void captureEndValues(TransitionValues transitionValues) {
    captureValues(transitionValues);
}

ในตัวอย่างนี้ ทั้ง captureStartValues() และ captureEndValues() เรียกใช้ captureValues() เพื่อเรียกและเก็บค่า พร็อพเพอร์ตี้ข้อมูลพร็อพเพอร์ตี้ ที่ captureValues() ดึงมาเหมือนกัน แต่มีค่าต่างกันใน ฉากเริ่มต้นและสิ้นสุด กรอบการทำงานมีแผนที่ที่แยกกันสำหรับช่วงเริ่มต้นและสิ้นสุด สถานะของมุมมอง

สร้างภาพเคลื่อนไหวที่กำหนดเอง

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

จำนวนครั้งที่เฟรมเวิร์กเรียกใช้ฟังก์ชัน createAnimator() จะขึ้นอยู่กับ การเปลี่ยนแปลงที่เกิดขึ้นระหว่างฉากเริ่มต้นและสิ้นสุด

เช่น พิจารณาใช้การค่อยๆ จางลงหรือ ภาพเคลื่อนไหวแบบเฟดอินที่ใช้เป็นการเปลี่ยนที่กำหนดเอง ถ้าฉากเริ่มต้นมีเป้าหมาย 5 รายการ ซึ่งนำ 2 ออกจากฉากจบ และฉากจบจะมีเป้าหมาย 3 เป้าหมายจาก ฉากเริ่มต้นบวกเป้าหมายใหม่ จากนั้นเฟรมเวิร์กจะเรียกใช้ createAnimator() 6 ครั้ง การโทร 3 ครั้งที่ทำให้เป้าหมายที่หลงเหลืออยู่ในทั้ง 2 ฉากและค่อยๆ จางลงเคลื่อนไหว ออบเจ็กต์ อีก 2 สายทำให้เป้าหมายที่ค่อยๆ จางหายไปจากฉากจบ หนึ่ง การเรียกทำให้การค่อยๆ นำเข้าเป้าหมายใหม่ในฉากจบเกิดการค่อยๆ จางลง

สำหรับมุมมองเป้าหมายที่มีอยู่ทั้งในฉากเริ่มต้นและฉากจบ เฟรมเวิร์กจะให้ ออบเจ็กต์ TransitionValues สำหรับทั้ง startValues และ endValues อาร์กิวเมนต์ สำหรับมุมมองเป้าหมายที่มีอยู่เฉพาะในช่วงเริ่มต้นหรือ ฉากจบ เฟรมเวิร์กจะมีออบเจ็กต์ TransitionValues สำหรับอาร์กิวเมนต์ที่เกี่ยวข้องและ null สำหรับอีกอาร์กิวเมนต์

เพื่อใช้ฟังก์ชัน createAnimator(ViewGroup, TransitionValues, TransitionValues) เมื่อคุณสร้าง การเปลี่ยนที่กำหนดเอง ให้ใช้ค่าพร็อพเพอร์ตี้ข้อมูลพร็อพเพอร์ตี้ที่คุณบันทึกไว้เพื่อสร้างออบเจ็กต์ Animator และส่งไปยังเฟรมเวิร์ก สำหรับตัวอย่างการใช้งาน ดูชั้นเรียน ChangeColor ใน ตัวอย่างการเปลี่ยนที่กำหนดเอง ดูข้อมูลเพิ่มเติมเกี่ยวกับผู้สร้างภาพเคลื่อนไหวพร็อพเพอร์ตี้ได้ที่ ภาพเคลื่อนไหวของพร็อพเพอร์ตี้

ใช้การเปลี่ยนที่กำหนดเอง

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