Ảnh động dạng khung hiển thị

Bạn có thể sử dụng hệ thống ảnh động dạng khung hiển thị để thực hiện ảnh động lấy giá trị giữa trên Khung hiển thị. Ảnh động lấy giá trị giữa tính toán ảnh động bằng các thông tin như điểm bắt đầu, điểm kết thúc, kích thước, chế độ xoay và các khía cạnh phổ biến khác của ảnh động.

Ảnh động lấy giá trị giữa có thể thực hiện một loạt các phép biến đổi đơn giản (vị trí, kích thước, chế độ xoay và độ trong suốt) cho nội dung của đối tượng Khung hiển thị. Vì vậy, nếu có đối tượng TextView, bạn có thể di chuyển, xoay, phóng to hoặc thu nhỏ văn bản. Nếu có hình nền, thì hình nền sẽ được biến đổi cùng với văn bản. animation package cung cấp tất cả các lớp được dùng trong ảnh động lấy giá trị giữa.

Trình tự hướng dẫn về ảnh động xác định ảnh động lấy giá trị giữa, được xác định bằng mã XML hoặc Android. Tương tự như việc xác định bố cục, bạn nên dùng tệp XML vì tệp này dễ đọc, dễ sử dụng lại và có thể hoán đổi hơn so với việc mã hoá cứng ảnh động. Trong ví dụ bên dưới, chúng tôi sử dụng XML. (Để tìm hiểu thêm về cách xác định ảnh động trong mã xử lý ứng dụng, thay vì XML, hãy tham khảo lớp AnimationSet và các lớp con Animation khác.)

Hướng dẫn về ảnh động xác định các phép biến đổi mà bạn muốn xảy ra, thời điểm xảy ra và khoảng thời gian cần thiết để áp dụng các phép biến đổi đó. Các phép biến đổi có thể diễn ra tuần tự hoặc đồng thời. Ví dụ: bạn có thể di chuyển nội dung của một TextView từ trái sang phải, sau đó xoay 180 độ hoặc bạn có thể để văn bản di chuyển và xoay đồng thời. Mỗi phép biến đổi sẽ nhận một tập hợp các tham số dành riêng cho phép biến đổi đó (kích thước bắt đầu và kích thước kết thúc khi thay đổi kích thước, góc bắt đầu và góc kết thúc khi xoay, v.v.) và một tập hợp các tham số phổ biến (ví dụ: thời gian bắt đầu và thời lượng). Để thực hiện một số phép biến đổi xảy ra đồng thời, hãy đặt thời gian bắt đầu giống nhau cho các phép biến đổi đó. Để các phép biến đổi diễn ra tuần tự, hãy tính thời gian bắt đầu cộng với thời lượng của phép biến đổi trước đó.

Tệp XML ảnh động nằm trong thư mục res/anim/ của dự án Android. Tệp phải có một phần tử gốc: đây sẽ là một phần tử <alpha>, <scale>, <translate>, <rotate>, phần tử bộ nội suy hoặc <set> duy nhất chứa nhóm các phần tử này (có thể bao gồm một <set> khác). Theo mặc định, tất cả hướng dẫn về ảnh động được áp dụng đồng thời. Để các thao tác này diễn ra tuần tự, bạn phải chỉ định thuộc tính startOffset, như trong ví dụ bên dưới.

Mã XML sau đây từ một trong các Apidemos được dùng để kéo dài, sau đó đồng thời xoay và xoay đối tượng View.

<set android:shareInterpolator="false">
    <scale
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromXScale="1.0"
        android:toXScale="1.4"
        android:fromYScale="1.0"
        android:toYScale="0.6"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false"
        android:duration="700" />
    <set android:interpolator="@android:anim/decelerate_interpolator">
        <scale
           android:fromXScale="1.4"
           android:toXScale="0.0"
           android:fromYScale="0.6"
           android:toYScale="0.0"
           android:pivotX="50%"
           android:pivotY="50%"
           android:startOffset="700"
           android:duration="400"
           android:fillBefore="false" />
        <rotate
           android:fromDegrees="0"
           android:toDegrees="-45"
           android:toYScale="0.0"
           android:pivotX="50%"
           android:pivotY="50%"
           android:startOffset="700"
           android:duration="400" />
    </set>
</set>

Toạ độ màn hình (không được sử dụng trong ví dụ này) là (0,0) ở góc trên bên trái và sẽ tăng lên khi bạn di chuyển xuống và sang phải.

Bạn có thể chỉ định một số giá trị, chẳng hạn như scaleX, so với chính đối tượng đó hoặc so với phần tử mẹ. Hãy nhớ sử dụng định dạng phù hợp cho nội dung bạn muốn ("50" cho 50% so với thành phần mẹ, hoặc "50%" cho 50% so với chính nó).

Bạn có thể xác định cách áp dụng phép biến đổi theo thời gian bằng cách chỉ định Interpolator. Android có một số lớp con Bộ nội suy chỉ định nhiều đường cong tốc độ: chẳng hạn như AccelerateInterpolator sẽ yêu cầu một phép biến đổi bắt đầu chậm và tăng tốc. Mỗi thuộc tính có một giá trị thuộc tính có thể áp dụng trong XML.

Khi XML này được lưu dưới dạng hyperspace_jump.xml trong thư mục res/anim/ của dự án, mã sau đây sẽ tham chiếu đến mã này và áp dụng cho một đối tượng ImageView từ bố cục.

Kotlin

AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump).also { hyperspaceJumpAnimation ->
    findViewById<ImageView>(R.id.spaceshipImage).startAnimation(hyperspaceJumpAnimation)
}

Java

ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);

Thay vì startAnimation(), bạn có thể xác định thời gian bắt đầu cho ảnh động bằng Animation.setStartTime(), sau đó gán ảnh động đó cho Chế độ xem bằng View.setAnimation().

Để biết thêm thông tin về cú pháp XML, các thẻ và thuộc tính có sẵn, hãy xem phần Tài nguyên ảnh động.

Lưu ý: Bất kể ảnh động của bạn có thể di chuyển hay đổi kích thước như thế nào, các giới hạn của Khung hiển thị lưu giữ ảnh động sẽ không tự động điều chỉnh cho phù hợp với ảnh động đó. Mặc dù vậy, ảnh động vẫn sẽ được vẽ vượt quá giới hạn của Chế độ xem và sẽ không bị cắt bớt. Tuy nhiên, việc cắt xén sẽ xảy ra nếu ảnh động vượt quá giới hạn của Chế độ xem mẹ.