DO NOT MERGE Let BackProgressAnimator could play cancel animation
Add cancel and the cancel callback in BackProgressAnimator so it could animate to start position and invoke the callback after finished. Bug: 259608500 Test: atest BackAnimationControllerTest BackNavigationControllerTests Test: atest BackProgressAnimatorTest Change-Id: I94303ba530d155f4b264dafa21bd23185a6b44bd
This commit is contained in:
committed by
Fengjiang Li
parent
103ab3935b
commit
056a4fcdc7
@@ -99,7 +99,21 @@ public class BackEvent implements Parcelable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a value between 0 and 1 on how far along the back gesture is.
|
* Returns a value between 0 and 1 on how far along the back gesture is. This value is
|
||||||
|
* driven by the horizontal location of the touch point, and should be used as the fraction to
|
||||||
|
* seek the predictive back animation with. Specifically,
|
||||||
|
* <ol>
|
||||||
|
* <li>The progress is 0 when the touch is at the starting edge of the screen (left or right),
|
||||||
|
* and animation should seek to its start state.
|
||||||
|
* <li>The progress is approximately 1 when the touch is at the opposite side of the screen,
|
||||||
|
* and animation should seek to its end state. Exact end value may vary depending on
|
||||||
|
* screen size.
|
||||||
|
* </ol>
|
||||||
|
* <li> After the gesture finishes in cancel state, this method keeps getting invoked until the
|
||||||
|
* progress value animates back to 0.
|
||||||
|
* </ol>
|
||||||
|
* In-between locations are linearly interpolated based on horizontal distance from the starting
|
||||||
|
* edge and smooth clamped to 1 when the distance exceeds a system-wide threshold.
|
||||||
*/
|
*/
|
||||||
public float getProgress() {
|
public float getProgress() {
|
||||||
return mProgress;
|
return mProgress;
|
||||||
|
|||||||
@@ -16,8 +16,10 @@
|
|||||||
|
|
||||||
package android.window;
|
package android.window;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
import android.util.FloatProperty;
|
import android.util.FloatProperty;
|
||||||
|
|
||||||
|
import com.android.internal.dynamicanimation.animation.DynamicAnimation;
|
||||||
import com.android.internal.dynamicanimation.animation.SpringAnimation;
|
import com.android.internal.dynamicanimation.animation.SpringAnimation;
|
||||||
import com.android.internal.dynamicanimation.animation.SpringForce;
|
import com.android.internal.dynamicanimation.animation.SpringForce;
|
||||||
|
|
||||||
@@ -123,6 +125,27 @@ public class BackProgressAnimator {
|
|||||||
mProgress = 0;
|
mProgress = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Animate the back progress animation from current progress to start position.
|
||||||
|
* This should be called when back is cancelled.
|
||||||
|
*
|
||||||
|
* @param finishCallback the callback to be invoked when the progress is reach to 0.
|
||||||
|
*/
|
||||||
|
public void onBackCancelled(@NonNull Runnable finishCallback) {
|
||||||
|
final DynamicAnimation.OnAnimationEndListener listener =
|
||||||
|
new DynamicAnimation.OnAnimationEndListener() {
|
||||||
|
@Override
|
||||||
|
public void onAnimationEnd(DynamicAnimation animation, boolean canceled, float value,
|
||||||
|
float velocity) {
|
||||||
|
mSpring.removeEndListener(this);
|
||||||
|
finishCallback.run();
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
mSpring.addEndListener(listener);
|
||||||
|
mSpring.animateToFinalPosition(0);
|
||||||
|
}
|
||||||
|
|
||||||
private void updateProgressValue(float progress) {
|
private void updateProgressValue(float progress) {
|
||||||
if (mLastBackEvent == null || mCallback == null || !mStarted) {
|
if (mLastBackEvent == null || mCallback == null || !mStarted) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -255,12 +255,13 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
|
|||||||
@Override
|
@Override
|
||||||
public void onBackCancelled() {
|
public void onBackCancelled() {
|
||||||
Handler.getMain().post(() -> {
|
Handler.getMain().post(() -> {
|
||||||
mProgressAnimator.reset();
|
mProgressAnimator.onBackCancelled(() -> {
|
||||||
final OnBackAnimationCallback callback = getBackAnimationCallback();
|
final OnBackAnimationCallback callback = getBackAnimationCallback();
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
callback.onBackCancelled();
|
callback.onBackCancelled();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user