Antworten:
Rufen Sie clearAnimation()
an, was auch immer View
Sie angerufen haben startAnimation()
.
setFillAfter()
wahrscheinlich sowieso nicht das, was du denkst. Wenn das Berührungsereignis auftritt, löschen Sie die Animation und passen Sie dann Ihr Layout an, um die von Ihnen gewünschten dauerhaften Änderungen zu beeinflussen.
Unter Android 4.4.4 war es anscheinend die einzige Möglichkeit, eine Alpha-Fading-Animation in einer Ansicht zu stoppen, das Aufrufen View.animate().cancel()
(dh das Aufrufen .cancel()
der Ansicht ViewPropertyAnimator
).
Hier ist der Code, den ich aus Kompatibilitätsgründen vor und nach ICS verwende:
public void stopAnimation(View v) {
v.clearAnimation();
if (canCancelAnimation()) {
v.animate().cancel();
}
}
... mit der Methode:
/**
* 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;
}
Hier ist die Animation, die ich stoppe:
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);
das hat mir geholfen.
Wenn Sie den Animations-Listener verwenden, stellen Sie ein v.setAnimationListener(null)
. Verwenden Sie den folgenden Code mit allen Optionen.
v.getAnimation().cancel();
v.clearAnimation();
animation.setAnimationListener(null);
v.setAnimation(null);
da dies in erfolgt v.clearAnimation();
.
Sie können versuchen, die Transformationsmatrix aus der Animation abzurufen, bevor Sie sie stoppen, und den Matrixinhalt überprüfen, um die gewünschten Positionswerte zu erhalten.
Hier sind die APIs, in die du schauen solltest
public boolean getTransformation (long currentTime, Transformation outTransformation)
public void getValues (float[] values)
Also zum Beispiel (ein Pseudocode. Ich habe dies nicht getestet):
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];
Verwenden Sie die Methode setAnimation (null) , um eine Animation zu stoppen. Sie wird in View.java als öffentliche Methode
verfügbar gemacht . Sie ist die Basisklasse für alle Widgets , mit denen interaktive UI-Komponenten (Schaltflächen, Textfelder usw.) erstellt werden.
/**
* 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)
Um die Animation zu stoppen, können Sie einen solchen objectAnimator festlegen, der nichts tut, z
Beim manuellen Umdrehen erfolgt zunächst eine Animation von links nach rechts:
flipper.setInAnimation(leftIn);
flipper.setOutAnimation(rightOut);
Wenn Sie dann auf Auto Flipping umschalten, erfolgt keine Animation
flipper.setInAnimation(doNothing);
flipper.setOutAnimation(doNothing);
doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);