Tạo một ảnh động chuyển tiếp tuỳ chỉnh

Hiệu ứng chuyển đổi tuỳ chỉnh cho phép bạn tạo ảnh động không có trong các lớp chuyển đổi tích hợp sẵn. Ví dụ: bạn có thể xác định một hiệu ứng chuyển đổi tuỳ chỉnh chuyển màu nền trước của trường văn bản và trường nhập dữ liệu sang màu xám để cho biết rằng các trường đó bị tắt trong màn hình mới. Loại thay đổi này giúp người dùng xem được các trường mà bạn đã tắt.

Quá trình chuyển đổi tuỳ chỉnh, giống như một trong các loại chuyển đổi tích hợp sẵn, sẽ áp dụng ảnh động cho các khung hiển thị con của cả cảnh bắt đầu và cảnh kết thúc. Tuy nhiên, không giống như các loại chuyển đổi tích hợp sẵn, bạn phải cung cấp mã ghi lại các giá trị thuộc tính và tạo ảnh động. Bạn cũng nên xác định một tập hợp con các khung hiển thị mục tiêu cho ảnh động của mình.

Trang này hướng dẫn bạn cách ghi lại các giá trị thuộc tính và tạo ảnh động để tạo hiệu ứng chuyển đổi tuỳ chỉnh.

Mở rộng lớp Transition

Để tạo hiệu ứng chuyển đổi tuỳ chỉnh, hãy thêm một lớp vào dự án. Lớp này sẽ mở rộng lớp Transition và ghi đè các hàm hiển thị trong đoạn mã sau:

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) {}
}

Các phần sau đây giải thích cách ghi đè các hàm này.

Ghi lại giá trị thuộc tính khung hiển thị

Ảnh động chuyển đổi sử dụng hệ thống ảnh động thuộc tính được mô tả trong phần Tổng quan về ảnh động thuộc tính. Ảnh động thuộc tính thay đổi thuộc tính chế độ xem từ giá trị bắt đầu thành giá trị kết thúc trong một khoảng thời gian cụ thể, vì vậy, khung cần có cả giá trị bắt đầu và kết thúc của thuộc tính để tạo ảnh động.

Tuy nhiên, một ảnh động thuộc tính thường chỉ cần một tập nhỏ trong số tất cả các giá trị thuộc tính của khung hiển thị. Ví dụ: ảnh động màu cần giá trị thuộc tính màu, trong khi ảnh động chuyển động cần giá trị thuộc tính vị trí. Vì các giá trị thuộc tính cần thiết cho ảnh động là dành riêng cho một hiệu ứng chuyển đổi, nên khung chuyển đổi không cung cấp mọi giá trị thuộc tính cho một hiệu ứng chuyển đổi. Thay vào đó, khung này sẽ gọi các hàm callback cho phép hiệu ứng chuyển đổi chỉ thu thập các giá trị thuộc tính cần thiết và lưu trữ các giá trị đó trong khung.

Lấy giá trị bắt đầu

Để truyền các giá trị khung hiển thị bắt đầu vào khung, hãy triển khai hàm captureStartValues(transitionValues). Khung gọi hàm này cho mọi thành phần hiển thị trong cảnh bắt đầu. Đối số hàm là một đối tượng TransitionValues chứa tham chiếu đến khung hiển thị và một thực thể Map nơi bạn có thể lưu trữ các giá trị khung hiển thị mong muốn. Trong quá trình triển khai, hãy truy xuất các giá trị thuộc tính này và chuyển chúng trở lại khung bằng cách lưu trữ các giá trị đó trong bản đồ.

Để đảm bảo khoá cho một giá trị thuộc tính không xung đột với các khoá TransitionValues khác, hãy sử dụng lược đồ đặt tên sau:

package_name:transition_name:property_name

Đoạn mã sau đây cho thấy cách triển khai hàm 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());
    }
    ...
}

Lấy giá trị cuối cùng

Khung này gọi hàm captureEndValues(TransitionValues) một lần cho mọi khung hiển thị mục tiêu trong cảnh kết thúc. Trong mọi trường hợp khác, captureEndValues() hoạt động giống như captureStartValues().

Đoạn mã sau đây cho thấy cách triển khai hàm captureEndValues():

Kotlin

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

Java

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

Trong ví dụ này, cả hai hàm captureStartValues()captureEndValues() đều gọi captureValues() để truy xuất và lưu trữ các giá trị. Thuộc tính khung hiển thị mà captureValues() truy xuất giống nhau, nhưng có các giá trị khác nhau trong cảnh bắt đầu và cảnh kết thúc. Khung này duy trì các bản đồ riêng biệt cho trạng thái bắt đầu và kết thúc của khung hiển thị.

Tạo ảnh động tuỳ chỉnh

Để tạo ảnh động cho các thay đổi đối với thành phần hiển thị giữa trạng thái của nó trong cảnh bắt đầu và trạng thái của nó trong cảnh kết thúc, hãy cung cấp một ảnh động bằng cách ghi đè hàm createAnimator(). Khi gọi hàm này, khung sẽ truyền vào khung hiển thị gốc của cảnh và các đối tượng TransitionValues chứa giá trị bắt đầu và kết thúc mà bạn đã chụp.

Số lần khung gọi hàm createAnimator() phụ thuộc vào những thay đổi xảy ra giữa cảnh bắt đầu và cảnh kết thúc.

Ví dụ: hãy xem xét ảnh động mờ dần hoặc mờ dần được triển khai dưới dạng chuyển đổi tuỳ chỉnh. Nếu cảnh bắt đầu có 5 mục tiêu, trong đó 2 mục tiêu bị xoá khỏi cảnh kết thúc và cảnh kết thúc có 3 mục tiêu từ cảnh bắt đầu cộng với một mục tiêu mới, thì khung sẽ gọi createAnimator() 6 lần. 3 trong số các lệnh gọi sẽ tạo hiệu ứng chuyển động mờ dần và rõ dần của các mục tiêu ở cả hai đối tượng cảnh. Hai lệnh gọi khác sẽ tạo hiệu ứng mờ dần của các mục tiêu bị xoá khỏi cảnh kết thúc. Một lệnh gọi sẽ tạo hiệu ứng mờ dần của mục tiêu mới trong cảnh kết thúc.

Đối với các khung hiển thị mục tiêu tồn tại ở cả cảnh bắt đầu và cảnh kết thúc, khung này sẽ cung cấp một đối tượng TransitionValues cho cả đối số startValuesendValues. Đối với các thành phần hiển thị mục tiêu chỉ tồn tại trong cảnh bắt đầu hoặc kết thúc, khung sẽ cung cấp đối tượng TransitionValues cho đối số tương ứng và null cho đối số còn lại.

Để triển khai hàm createAnimator(ViewGroup, TransitionValues, TransitionValues) khi bạn tạo hiệu ứng chuyển đổi tuỳ chỉnh, hãy sử dụng các giá trị thuộc tính khung hiển thị mà bạn đã thu thập để tạo một đối tượng Animator và trả đối tượng đó về khung. Để tham khảo ví dụ về cách triển khai, hãy xem lớp ChangeColor trong mẫu CustomTransition. Để biết thêm thông tin về ảnh động thuộc tính, hãy xem bài viết Ảnh động thuộc tính.

Áp dụng hiệu ứng chuyển đổi tuỳ chỉnh

Hiệu ứng chuyển đổi tuỳ chỉnh hoạt động giống như hiệu ứng chuyển đổi tích hợp sẵn. Bạn có thể áp dụng hiệu ứng chuyển đổi tuỳ chỉnh bằng trình quản lý chuyển đổi, như mô tả trong phần Áp dụng hiệu ứng chuyển đổi.