UNPKG

react-native-responsive-screens

Version:
129 lines (111 loc) 5.26 kB
// packages import { Dimensions, PixelRatio, Platform } from "react-native"; // Retrieve initial screen's width let screenWidth = Dimensions.get("window").width; // Retrieve initial screen's height let screenHeight = Dimensions.get("window").height; let customScreenWidth = screenWidth; let customScreenHeight = screenHeight; if (Platform.isPad) { customScreenWidth = (customScreenWidth / 3) * 2; customScreenHeight = (customScreenHeight / 3) * 2; } /** * Converts provided width percentage to independent pixel (dp). * @param {string} widthPercent The percentage of screen's width that UI element should cover * along with the percentage symbol (%). * @return {number} The calculated dp depending on current device's screen width. */ const widthToDP = (widthPercent) => { // Parse string percentage input and convert it to number. const elemWidth = typeof widthPercent === "number" ? widthPercent : parseFloat(widthPercent); // Use PixelRatio.roundToNearestPixel method in order to round the layout // size (dp) to the nearest one that correspons to an integer number of pixels. return PixelRatio.roundToNearestPixel((screenWidth * elemWidth) / 100); }; /** * Converts provided height percentage to independent pixel (dp). * @param {string} heightPercent The percentage of screen's height that UI element should cover * along with the percentage symbol (%). * @return {number} The calculated dp depending on current device's screen height. */ const heightToDP = (heightPercent) => { // Parse string percentage input and convert it to number. const elemHeight = typeof heightPercent === "number" ? heightPercent : parseFloat(heightPercent); // Use PixelRatio.roundToNearestPixel method in order to round the layout // size (dp) to the nearest one that correspons to an integer number of pixels. return PixelRatio.roundToNearestPixel((screenHeight * elemHeight) / 100); }; /** * Converts provided width percentage to independent pixel (dp). * @param {string} widthPercent The percentage of screen's width that UI element should cover * along with the percentage symbol (%). * @return {number} The calculated dp depending on current device's screen width. */ const widthToFonts = (widthPercent) => { // Parse string percentage input and convert it to number. const elemWidth = typeof widthPercent === "number" ? widthPercent : parseFloat(widthPercent); // Use PixelRatio.roundToNearestPixel method in order to round the layout // size (dp) to the nearest one that correspons to an integer number of pixels. return PixelRatio.roundToNearestPixel((customScreenWidth * elemWidth) / 100); }; /** * Converts provided height percentage to independent pixel (dp). * @param {string} heightPercent The percentage of screen's height that UI element should cover * along with the percentage symbol (%). * @return {number} The calculated dp depending on current device's screen height. */ const heightToFonts = (heightPercent) => { // Parse string percentage input and convert it to number. const elemHeight = typeof heightPercent === "number" ? heightPercent : parseFloat(heightPercent); // Use PixelRatio.roundToNearestPixel method in order to round the layout // size (dp) to the nearest one that correspons to an integer number of pixels. return PixelRatio.roundToNearestPixel( (customScreenHeight * elemHeight) / 100 ); }; /** * Event listener function that detects orientation change (every time it occurs) and triggers * screen rerendering. It does that, by changing the state of the screen where the function is * called. State changing occurs for a new state variable with the name 'orientation' that will * always hold the current value of the orientation after the 1st orientation change. * Invoke it inside the screen's constructor or in componentDidMount lifecycle method. * @param {object} that Screen's class component this variable. The function needs it to * invoke setState method and trigger screen rerender (this.setState()). */ const useOrientationChange = (that) => { Dimensions.addEventListener("change", (newDimensions) => { // Retrieve and save new dimensions screenWidth = newDimensions.window.width; screenHeight = newDimensions.window.height; // Trigger screen's rerender with a state update of the orientation variable that.setState({ orientation: screenWidth < screenHeight ? "portrait" : "landscape", }); }); }; /** * Wrapper function that removes orientation change listener and should be invoked in * componentWillUnmount lifecycle method of every class component (UI screen) that * listenOrientationChange function has been invoked. This should be done in order to * avoid adding new listeners every time the same component is re-mounted. */ const removeOrientationListener = () => { Dimensions.removeEventListener("change", () => {}); }; export { widthToDP, heightToDP, widthToFonts, heightToFonts, useOrientationChange, removeOrientationListener, };