Отзывчивое приложение React Native — это мобильное приложение, созданное с использованием фреймворка React Native, которое предназначено для правильной работы и отображения на экранах разных размеров и разрешений.
Когда приложение создается с учетом быстродействия, это означает, что оно может адаптироваться к различным типам устройств, таким как смартфоны, планшеты и настольные компьютеры, и при этом поддерживать тот же пользовательский интерфейс (UI) и взаимодействие с пользователем (UX).
Давайте начнем кодировать…
import { Dimensions, Platform, PixelRatio } from 'react-native';
Эта строка кода импортирует три модуля из библиотеки React Native: Dimensions
, Platform
и PixelRatio
.
Dimensions
предоставляет интерфейс для получения размеров экрана устройства, включая ширину и высоту экрана устройства.Platform
позволяет определить операционную систему устройства, на котором запущено приложение, будь то Android, iOS или какая-либо другая платформа.PixelRatio
— это служебный модуль, который обеспечивает способ преобразования значений пикселей между аппаратно-независимыми единицами пикселей (dp) и физическими единицами пикселей (px) экрана. Это может быть полезно для обработки различных плотностей и разрешений экрана.
Вместе эти модули обеспечивают функциональность для обработки различных размеров экрана и соотношений сторон в приложении React Native.
const { width: SCREEN_WIDTH, height: SCREEN_HEIGHT, } = Dimensions.get('window');
Этот код использует синтаксис присваивания деструктурирования для извлечения двух свойств, width
и height
, из объекта, возвращаемого вызовом метода Dimensions.get('window')
.
Метод Dimensions.get('window')
возвращает объект, содержащий ширину и высоту экрана устройства. Используя назначение деструктурирования с синтаксисом переименования свойств, код присваивает значение width
переменной SCREEN_WIDTH
и значение height
переменной SCREEN_HEIGHT
.
Этот метод позволяет использовать переменные SCREEN_WIDTH
и SCREEN_HEIGHT
вместо выражений Dimensions.get('window').width
и Dimensions.get('window').height
, что делает код более кратким и удобочитаемым. Затем эти переменные можно использовать в других частях кода для настройки макета и стилей в зависимости от размера экрана устройства и соотношения сторон.
const scale = SCREEN_WIDTH / 375;
Этот код вычисляет коэффициент масштабирования на основе ширины экрана устройства. Предполагается, что переменная SCREEN_WIDTH
содержит ширину экрана устройства, полученную ранее в коде с помощью метода Dimensions.get('window')
.
Значение scale
рассчитывается путем деления SCREEN_WIDTH
на значение опорной ширины 375
. Эталонное значение ширины 375
используется для определения базовой линии для расчета коэффициента масштабирования. Это значение выбрано потому, что оно соответствует ширине устройства iPhone 6/7/8 в портретной ориентации.
Разделив ширину экрана устройства на эталонное значение ширины 375
, полученный коэффициент масштабирования можно использовать для настройки макета и стиля элементов в приложении в зависимости от размера экрана устройства и соотношения сторон. Например, если для ширины компонента задано значение 100
, умножив его на масштабный коэффициент scale
, его ширина будет пропорциональна размеру экрана устройства.
const scaleVertical = SCREEN_HEIGHT / 812;
Этот код вычисляет коэффициент масштабирования на основе высоты экрана устройства. Предполагается, что переменная SCREEN_HEIGHT
содержит высоту экрана устройства, полученную ранее в коде с помощью метода Dimensions.get('window')
.
Значение scaleVertical
рассчитывается путем деления SCREEN_HEIGHT
на опорное значение высоты 812
. Базовое значение высоты 812
используется для определения базовой линии для расчета коэффициента масштабирования. Это значение выбрано потому, что оно соответствует высоте устройства iPhone X/XS/11 Pro в портретной ориентации.
Разделив высоту экрана устройства на эталонное значение высоты 812
, полученный коэффициент масштабирования можно использовать для настройки макета и стиля элементов в приложении в зависимости от размера экрана устройства и соотношения сторон. Например, если для высоты компонента задано значение 100
, умножив ее на масштабный коэффициент scaleVertical
, высота будет пропорциональна размеру экрана устройства.
export function actuatedNormalize(size) { const newSize = size * scale if (Platform.OS === 'ios') { return Math.round(PixelRatio.roundToNearestPixel(newSize)) } else { return Math.round(PixelRatio.roundToNearestPixel(newSize)) - 1 } }
Этот код определяет функцию с именем actuatedNormalize
, которая принимает один аргумент size
. Цель этой функции — настроить размер шрифта текстовых элементов в приложении в зависимости от размера экрана устройства и соотношения сторон.
Сначала функция вычисляет новое значение размера, умножая аргумент size
на коэффициент масштабирования scale
, который ранее был рассчитан на основе ширины экрана устройства.
Затем функция проверяет свойство Platform.OS
, чтобы определить, работает ли приложение на устройстве iOS или Android. Если приложение запущено на устройстве iOS, значение newSize
округляется до ближайшего пикселя с помощью методов Math.round()
и PixelRatio.roundToNearestPixel()
, что помогает обеспечить правильный размер шрифта. Четко отображается на экранах с высокой плотностью изображения.
Если приложение работает на устройстве Android, значение newSize
также округляется до ближайшего пикселя, но затем вычитается дополнительный 1 пиксель. Это сделано потому, что рендеринг шрифта на устройствах Android может немного отличаться от рендеринга на устройствах iOS, и эта настройка помогает улучшить согласованность размера шрифта на разных устройствах.
Наконец, функция возвращает скорректированное значение размера шрифта. Это значение можно использовать в приложении для динамической настройки размера шрифта текстовых элементов в зависимости от размера экрана устройства и соотношения сторон.
export function actuatedNormalizeVertical(size) { const newSize = size * scaleVertical if (Platform.OS === 'ios') { return Math.round(PixelRatio.roundToNearestPixel(newSize)) } else { return Math.round(PixelRatio.roundToNearestPixel(newSize)) - 1 } }
Этот код определяет другую функцию actuatedNormalizeVertical
, которая похожа на функцию actuatedNormalize
, но регулирует размер шрифта на основе коэффициента вертикального масштабирования scaleVertical
, рассчитанного на основе высоты экрана устройства.
Как и функция actuatedNormalize
, эта функция принимает один аргумент size
и вычисляет новое значение размера, умножая его на коэффициент масштабирования scaleVertical
. Затем функция проверяет свойство Platform.OS
, чтобы определить, работает ли приложение на устройстве iOS или Android.
Если приложение работает на устройстве iOS, значение newSize
округляется до ближайшего пикселя с помощью методов Math.round()
и PixelRatio.roundToNearestPixel()
, как и в функции actuatedNormalize
.
Если приложение запущено на устройстве Android, значение newSize
также округляется до ближайшего пикселя, но затем вычитается дополнительный 1 пиксель, как и в функции actuatedNormalize
.
Наконец, функция возвращает скорректированное значение размера шрифта, которое можно использовать в приложении для динамической настройки размера шрифта текстовых элементов в зависимости от размера экрана устройства и соотношения сторон, но в данном случае на основе коэффициента масштабирования по вертикали.
export function isTab() { if (SCREEN_WIDTH > 550) { return true } else { return false } }
Этот код определяет функцию isTab()
, которая возвращает логическое значение в зависимости от ширины экрана устройства. Если ширина экрана больше 550 пикселей, функция возвращает true
, иначе возвращает false
.
Эту функцию можно использовать в приложении, чтобы определить, достаточно ли широкий экран устройства для отображения макета в стиле планшета или большего объема контента на экране. Используя эту функцию, приложение может настроить свой макет и отображение в зависимости от размера экрана устройства и оптимизировать взаимодействие с пользователем.
export function isScreenHeight770() { if (SCREEN_HEIGHT > 740 && SCREEN_HEIGHT < 760 ) { return true } else { return false } }
Этот код определяет функцию isScreenHeight770()
, которая возвращает логическое значение в зависимости от высоты экрана устройства. Если высота экрана больше 740 пикселей и меньше 760 пикселей, функция возвращает true
, указывая, что высота экрана близка к 770 пикселям. В противном случае возвращается false
.
Цель этой функции — определить, попадает ли высота экрана устройства в определенный диапазон, который эквивалентен высоте устройства iPhone 7 или iPhone 8.
Значения 740 и 760 — эталонные значения высоты экрана для iPhone 7 и iPhone 8 соответственно. Итак, эта функция проверяет, эквивалентна ли высота экрана устройства высоте iPhone 7 или iPhone 8.
👉 Итак, я создаю файл с именем PixelScaling.js в папке Constant и объединяю все коды в этом файле.
👉 И Наш Кодекс будет выглядеть так…
import { Dimensions, Platform, PixelRatio } from 'react-native'; const { width: SCREEN_WIDTH, height: SCREEN_HEIGHT, } = Dimensions.get('window'); const scale = SCREEN_WIDTH / 375; const scaleVertical = SCREEN_HEIGHT / 812; export function actuatedNormalize(size) { const newSize = size * scale if (Platform.OS === 'ios') { return Math.round(PixelRatio.roundToNearestPixel(newSize)) } else { return Math.round(PixelRatio.roundToNearestPixel(newSize)) - 1 } } export function actuatedNormalizeVertical(size) { const newSize = size * scaleVertical if (Platform.OS === 'ios') { return Math.round(PixelRatio.roundToNearestPixel(newSize)) } else { return Math.round(PixelRatio.roundToNearestPixel(newSize)) - 1 } } export function isTab() { if (SCREEN_WIDTH > 550) { return true } else { return false } } export function isScreenHeight770() { if (SCREEN_HEIGHT > 740 && SCREEN_HEIGHT < 760 ) { return true } else { return false } }
👉 Как этим пользоваться..???
Предполагая, что читатели этого сообщения в блоге уже знакомы с кодом React Native и имеют базовое представление о таблицах стилей или стилях.
Во-первых, мы должны импортировать этот файл в наш файл app.js
. Затем мы устанавливаем стиль в нашем тексте, представлении, изображении или любом теге.
После этого мы используем actuatedNormalize
для левого, правого, размера шрифта, ширины и т. д. actuatedNormalizeVertical
для верхнего, нижнего, высоты и т. д. Используя ternary operator
, мы используем istab()
с actuatedNormalize
и actuatedNormalizeVertical
import { actuatedNormalize, actuatedNormalizeVertical, isTab } from "./constants/PixelScaling"; ... ... ... const App = () => { return ( <> ... ... // Your Code ... ... </> ); }; export default App; const styles = StyleSheet.create({ // Without PixelScaling normal: { marginTop: 17, marginBottom: 17, paddingTop: 17, paddingBottom: 17, marginLeft: 17, marginRight: 17, paddingLeft: 17, paddingRight: 17, fontSize: 17, width: 17, height: 17, }, // using PixelScaling ForTopBottom: { marginTop: actuatedNormalizeVertical(17), marginBottom: actuatedNormalizeVertical(17), paddingTop: actuatedNormalizeVertical(17), paddingBottom: actuatedNormalizeVertical(17), }, ForLeftRight: { marginLeft: actuatedNormalize(17), marginRight: actuatedNormalize(17), paddingLeft: actuatedNormalize(17), paddingRight: actuatedNormalize(17), }, ForFonts: { fontSize: actuatedNormalize(17), }, ForImage: { width: actuatedNormalize(17), height: actuatedNormalizeVertical(17), }, ForTab: { marginTop: isTab() ? actuatedNormalizeVertical(29) : actuatedNormalizeVertical(17), marginBottom: isTab() ? actuatedNormalizeVertical(29) : actuatedNormalizeVertical(17), marginLeft: isTab() ? actuatedNormalize(29) : actuatedNormalize(17), marginRight: isTab() ? actuatedNormalize(29) : actuatedNormalize(17), paddingTop: isTab() ? actuatedNormalizeVertical(29) : actuatedNormalizeVertical(17), paddingBottom: isTab() ? actuatedNormalizeVertical(29) : actuatedNormalizeVertical(17), paddingLeft: isTab() ? actuatedNormalize(29) : actuatedNormalize(17), paddingRight: isTab() ? actuatedNormalize(29) : actuatedNormalize(17), fontSize: isTab() ? actuatedNormalize(29) : actuatedNormalize(17), width: isTab() ? actuatedNormalize(29) : actuatedNormalize(17), height: isTab() ? actuatedNormalize(29) : actuatedNormalize(17), } });
Спасибо за чтение ... Если вам это нравится и легко понять. Подпишитесь и лайкните этот пост…