Cách dừng hoạt ảnh (hủy () không hoạt động)


244

Tôi cần phải dừng một hoạt hình dịch đang chạy. Các .cancel()phương pháp Animationkhông có hiệu lực thi hành; hoạt hình đi cho đến cuối cùng dù thế nào.

Làm thế nào để bạn hủy bỏ một hình ảnh động đang chạy?

Câu trả lời:


508

Gọi clearAnimation()bất cứ nơi nào Viewbạn gọi startAnimation().


Nhưng trên thực tế tôi cần một điều phức tạp hơn một chút: khi hoạt hình dừng lại, nó phải duy trì ở vị trí hiện tại, tức là tôi có hình ảnh trượt và trên sự kiện cảm ứng, nó phải đóng băng ở nơi này. clearAnimation () không phải là một trường hợp, bởi vì nó đặt lại trạng thái về vị trí bắt đầu / kết thúc tùy thuộc vào setFillAfter ()
Trộn

1
@ user349871: setFillAfter()có thể không làm những gì bạn nghĩ, dù sao đi nữa. Khi sự kiện chạm xảy ra, hãy xóa hình ảnh động và sau đó điều chỉnh bố cục của bạn để ảnh hưởng đến bất kỳ thay đổi vĩnh viễn nào bạn tìm kiếm.
CommonsWare

Ok, tốt, tôi sẽ cố gắng ngừng hoạt hình bằng cách gọi ClearAnimation (). Bước tiếp theo là tìm vị trí nơi hoạt hình đã ở trước khi tôi dừng nó. API nào cho điều đó?
Trộn

@Mix: Không có API cho điều đó.
CommonsWare

7
Xin chào lần nữa! Tôi đã tìm ra cách để lấy điểm (về thời gian được nội suy) khi hoạt hình bị hủy bỏ. Bạn cần tạo lớp con Animation và đặt mã từ hoạt hình mã android (ví dụ: TranslateAnimation). Trong lớp của bạn, bạn sẽ có thể lưu và theo dõi vị trí trong hàm applicationTransatures ().
Trộn

40

Trên Android 4.4.4, có vẻ như cách duy nhất tôi có thể dừng hoạt ảnh mờ dần trên Chế độ xem đang gọi View.animate().cancel()(nghĩa là gọi .cancel()trên Chế độ xem ViewPropertyAnimator).

Đây là mã tôi đang sử dụng để tương thích trước và sau ICS:

public void stopAnimation(View v) {
    v.clearAnimation();
    if (canCancelAnimation()) {
        v.animate().cancel();
    }
}

... với phương pháp:

/**
 * Returns true if the API level supports canceling existing animations via the
 * ViewPropertyAnimator, and false if it does not
 * @return true if the API level supports canceling existing animations via the
 * ViewPropertyAnimator, and false if it does not
 */
public static boolean canCancelAnimation() {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
}

Đây là hình ảnh động mà tôi đang dừng:

v.setAlpha(0f);
v.setVisibility(View.VISIBLE);
// Animate the content view to 100% opacity, and clear any animation listener set on the view.
v.animate()
    .alpha(1f)
    .setDuration(animationDuration)
    .setListener(null);

.setListener(null);Điều này đã giúp tôi.
Muhammad Saqib

18

Nếu bạn đang sử dụng trình nghe hoạt hình, hãy đặt v.setAnimationListener(null). Sử dụng mã sau đây với tất cả các tùy chọn.

v.getAnimation().cancel();
v.clearAnimation();
animation.setAnimationListener(null);

2
Nó không phải là không cần thiết để gọi v.setAnimation(null);bởi vì điều này sẽ được thực hiện trong v.clearAnimation();.
Christian

Như @Christian đã nói v.setAnimation (null) là không bắt buộc
akshay bhange

5

Bạn phải sử dụng .clearAnimation (); phương thức trong luồng UI:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        v.clearAnimation();
    }
});

3

Những gì bạn có thể cố gắng làm là lấy Ma trận chuyển đổi từ hoạt hình trước khi bạn dừng nó và kiểm tra nội dung Ma trận để có được các giá trị vị trí mà bạn đang tìm kiếm.

Dưới đây là những api bạn nên xem xét

public boolean getTransformation (long currentTime, Transformation outTransformation)

public Matrix getMatrix ()

public void getValues (float[] values)

Vì vậy, ví dụ (một số mã giả. Tôi chưa kiểm tra điều này):

Transformation outTransformation = new Transformation();
myAnimation.getTransformation(currentTime, outTransformation);
Matrix transformationMatrix = outTransformation.getMatrix();
float[] matrixValues = new float[9];
transformationMatrix.getValues(matrixValues);
float transX = matrixValues[Matrix.MTRANS_X];
float transY = matrixValues[Matrix.MTRANS_Y];

Chúng ta lấy currentTime ở đâu?
mako

Ồ, tài liệu nói rằng nó tương ứng với "đồng hồ treo tường", ở nơi khác họ định nghĩa đồng hồ treo tường là System.cienTimeMillis (), tương ứng với thời gian lịch và sẽ nhảy bất cứ khi nào người dùng hoặc mạng thay đổi thời gian. Một biện pháp kỳ lạ được sử dụng.
mako

0

Sử dụng phương thức setAnimation (null) để dừng hoạt ảnh, nó được hiển thị dưới dạng phương thức công khai trong View.java , đây là lớp cơ sở cho tất cả các tiện ích , được sử dụng để tạo các thành phần UI tương tác (nút, trường văn bản, v.v.). /** * Sets the next animation to play for this view. * If you want the animation to play immediately, use * {@link #startAnimation(android.view.animation.Animation)} instead. * This method provides allows fine-grained * control over the start time and invalidation, but you * must make sure that 1) the animation has a start time set, and * 2) the view's parent (which controls animations on its children) * will be invalidated when the animation is supposed to * start. * * @param animation The next animation, or null. */ public void setAnimation(Animation animation)


0

Để dừng hoạt ảnh, bạn có thể đặt objectAnimator không làm gì, vd

đầu tiên khi lật thủ công có hình ảnh động từ trái sang phải:

flipper.setInAnimation(leftIn);
flipper.setOutAnimation(rightOut);

sau đó khi chuyển sang tự động lật không có hình ảnh động

flipper.setInAnimation(doNothing);
flipper.setOutAnimation(doNothing);

doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);
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.