mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
4a227ce2ab
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/32736 The ability to pass an additional property bag to further configure NativeAnimated is useful for a few reasons, e.g., experimentation with multiple implementations of the NativeAnimated module. The specific use case this solves is on react-native-windows, where there are two underlying animation graph options, one "optimized" animation graph that uses UI.Composition, and another similar to the approach to iOS and Android that uses a frame rendering callback. The platform configuration can be supplied to the animation node when `useNativeDriver` is set to `true`, and we pass the platform configuration object to the connected AnimatedValue and all it's children. Changelog: [General][Added] - Option to supply `platformConfig` to NativeAnimated Reviewed By: yungsters Differential Revision: D32988285 fbshipit-source-id: ab8a7bbf197573fc9e9a4737c255f124321295ac
90 lines
2.3 KiB
JavaScript
90 lines
2.3 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow strict-local
|
|
* @format
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
import type {PlatformConfig} from '../AnimatedPlatformConfig';
|
|
const AnimatedNode = require('./AnimatedNode');
|
|
const NativeAnimatedHelper = require('../NativeAnimatedHelper');
|
|
|
|
class AnimatedWithChildren extends AnimatedNode {
|
|
_children: Array<AnimatedNode>;
|
|
|
|
constructor() {
|
|
super();
|
|
this._children = [];
|
|
}
|
|
|
|
__makeNative(platformConfig: ?PlatformConfig) {
|
|
if (!this.__isNative) {
|
|
this.__isNative = true;
|
|
for (const child of this._children) {
|
|
child.__makeNative(platformConfig);
|
|
NativeAnimatedHelper.API.connectAnimatedNodes(
|
|
this.__getNativeTag(),
|
|
child.__getNativeTag(),
|
|
);
|
|
}
|
|
}
|
|
super.__makeNative(platformConfig);
|
|
}
|
|
|
|
__addChild(child: AnimatedNode): void {
|
|
if (this._children.length === 0) {
|
|
this.__attach();
|
|
}
|
|
this._children.push(child);
|
|
if (this.__isNative) {
|
|
// Only accept "native" animated nodes as children
|
|
child.__makeNative(this.__getPlatformConfig());
|
|
NativeAnimatedHelper.API.connectAnimatedNodes(
|
|
this.__getNativeTag(),
|
|
child.__getNativeTag(),
|
|
);
|
|
}
|
|
}
|
|
|
|
__removeChild(child: AnimatedNode): void {
|
|
const index = this._children.indexOf(child);
|
|
if (index === -1) {
|
|
console.warn("Trying to remove a child that doesn't exist");
|
|
return;
|
|
}
|
|
if (this.__isNative && child.__isNative) {
|
|
NativeAnimatedHelper.API.disconnectAnimatedNodes(
|
|
this.__getNativeTag(),
|
|
child.__getNativeTag(),
|
|
);
|
|
}
|
|
this._children.splice(index, 1);
|
|
if (this._children.length === 0) {
|
|
this.__detach();
|
|
}
|
|
}
|
|
|
|
__getChildren(): Array<AnimatedNode> {
|
|
return this._children;
|
|
}
|
|
|
|
__callListeners(value: number): void {
|
|
super.__callListeners(value);
|
|
if (!this.__isNative) {
|
|
for (const child of this._children) {
|
|
// $FlowFixMe[method-unbinding] added when improving typing for this parameters
|
|
if (child.__getValue) {
|
|
child.__callListeners(child.__getValue());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = AnimatedWithChildren;
|