mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-11 11:29:03 +08:00
Native Animated - Support multiple events attached to the same prop
Summary: Fixes a bug that happens when trying to use ScrollView with sticky headers and native `Animated.event` with `onScroll`. Made a few changes to the ListViewPaging UIExplorer example to repro https://gist.github.com/janicduplessis/17e2fcd99c6ea49ced2954d881011b09. What happens is we need to be able to add multiple events to the same prop + viewTag pair. To do that I simple changed the data structure to `Map<prop+viewTag, List<AnimatedEventDriver>>` and try to optimize for the case where there is only one item in the list since it will be the case 99% of the time. **Test plan** Tested by reproducing the bug with the above gist and made sure it was fixed after applying this diff. Closes https://github.com/facebook/react-native/pull/12697 Differential Revision: D4656347 Pulled By: sahrens fbshipit-source-id: b5c36ba796f478e56028c7a95bc0f86bc54cb2ce
This commit is contained in:
committed by
Facebook Github Bot
parent
59257d6976
commit
c708234f66
@@ -31,7 +31,9 @@ import java.util.ArrayDeque;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Map;
|
||||
import java.util.Queue;
|
||||
|
||||
@@ -55,12 +57,14 @@ import javax.annotation.Nullable;
|
||||
private final SparseArray<AnimatedNode> mAnimatedNodes = new SparseArray<>();
|
||||
private final SparseArray<AnimationDriver> mActiveAnimations = new SparseArray<>();
|
||||
private final SparseArray<AnimatedNode> mUpdatedNodes = new SparseArray<>();
|
||||
private final Map<String, EventAnimationDriver> mEventDrivers = new HashMap<>();
|
||||
// Mapping of a view tag and an event name to a list of event animation drivers. 99% of the time
|
||||
// there will be only one driver per mapping so all code code should be optimized around that.
|
||||
private final Map<String, List<EventAnimationDriver>> mEventDrivers = new HashMap<>();
|
||||
private final Map<String, Map<String, String>> mCustomEventTypes;
|
||||
private final UIImplementation mUIImplementation;
|
||||
private int mAnimatedGraphBFSColor = 0;
|
||||
// Used to avoid allocating a new array on every frame in runUpdates.
|
||||
private final List<AnimatedNode> mRunUpdateNodeList = new ArrayList<>();
|
||||
// Used to avoid allocating a new array on every frame in `runUpdates` and `onEventDispatch`.
|
||||
private final List<AnimatedNode> mRunUpdateNodeList = new LinkedList<>();
|
||||
|
||||
public NativeAnimatedNodesManager(UIManagerModule uiManager) {
|
||||
mUIImplementation = uiManager.getUIImplementation();
|
||||
@@ -312,11 +316,32 @@ import javax.annotation.Nullable;
|
||||
}
|
||||
|
||||
EventAnimationDriver event = new EventAnimationDriver(pathList, (ValueAnimatedNode) node);
|
||||
mEventDrivers.put(viewTag + eventName, event);
|
||||
String key = viewTag + eventName;
|
||||
if (mEventDrivers.containsKey(key)) {
|
||||
mEventDrivers.get(key).add(event);
|
||||
} else {
|
||||
List<EventAnimationDriver> drivers = new ArrayList<>(1);
|
||||
drivers.add(event);
|
||||
mEventDrivers.put(key, drivers);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeAnimatedEventFromView(int viewTag, String eventName) {
|
||||
mEventDrivers.remove(viewTag + eventName);
|
||||
public void removeAnimatedEventFromView(int viewTag, String eventName, int animatedValueTag) {
|
||||
String key = viewTag + eventName;
|
||||
if (mEventDrivers.containsKey(key)) {
|
||||
List<EventAnimationDriver> driversForKey = mEventDrivers.get(key);
|
||||
if (driversForKey.size() == 1) {
|
||||
mEventDrivers.remove(viewTag + eventName);
|
||||
} else {
|
||||
ListIterator<EventAnimationDriver> it = driversForKey.listIterator();
|
||||
while (it.hasNext()) {
|
||||
if (it.next().mValueNode.mTag == animatedValueTag) {
|
||||
it.remove();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -334,11 +359,14 @@ import javax.annotation.Nullable;
|
||||
eventName = customEventType.get("registrationName");
|
||||
}
|
||||
|
||||
EventAnimationDriver eventDriver = mEventDrivers.get(event.getViewTag() + eventName);
|
||||
if (eventDriver != null) {
|
||||
event.dispatch(eventDriver);
|
||||
|
||||
updateNodes(Collections.singletonList((AnimatedNode) eventDriver.mValueNode));
|
||||
List<EventAnimationDriver> driversForKey = mEventDrivers.get(event.getViewTag() + eventName);
|
||||
if (driversForKey != null) {
|
||||
for (EventAnimationDriver driver : driversForKey) {
|
||||
event.dispatch(driver);
|
||||
mRunUpdateNodeList.add(driver.mValueNode);
|
||||
}
|
||||
updateNodes(mRunUpdateNodeList);
|
||||
mRunUpdateNodeList.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user