This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
截图
编辑页面
在本教程中,学习如何使用第三方库和 Expo Media Library 捕获屏幕截图。
在本章中,我们将学习如何使用第三方库截取屏幕截图,并将其保存到设备的媒体库中。我们将使用 react-native-view-shot 截取屏幕截图,并使用 expo-media-library 将图像保存到设备的媒体库中。
提示 到目前为止,我们已经使用了第三方库,例如
react-native-gesture-handler、react-native-reanimated。根据不同的使用场景,我们可以在 React Native Directory 中找到数百个其他第三方库。

使用 react-native-view-shot 捕获屏幕截图,并使用 expo-media-library 将其保存到设备的媒体库中。
2
请求权限
需要访问敏感信息的应用,例如访问设备媒体库,必须提示用户授予或拒绝访问权限。使用 expo-image-picker 中的 useMediaLibraryPermissions() hook,我们可以使用 permissionResponse 和 requestPermission() 方法来请求访问权限。这个 hook 会同时请求读取和写入权限,这既涵盖了从媒体库中选择图片,也涵盖了将截图保存到其中。
当应用首次加载且权限状态既不是已授予也不是已拒绝时,permissionResponse 的值为 null。当被请求权限时,用户可以授予或拒绝权限。我们可以添加一个条件来检查它是否未被授予。如果未被授予,就触发 requestPermission() 方法。获取访问权限后,permissionResponse 的值会变为 granted。
将以下代码片段添加到 src/app/(tabs)/index.tsx 中:
3
创建一个 ref 来保存当前视图
我们将使用 react-native-view-shot 允许用户在应用内截取屏幕截图。这个库会使用 captureRef() 方法将 <View> 的截图捕获为图像。它会返回所捕获截图图像文件的 URI。
- 从
react-native-view-shot导入captureRef,并从 React 导入useRef。 - 创建一个
imageRef引用变量来保存所捕获截图的引用。 - 将
<ImageViewer>和<EmojiSticker>组件包裹在一个<View>中,然后把引用变量传给它。
在上面的代码片段中,collapsable 属性被设置为 false。这使得 <View> 组件只对背景图片和表情贴纸进行截图。
4
捕获截图并保存
我们可以在 onSaveImageAsync() 函数内部调用 react-native-view-shot 的 captureRef() 方法来捕获视图截图。它接受一个可选参数,我们可以传入截图区域的 width 和 height。关于可用选项的更多信息,请参阅该库的文档。
captureRef() 方法还会返回一个 promise,成功时会提供截图的 URI。我们将此 URI 作为参数传递给 MediaLibrary.saveToLibraryAsync(),并将截图保存到设备的媒体库中。
在 src/app/(tabs)/index.tsx 中,使用以下代码更新 onSaveImageAsync() 函数:
现在,在应用中选择一张照片并添加一个贴纸。然后点击“保存”按钮。我们应该会在 Android 和 iOS 上看到以下结果:
总结
Chapter 7: Take a screenshot
We've successfully used react-native-view-shot and expo-media-library to capture a screenshot and save it on the device's library.
In the next chapter, let's learn how to handle the differences between mobile and web platforms to implement the same functionality on web.