React Native 如何从视图中创建png文件

klh5stk1  于 2023-10-22  发布在  React
关注(0)|答案(2)|浏览(144)

我做了一些动态的视图。

  1. <View style={{
  2. backgroundColor: '#fff',
  3. width: 300,
  4. height: 200,
  5. top: 0,
  6. left: 0
  7. }}
  8. />

如何将此视图(其尺寸和颜色)导出到png文件?

hmtdttj4

hmtdttj41#

方案一:

发现这个库-render-react-native-to-image似乎非常早期的项目,虽然。
基本用法:

  1. import * as React from "react"
  2. import { Text } from "react-native"
  3. import * as renderer from "react-test-renderer"
  4. import {renderToSVGString, renderToCanvas} from "render-react-native-to-image"
  5. describe("Fixtures", () => {
  6. it("does some simple JSX", () => {
  7. const component = renderer.create(<Text>Hello</Text>).toJSON()
  8. expect(component).toMatchSnapshot()
  9. renderToCanvas('./example.png', component)
  10. fs.writeFileSync('./example.svg', renderToSVGString(component))
  11. })
  12. })

方案二:

使用react-native-view-shot
通过创建一个组件来创建所需的布局,然后使用react-native-cameraroll将屏幕截图存储在设备上,解决了不向用户显示屏幕截图的问题。大概是这样的:

  1. import React, { Component } from 'react';
  2. import { Platform, PermissionsAndroid } from 'react-native';
  3. import styled from 'styled-components/native';
  4. import ViewShot from 'react-native-view-shot';
  5. import CameraRoll from '@react-native-community/cameraroll';
  6. class StatsImage extends Component<Props, State> {
  7. componentDidMount() {
  8. this.refs.viewShot.capture()
  9. .then(uri => {
  10. return this.savePicture(uri)
  11. })
  12. .then(() => {
  13. console.log('saved to camera roll')
  14. })
  15. .catch(err => console.log('Failed storing to camera roll', err))
  16. }
  17. async hasAndroidPermission() {
  18. const permission = PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE;
  19. const hasPermission = await PermissionsAndroid.check(permission);
  20. if (hasPermission) {
  21. console.log('permission stats', 'have permission');
  22. return true;
  23. }
  24. const status = await PermissionsAndroid.request(permission);
  25. console.log('permission stats', status);
  26. return status === 'granted';
  27. }
  28. async savePicture(uri) {
  29. if (Platform.OS === "android" && !(await this.hasAndroidPermission())) {
  30. return Promise.resolve();
  31. }
  32. return CameraRoll.save(uri, 'photo' )
  33. };
  34. render() {
  35. return (
  36. <S.ViewShotContainer ref="viewShot" options={{ format: "jpg" }}>
  37. // layout to be snapshotted
  38. </S.ViewShotContainer>
  39. );
  40. }
  41. const S = {};
  42. S.ViewShotContainer = styled(ViewShot)`
  43. position: absolute;
  44. top: 0;
  45. left: 0;
  46. z-index: -1;
  47. width: 500px;
  48. height: 500px;
  49. `;
  50. }

我在后台做这件事的方式是让用户看不到快照的布局,将这个组件的根容器设置为position: absolutez-index: -1。因此,本质上,您在UI后面呈现组件并拍摄快照,然后可以卸载它。
这个hack的缺点是:
1.您需要手动设置布局的高度和宽度
1.我使用了样式化的组件,但这也可以不用它来实现
1.在上面的例子中,硬编码500 px的500 px大小改变它,以满足您的需要
希望这对任何人都有帮助…

展开查看全部
ujv3wf0j

ujv3wf0j2#

如果你有一些行动或情况时,采取出口的形象。(单击其他任何按钮)使用此libraryreact-native-view-shot进行屏幕截图
您可以使用ref截取特定于View的屏幕截图

相关问题