Câu trả lời:
Gọi clearAnimation()
bất cứ nơi nào View
bạn gọi startAnimation()
.
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.
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.
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);
v.setAnimation(null);
bởi vì điều này sẽ được thực hiện trong v.clearAnimation();
.
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 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];
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)
Để 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);