mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-14 23:18:06 +08:00
Support for stopping animations that run on UI thread.
Summary:This change extends animated native module API with `stopAnimation` method that is responsible for interrupting actively running animation as a reslut of a JS call. In order for the `stopAnimation` to understand `animationId` argument I also had to add `animationId` to `startAnimation` method. As JS thread runs in parallel to the thread which executes the animation there is a chance that JS may call `stopAnimation` after the animation has finished. Because of that we are not doing any checks on the `animationId` parameter passed to `stopAnimation` in native and if the animation does not exists in the registry we ignore that call. **Test Plan** Run JS tests: `npm test Libraries/Animated/src/__tests__/AnimatedNative-test.js` Run java tests: `buck test ReactAndroid/src/test/java/com/facebook/react/animated` Closes https://github.com/facebook/react-native/pull/7058 Differential Revision: D3211906 fb-gh-sync-id: 3761509651de36a550b00d33e2a631c379d3900f fbshipit-source-id: 3761509651de36a550b00d33e2a631c379d3900f
This commit is contained in:
committed by
Facebook Github Bot 8
parent
63adb48dc4
commit
cd11738819
@@ -98,6 +98,7 @@ import javax.annotation.Nullable;
|
||||
}
|
||||
|
||||
public void startAnimatingNode(
|
||||
int animationId,
|
||||
int animatedNodeTag,
|
||||
ReadableMap animationConfig,
|
||||
Callback endCallback) {
|
||||
@@ -117,11 +118,34 @@ import javax.annotation.Nullable;
|
||||
} else {
|
||||
throw new JSApplicationIllegalArgumentException("Unsupported animation type: " + type);
|
||||
}
|
||||
animation.mId = animationId;
|
||||
animation.mEndCallback = endCallback;
|
||||
animation.mAnimatedValue = (ValueAnimatedNode) node;
|
||||
mActiveAnimations.add(animation);
|
||||
}
|
||||
|
||||
public void stopAnimation(int animationId) {
|
||||
// in most of the cases there should never be more than a few active animations running at the
|
||||
// same time. Therefore it does not make much sense to create an animationId -> animation
|
||||
// object map that would require additional memory just to support the use-case of stopping
|
||||
// an animation
|
||||
for (int i = 0; i < mActiveAnimations.size(); i++) {
|
||||
AnimationDriver animation = mActiveAnimations.get(i);
|
||||
if (animation.mId == animationId) {
|
||||
// Invoke animation end callback with {finished: false}
|
||||
WritableMap endCallbackResponse = Arguments.createMap();
|
||||
endCallbackResponse.putBoolean("finished", false);
|
||||
animation.mEndCallback.invoke(endCallbackResponse);
|
||||
mActiveAnimations.remove(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Do not throw an error in the case animation could not be found. We only keep "active"
|
||||
// animations in the registry and there is a chance that Animated.js will enqueue a
|
||||
// stopAnimation call after the animation has ended or the call will reach native thread only
|
||||
// when the animation is already over.
|
||||
}
|
||||
|
||||
public void connectAnimatedNodes(int parentNodeTag, int childNodeTag) {
|
||||
AnimatedNode parentNode = mAnimatedNodes.get(parentNodeTag);
|
||||
if (parentNode == null) {
|
||||
|
||||
Reference in New Issue
Block a user