Khóa học react-native

PixelRatio trong React Native

0 phút đọc

PixelRatio là một module trong React Native cung cấp thông tin về mật độ điểm ảnh (pixel density) và tỷ lệ phông chữ (font scale) của thiết bị. Điều này rất hữu ích khi bạn cần tạo ra các giao diện người dùng linh hoạt và đáp ứng, phù hợp với nhiều kích thước màn hình và độ phân giải khác nhau. PixelRatio cung cấp các phương thức để chuyển đổi giữa các đơn vị điểm ảnh độc lập với thiết bị (dp) và điểm ảnh (px), giúp đảm bảo rằng ứng dụng của bạn hiển thị nhất quán trên các thiết bị khác nhau.

Các Phương Thức Quan Trọng của PixelRatio

get

Phương thức get trả về mật độ điểm ảnh của thiết bị dưới dạng một số. Mật độ điểm ảnh là tỷ lệ giữa số điểm ảnh vật lý và số điểm ảnh độc lập với thiết bị (dp).

Cú pháp:

javascript Copy
PixelRatio.get();

Ví dụ:

javascript Copy
import { PixelRatio } from "react-native";

const pixelDensity = PixelRatio.get();
console.log("Pixel density:", pixelDensity);

getFontScale

Phương thức getFontScale trả về tỷ lệ phông chữ của thiết bị. Tỷ lệ này được sử dụng để tính toán kích thước phông chữ tuyệt đối, vì vậy bất kỳ thành phần nào phụ thuộc nhiều vào kích thước phông chữ nên sử dụng phương thức này để thực hiện các tính toán.

Cú pháp:

javascript Copy
PixelRatio.getFontScale();

Ví dụ:

javascript Copy
import { PixelRatio } from "react-native";

const fontScale = PixelRatio.getFontScale();
console.log("Font scale:", fontScale);

getPixelSizeForLayoutSize

Phương thức getPixelSizeForLayoutSize chuyển đổi một kích thước bố cục (dp) thành kích thước điểm ảnh (px). Phương thức này đảm bảo trả về một số nguyên.

Cú pháp:

javascript Copy
PixelRatio.getPixelSizeForLayoutSize(layoutSize);

Ví dụ:

javascript Copy
import { PixelRatio } from "react-native";

const layoutSize = 100;
const pixelSize = PixelRatio.getPixelSizeForLayoutSize(layoutSize);
console.log("Pixel size for layout size:", pixelSize);

roundToNearestPixel

Phương thức roundToNearestPixel làm tròn một kích thước bố cục (dp) đến kích thước bố cục gần nhất tương ứng với một số nguyên của điểm ảnh.

Cú pháp:

javascript Copy
PixelRatio.roundToNearestPixel(layoutSize);

Ví dụ:

javascript Copy
import { PixelRatio } from "react-native";

const layoutSize = 8.4;
const roundedSize = PixelRatio.roundToNearestPixel(layoutSize);
console.log("Rounded size:", roundedSize);

Ví Dụ Chi Tiết về PixelRatio

Ví Dụ 1: Hiển Thị Mật Độ Điểm Ảnh và Tỷ Lệ Phông Chữ

javascript Copy
import React from "react";
import { View, Text, PixelRatio, StyleSheet } from "react-native";

const PixelRatioExample = () => {
  const pixelDensity = PixelRatio.get();
  const fontScale = PixelRatio.getFontScale();

  return (
    <View style={styles.container}>
      <Text style={styles.text}>Pixel Density: {pixelDensity}</Text>
      <Text style={styles.text}>Font Scale: {fontScale}</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: "center",
    alignItems: "center",
  },
  text: {
    fontSize: 18,
    marginBottom: 10,
  },
});

export default PixelRatioExample;

Ví Dụ 2: Chuyển Đổi Kích Thước Bố Cục Thành Kích Thước Điểm Ảnh

javascript Copy
import React from "react";
import { View, Text, PixelRatio, StyleSheet } from "react-native";

const LayoutToPixelExample = () => {
  const layoutSize = 100;
  const pixelSize = PixelRatio.getPixelSizeForLayoutSize(layoutSize);

  return (
    <View style={styles.container}>
      <Text style={styles.text}>Layout Size: {layoutSize} dp</Text>
      <Text style={styles.text}>Pixel Size: {pixelSize} px</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: "center",
    alignItems: "center",
  },
  text: {
    fontSize: 18,
    marginBottom: 10,
  },
});

export default LayoutToPixelExample;

Ví Dụ 3: Làm Tròn Kích Thước Bố Cục Đến Kích Thước Điểm Ảnh Gần Nhất

javascript Copy
import React from "react";
import { View, Text, PixelRatio, StyleSheet } from "react-native";

const RoundToNearestPixelExample = () => {
  const layoutSize = 8.4;
  const roundedSize = PixelRatio.roundToNearestPixel(layoutSize);

  return (
    <View style={styles.container}>
      <Text style={styles.text}>Original Size: {layoutSize} dp</Text>
      <Text style={styles.text}>Rounded Size: {roundedSize} dp</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: "center",
    alignItems: "center",
  },
  text: {
    fontSize: 18,
    marginBottom: 10,
  },
});

export default RoundToNearestPixelExample;

Tùy Chỉnh Giao Diện với PixelRatio

Sử Dụng PixelRatio để Tạo Giao Diện Linh Hoạt

Bạn có thể sử dụng PixelRatio để tạo ra các giao diện linh hoạt, phù hợp với nhiều kích thước màn hình và độ phân giải khác nhau.

Ví dụ:

javascript Copy
import React from "react";
import { View, Text, PixelRatio, StyleSheet } from "react-native";

const ResponsiveLayout = () => {
  const baseSize = 14;
  const scaledSize = baseSize * PixelRatio.getFontScale();

  return (
    <View style={styles.container}>
      <Text style={[styles.text, { fontSize: scaledSize }]}>
        This is a responsive text
      </Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: "center",
    alignItems: "center",
  },
  text: {
    marginBottom: 10,
  },
});

export default ResponsiveLayout;

Sử Dụng Thư Viện Bên Ngoài

Nếu bạn cần các tính năng phức tạp hơn, bạn có thể sử dụng các thư viện bên ngoài như react-native-responsive-screen hoặc react-native-size-matters.

Sử Dụng react-native-responsive-screen

Cài Đặt Thư Viện

bash Copy
npm install react-native-responsive-screen

Sử Dụng Thư Viện

javascript Copy
import React from "react";
import { View, Text, StyleSheet } from "react-native";
import {
  widthPercentageToDP as wp,
  heightPercentageToDP as hp,
} from "react-native-responsive-screen";

const ResponsiveScreenExample = () => {
  return (
    <View style={styles.container}>
      <Text style={styles.text}>Width: {wp("50%")}</Text>
      <Text style={styles.text}>Height: {hp("50%")}</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: "center",
    alignItems: "center",
  },
  text: {
    fontSize: wp("5%"),
  },
});

export default ResponsiveScreenExample;

Sử Dụng react-native-size-matters

Cài Đặt Thư Viện

bash Copy
npm install react-native-size-matters

Sử Dụng Thư Viện

javascript Copy
import React from "react";
import { View, Text, StyleSheet } from "react-native";
import { ScaledSheet, moderateScale } from "react-native-size-matters";

const SizeMattersExample = () => {
  return (
    <View style={styles.container}>
      <Text style={styles.text}>This is a responsive text</Text>
    </View>
  );
};

const styles = ScaledSheet.create({
  container: {
    flex: 1,
    justifyContent: "center",
    alignItems: "center",
  },
  text: {
    fontSize: "20@ms", // moderateScale(20)
  },
});

export default SizeMattersExample;

Các Kỹ Thuật Tối Ưu Hóa Sử Dụng PixelRatio

Sử Dụng StyleSheet để Tối Ưu Hóa Hiệu Suất

Sử dụng StyleSheet.create để định nghĩa các style giúp tối ưu hóa hiệu suất vì các style được tạo ra chỉ một lần và được tham chiếu lại nhiều lần.

Ví dụ:

javascript Copy
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: "center",
    alignItems: "center",
  },
});

Tránh Sử Dụng Hàm Inline

Tránh sử dụng các hàm inline cho thuộc tính onPress để tránh việc tạo lại hàm mỗi khi component được render.

Ví dụ:

javascript Copy
const openURL = () => {
  Linking.openURL("https://reactnative.dev");
};

<Button title="Open React Native Website" onPress={openURL} />;

Các Hạn Chế của PixelRatio Component

Mặc dù PixelRatio component trong React Native rất mạnh mẽ, nhưng nó cũng có một số hạn chế:

  1. Hiệu Suất: Khi sử dụng quá nhiều sự kiện lắng nghe thay đổi kích thước, hiệu suất của ứng dụng có thể bị ảnh hưởng.
  2. Tùy Chỉnh Giao Diện: PixelRatio không hỗ trợ nhiều tùy chỉnh giao diện như thay đổi font chữ, thêm biểu tượng, hoặc tạo nền gradient.
  3. Quản Lý Sự Kiện: Khi có nhiều sự kiện lắng nghe được đăng ký, việc quản lý và loại bỏ chúng có thể trở nên phức tạp.

Kết Luận

PixelRatio là một thành phần cơ bản và quan trọng trong React Native, giúp bạn tạo ra các giao diện người dùng mượt mà và hiệu quả. Bằng cách hiểu rõ các thuộc tính và cách sử dụng PixelRatio, bạn có thể tạo ra các giao diện người dùng mượt mà và hiệu quả. Hy vọng qua bài viết này, bạn đã có thể nắm bắt được cách sử dụng PixelRatio trong React Native và áp dụng vào các dự án của mình.

Avatar
Được viết bởi

Admin Team

Gợi ý câu hỏi phỏng vấn

Không có dữ liệu

Không có dữ liệu

Gợi ý bài viết
Không có dữ liệu

Không có dữ liệu

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào