id | title |
---|---|
transforms |
Transforms |
Transforms are style properties that will help you modify the appearance and position of your components using 2D or 3D transformations. However, once you apply transforms, the layouts remain the same around the transformed component hence it might overlap with the nearby components. You can apply margin to the transformed component, the nearby components or padding to the container to prevent such overlaps.
import React from 'react';
import {SafeAreaView, ScrollView, StyleSheet, Text, View} from 'react-native';
const App = () => (
<SafeAreaView style={styles.container}>
<ScrollView contentContainerStyle={styles.scrollContentContainer}>
<View style={styles.box}>
<Text style={styles.text}>Original Object</Text>
</View>
<View
style={[
styles.box,
{
transform: [{scale: 2}],
},
]}>
<Text style={styles.text}>Scale by 2</Text>
</View>
<View
style={[
styles.box,
{
transform: [{scaleX: 2}],
},
]}>
<Text style={styles.text}>ScaleX by 2</Text>
</View>
<View
style={[
styles.box,
{
transform: [{scaleY: 2}],
},
]}>
<Text style={styles.text}>ScaleY by 2</Text>
</View>
<View
style={[
styles.box,
{
transform: [{rotate: '45deg'}],
},
]}>
<Text style={styles.text}>Rotate by 45 deg</Text>
</View>
<View
style={[
styles.box,
{
transform: [{rotateX: '45deg'}, {rotateZ: '45deg'}],
},
]}>
<Text style={styles.text}>Rotate X&Z by 45 deg</Text>
</View>
<View
style={[
styles.box,
{
transform: [{rotateY: '45deg'}, {rotateZ: '45deg'}],
},
]}>
<Text style={styles.text}>Rotate Y&Z by 45 deg</Text>
</View>
<View
style={[
styles.box,
{
transform: [{skewX: '45deg'}],
},
]}>
<Text style={styles.text}>SkewX by 45 deg</Text>
</View>
<View
style={[
styles.box,
{
transform: [{skewY: '45deg'}],
},
]}>
<Text style={styles.text}>SkewY by 45 deg</Text>
</View>
<View
style={[
styles.box,
{
transform: [{skewX: '30deg'}, {skewY: '30deg'}],
},
]}>
<Text style={styles.text}>Skew X&Y by 30 deg</Text>
</View>
<View
style={[
styles.box,
{
transform: [{translateX: -50}],
},
]}>
<Text style={styles.text}>TranslateX by -50 </Text>
</View>
<View
style={[
styles.box,
{
transform: [{translateY: 50}],
},
]}>
<Text style={styles.text}>TranslateY by 50 </Text>
</View>
</ScrollView>
</SafeAreaView>
);
const styles = StyleSheet.create({
container: {
flex: 1,
},
scrollContentContainer: {
alignItems: 'center',
paddingBottom: 60,
},
box: {
height: 100,
width: 100,
borderRadius: 5,
marginVertical: 40,
backgroundColor: '#61dafb',
alignItems: 'center',
justifyContent: 'center',
},
text: {
fontSize: 14,
fontWeight: 'bold',
margin: 8,
color: '#000',
textAlign: 'center',
},
});
export default App;
transform
accepts an array of transformation objects or space-separated string values. Each object specifies the property that will be transformed as the key, and the value to use in the transformation. Objects should not be combined. Use a single key/value pair per object.
The rotate transformations require a string so that the transform may be expressed in degrees (deg) or radians (rad). For example:
{
transform: [{rotateX: '45deg'}, {rotateZ: '0.785398rad'}],
}
The same could also be achieved using a space-separated string:
{
transform: 'rotateX(45deg) rotateZ(0.785398rad)',
}
The skew transformations require a string so that the transform may be expressed in degrees (deg). For example:
{
transform: [{skewX: '45deg'}],
}
Type | Required |
---|---|
array of objects: {matrix: number[]} , {perspective: number} , {rotate: string} , {rotateX: string} , {rotateY: string} , {rotateZ: string} , {scale: number} , {scaleX: number} , {scaleY: number} , {translateX: number} , {translateY: number} , {skewX: string} , {skewY: string} or string |
No |
Deprecated. Use the
transform
prop instead.
The transformOrigin
property sets the origin for a view's transformations. The transform origin is the point around which a transformation is applied. By default, the origin of a transform is center
.
import React, {useRef, useEffect} from 'react';
import {Animated, View, StyleSheet, SafeAreaView, Easing} from 'react-native';
const App = () => {
const rotateAnim = useRef(new Animated.Value(0)).current;
useEffect(() => {
Animated.loop(
Animated.timing(rotateAnim, {
toValue: 1,
duration: 5000,
easing: Easing.linear,
useNativeDriver: true,
}),
).start();
}, [rotateAnim]);
const spin = rotateAnim.interpolate({
inputRange: [0, 1],
outputRange: ['0deg', '360deg'],
});
return (
<SafeAreaView style={styles.container}>
<View style={styles.transformOriginWrapper}>
<Animated.View
style={[
styles.transformOriginView,
{
transform: [{rotate: spin}],
},
]}
/>
</View>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
transformOriginWrapper: {
borderWidth: 1,
borderColor: 'rgba(0, 0, 0, 0.5)',
},
transformOriginView: {
backgroundColor: 'pink',
width: 100,
height: 100,
transformOrigin: 'top',
},
});
export default App;
Transform origin supports px
, percentage
and keywords top
, left
, right
, bottom
, center
values.
The transformOrigin
property may be specified using one, two, or three values, where each value represents an offset.
- The value must be a
px
, apercentage
, or one of the keywordsleft
,center
,right
,top
, andbottom
.
{
transformOrigin: '20px',
transformOrigin: 'bottom',
}
- First value (x-offset) must be a
px
, apercentage
, or one of the keywordsleft
,center
, andright
. - The second value (y-offset) must be a
px
, apercentage
, or one of the keywordstop
,center
, andbottom
.
{
transformOrigin: '10px 2px',
transformOrigin: 'left top',
transformOrigin: 'top right',
}
- The first two values are the same as for the two-value syntax.
- The third value (z-offset) must be a
px
. It always represents the Z offset.
{
transformOrigin: '2px 30% 10px',
transformOrigin: 'right bottom 20px',
}
transformOrigin
also supports an array syntax. It makes it convenient to use it with Animated APIs. It also avoids string parsing, so should be more efficient.
{
// Using numeric values
transformOrigin: [10, 30, 40],
// Mixing numeric and percentage values
transformOrigin: [10, '20%', 0],
}
You may refer to MDN's guide on Transform origin for additional information.