Jawaban:
Panggil clearAnimation()
mana saja yang View
Anda panggil startAnimation()
.
setFillAfter()
mungkin tidak melakukan apa yang Anda pikirkan. Saat acara sentuh terjadi, hapus animasi dan kemudian sesuaikan tata letak Anda untuk memengaruhi perubahan permanen apa pun yang Anda cari.
Pada Android 4.4.4, sepertinya satu-satunya cara saya bisa menghentikan animasi alpha fading pada View sedang memanggil View.animate().cancel()
(yaitu, memanggil .cancel()
View's ViewPropertyAnimator
).
Berikut kode yang saya gunakan untuk kompatibilitas sebelum dan sesudah ICS:
public void stopAnimation(View v) {
v.clearAnimation();
if (canCancelAnimation()) {
v.animate().cancel();
}
}
... dengan metode:
/**
* 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;
}
Inilah animasi yang saya hentikan:
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);
ini membantu saya.
Jika Anda menggunakan pendengar animasi, atur v.setAnimationListener(null)
. Gunakan kode berikut dengan semua opsi.
v.getAnimation().cancel();
v.clearAnimation();
animation.setAnimationListener(null);
v.setAnimation(null);
karena ini akan dilakukan di v.clearAnimation();
.
Apa yang dapat Anda coba lakukan adalah mendapatkan Matriks transformasi dari animasi sebelum Anda menghentikannya dan memeriksa konten Matrix untuk mendapatkan nilai posisi yang Anda cari.
Inilah api yang harus Anda perhatikan
public boolean getTransformation (long currentTime, Transformation outTransformation)
public void getValues (float[] values)
Jadi misalnya (beberapa kode pseudo. Saya belum menguji ini):
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];
Gunakan metode setAnimation (null) untuk menghentikan animasi, yang diekspos sebagai metode publik di
View.java , itu adalah kelas dasar untuk semua widget , yang digunakan untuk membuat komponen UI interaktif (tombol, bidang teks, dll.).
/**
* 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)
Untuk menghentikan animasi, Anda dapat mengatur objekAnimator yang tidak melakukan apa pun, misalnya
pertama ketika membalik manual ada animasi kiri ke kanan:
flipper.setInAnimation(leftIn);
flipper.setOutAnimation(rightOut);
lalu ketika beralih ke flipping otomatis tidak ada animasi
flipper.setInAnimation(doNothing);
flipper.setOutAnimation(doNothing);
doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);