Làm cách nào để tạo hoạt ảnh cho một chế độ xem trong Android và giữ nó ở vị trí / kích thước mới?


80

Tôi hiện có một chế độ xem trong ứng dụng Android của mình và chế độ xem này đang phát hoạt ảnh khung. Tôi muốn tạo hoạt ảnh cho chế độ xem để tăng kích thước của nó lên 150%. Khi tôi áp dụng hoạt ảnh tỷ lệ cho nó và hoạt ảnh tỷ lệ hoàn thành, tôi muốn người xem giữ nguyên kích thước mới đó trong phần còn lại của vòng đời hoạt động. Rất tiếc ngay bây giờ khi hoạt ảnh mở rộng quy mô hoàn tất, chế độ xem sẽ quay trở lại kích thước ban đầu. Làm cách nào tôi có thể lấy nó để giữ cho chuyển đổi hoạt hình mới?

Tôi đang sử dụng

myView.startAnimation(AnimationUtils.loadAnimation(mContext,R.anim.scaleUp150));

Cảm ơn!

Câu trả lời:


149

Đảm bảo bạn thêm các thuộc tính dưới đây vào phần tử gốc trong xml hoạt ảnh của bạn:

android:fillAfter="true" 
android:fillEnabled="true"

7
Đây là câu trả lời thực sự. OP nên thay đổi điều này thành câu trả lời được chấp nhận. Xin cảm ơn Qlimax !! (PS này không được ghi nhận trong "Animation" của Hướng dẫn Dev, nó chỉ được diễn tả trong javadocs cho lớp Animation tài liệu hướng dẫn người nghèo như vậy.!)
Neil Traft

7
đặt mã này ở đâu? trong <set ...></set>hoặc trong thẻ hoạt hình ( translate| rotate| scale)?
xxxxxxxxxadfas

5
như đã đề cập dưới đây, bạn cần phải thêm nó vào paramter bộ
CV2

3
Điều này không hoạt động. Tôi muốn kích thước thực của chế độ xem thay đổi theo hình ảnh động. Nó chỉ thay đổi nội dung. Tôi đang thay đổi tỷ lệ Y từ 1,0 thành 0,0 và hoạt ảnh xảy ra nhưng để lại một không gian trống nơi chế độ xem trước đây. Ngoài ra, tôi đã thử View.GONE nhưng điều đó đặt các chế độ xem khác vào không gian trống. Tôi cần các chế độ xem khác tuân theo kích thước của chế độ xem chia tỷ lệ trong khi nó thu nhỏ. Làm thế nào để làm cho nó hoạt động?
Sudhanshu

1
Bất kỳ người nào khác đang đọc điều này được lưu ý rằng fillAftersẽ chỉ giữ các pixel của chế độ xem trong khi chế độ xem thực vẫn sẽ ở vị trí ban đầu. Bạn có thể cần đặt LayoutParamschế độ xem của mình theo cách thủ công trong onAminaEnd (trình nghe).
Muhammad Babar


32

nếu bạn muốn đặt hoạt ảnh của mình trong một xml , nó có thể cần điều này để trợ giúp:

<set
android:fillEnabled="true"
android:fillAfter="true"
xmlns:android="http://schemas.android.com/apk/res/android">

<translate
    android:fromYDelta="0"
    android:toYDelta="-20%p"
    android:duration="7000" />

</set>

https://stackoverflow.com/a/6519233/371749

Xin vui lòng cũng đánh giá cao câu trả lời khác, đã giúp tôi :) chúc may mắn!


22

Ngày nay nó đã trở nên rất dễ dàng:

view.animate().x(valueX).y(valueY).setDuration(500).start();

(Trong đoạn mã này ViewPropertyAnimator đã được sử dụng).

Có thể thêm nhiều tùy chọn khác.

View sẽ được đặt ở vị trí mới.


Điều này sẽ được đăng dưới dạng chủ đề thịnh hành
Kotik_o

2

CHỈNH SỬA: Câu trả lời của Qlimax tốt hơn, nhưng vì OP đã không quay lại để thay đổi dấu kiểm và tôi không thể xóa câu trả lời được chấp nhận, tôi sẽ sao chép nó ở đây: chỉ cần đặt fillAfter = true fillEnabled = true

Câu trả lời ban đầu của tôi (có hiệu quả, nhưng hơi nực cười khi so sánh) như sau:

Để mọi thứ hoạt động như mong đợi sau hoạt ảnh, ít nhất theo chuỗi này , bạn sẽ phải viết một onAnimationEndtrình xử lý và trong đó, điều chỉnh thủ công các giới hạn "thực" (trước chuyển đổi) của chế độ xem của bạn để khớp với kết quả cuối cùng của hoạt ảnh quy mô.


Chào Walter. Tôi đã ghi đè onAnimationEnd, nhưng tôi không biết cách điều chỉnh giới hạn "thực" của chế độ xem để phù hợp với tỷ lệ của hoạt ảnh. Tôi không biết tôi muốn nó kết thúc bằng dp chính xác nào, nhưng tôi không thể tìm thấy hàm "setWidth ()" hoặc "setHeight ()".
justinl

1
Tôi tin rằng chúng được lưu trữ trong LayoutParams. Bạn sẽ có thể làm view.getLayoutParams().width = newWidth; view.getLayoutParams().height = newHeight; view.requestLayout();. (Cuộc gọi thứ hai là cần thiết để thông báo cho cây quan điểm cho rằng nó cần phải được tính toán lại.)
Walter Mundt

2
Đây là một cách làm vô cùng vòng vo. Tất cả những gì cần làm là thiết lập các thuộc tính android:fillEnabledandroid:fillAftercả hai đều đúng.
Neil Traft

1

Trên thực tế, vì hoạt ảnh bạn đang sử dụng dường như là một hoạt ảnh được nhúng trong khuôn khổ Android, tôi không chắc bạn có thể thay đổi bất kỳ điều gì trong đó.
Tuy nhiên, bạn có thể tạo hoạt ảnh của riêng mình bằng cách làm theo ví dụ trong tài liệu . Và bạn sẽ phải đặt android: fillAfter = "true" nếu bạn muốn tỷ lệ được giữ sau khi kết thúc hoạt ảnh.


2
scaleUp150 là một hoạt ảnh tùy chỉnh tôi đã viết bằng xml (mặc dù nó cực kỳ cơ bản). Tôi đã đặt android: fillAfter = "true" bên trong hình ảnh động nhưng nó vẫn chụp lại kích thước ban đầu: S
justinl

1

Đặt android: fillAfter = "true" trong thẻ SET - vì việc đặt chúng trong thẻ hoạt ảnh sẽ giới hạn chúng với "thông số chuyển tiếp" hoặc "trong / trong khi thông số hoạt ảnh". Các tham số trong SET sẽ áp dụng phép biến đổi mà bạn đang tìm kiếm sau khi nó kết thúc các hoạt ảnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.