我做了一些动态的视图。
<View style={{ backgroundColor: '#fff', width: 300, height: 200, top: 0, left: 0 }} />
<View style={{
backgroundColor: '#fff',
width: 300,
height: 200,
top: 0,
left: 0
}}
/>
如何将此视图(其尺寸和颜色)导出到png文件?
hmtdttj41#
方案一:
发现这个库-render-react-native-to-image似乎非常早期的项目,虽然。基本用法:
import * as React from "react"import { Text } from "react-native"import * as renderer from "react-test-renderer"import {renderToSVGString, renderToCanvas} from "render-react-native-to-image"describe("Fixtures", () => { it("does some simple JSX", () => { const component = renderer.create(<Text>Hello</Text>).toJSON() expect(component).toMatchSnapshot() renderToCanvas('./example.png', component) fs.writeFileSync('./example.svg', renderToSVGString(component)) })})
import * as React from "react"
import { Text } from "react-native"
import * as renderer from "react-test-renderer"
import {renderToSVGString, renderToCanvas} from "render-react-native-to-image"
describe("Fixtures", () => {
it("does some simple JSX", () => {
const component = renderer.create(<Text>Hello</Text>).toJSON()
expect(component).toMatchSnapshot()
renderToCanvas('./example.png', component)
fs.writeFileSync('./example.svg', renderToSVGString(component))
})
方案二:
使用react-native-view-shot通过创建一个组件来创建所需的布局,然后使用react-native-cameraroll将屏幕截图存储在设备上,解决了不向用户显示屏幕截图的问题。大概是这样的:
import React, { Component } from 'react';import { Platform, PermissionsAndroid } from 'react-native';import styled from 'styled-components/native';import ViewShot from 'react-native-view-shot';import CameraRoll from '@react-native-community/cameraroll';class StatsImage extends Component<Props, State> { componentDidMount() { this.refs.viewShot.capture() .then(uri => { return this.savePicture(uri) }) .then(() => { console.log('saved to camera roll') }) .catch(err => console.log('Failed storing to camera roll', err)) } async hasAndroidPermission() { const permission = PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE; const hasPermission = await PermissionsAndroid.check(permission); if (hasPermission) { console.log('permission stats', 'have permission'); return true; } const status = await PermissionsAndroid.request(permission); console.log('permission stats', status); return status === 'granted'; } async savePicture(uri) { if (Platform.OS === "android" && !(await this.hasAndroidPermission())) { return Promise.resolve(); } return CameraRoll.save(uri, 'photo' ) }; render() { return ( <S.ViewShotContainer ref="viewShot" options={{ format: "jpg" }}> // layout to be snapshotted </S.ViewShotContainer> ); }const S = {};S.ViewShotContainer = styled(ViewShot)` position: absolute; top: 0; left: 0; z-index: -1; width: 500px; height: 500px;`;}
import React, { Component } from 'react';
import { Platform, PermissionsAndroid } from 'react-native';
import styled from 'styled-components/native';
import ViewShot from 'react-native-view-shot';
import CameraRoll from '@react-native-community/cameraroll';
class StatsImage extends Component<Props, State> {
componentDidMount() {
this.refs.viewShot.capture()
.then(uri => {
return this.savePicture(uri)
.then(() => {
console.log('saved to camera roll')
.catch(err => console.log('Failed storing to camera roll', err))
}
async hasAndroidPermission() {
const permission = PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE;
const hasPermission = await PermissionsAndroid.check(permission);
if (hasPermission) {
console.log('permission stats', 'have permission');
return true;
const status = await PermissionsAndroid.request(permission);
console.log('permission stats', status);
return status === 'granted';
async savePicture(uri) {
if (Platform.OS === "android" && !(await this.hasAndroidPermission())) {
return Promise.resolve();
return CameraRoll.save(uri, 'photo' )
};
render() {
return (
<S.ViewShotContainer ref="viewShot" options={{ format: "jpg" }}>
// layout to be snapshotted
</S.ViewShotContainer>
);
const S = {};
S.ViewShotContainer = styled(ViewShot)`
position: absolute;
top: 0;
left: 0;
z-index: -1;
width: 500px;
height: 500px;
`;
我在后台做这件事的方式是让用户看不到快照的布局,将这个组件的根容器设置为position: absolute和z-index: -1。因此,本质上,您在UI后面呈现组件并拍摄快照,然后可以卸载它。这个hack的缺点是:1.您需要手动设置布局的高度和宽度1.我使用了样式化的组件,但这也可以不用它来实现1.在上面的例子中,硬编码500 px的500 px大小改变它,以满足您的需要希望这对任何人都有帮助…
position: absolute
z-index: -1
ujv3wf0j2#
如果你有一些行动或情况时,采取出口的形象。(单击其他任何按钮)使用此libraryreact-native-view-shot进行屏幕截图您可以使用ref截取特定于View的屏幕截图
react-native-view-shot
ref
View
2条答案
按热度按时间hmtdttj41#
方案一:
发现这个库-render-react-native-to-image似乎非常早期的项目,虽然。
基本用法:
方案二:
使用react-native-view-shot
通过创建一个组件来创建所需的布局,然后使用react-native-cameraroll将屏幕截图存储在设备上,解决了不向用户显示屏幕截图的问题。大概是这样的:
我在后台做这件事的方式是让用户看不到快照的布局,将这个组件的根容器设置为
position: absolute
和z-index: -1
。因此,本质上,您在UI后面呈现组件并拍摄快照,然后可以卸载它。这个hack的缺点是:
1.您需要手动设置布局的高度和宽度
1.我使用了样式化的组件,但这也可以不用它来实现
1.在上面的例子中,硬编码500 px的500 px大小改变它,以满足您的需要
希望这对任何人都有帮助…
ujv3wf0j2#
如果你有一些行动或情况时,采取出口的形象。(单击其他任何按钮)使用此library
react-native-view-shot
进行屏幕截图您可以使用
ref
截取特定于View
的屏幕截图