UNPKG

react-native-lib-cus-com

Version:

react-native 自定义辅助组件库,完美的网路请求,带加载条,可上传、下载文件,等等多种ui,可自定义删除;可节省应用级软件的开发时间

197 lines (168 loc) 5.98 kB
import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { View, Image, TouchableOpacity, ActivityIndicator, } from 'react-native'; import RootSiblings from 'react-native-root-siblings'; import ImageViewer from 'react-native-image-zoom-viewer'; import {StyleSheetAdapt} from "./StyleSheetAdapt"; import img from './../res/error.png'; import imageLeft from './../res/leftWhite.png'; import {Theme} from "./Theme"; let showingDialog = null; /** * 大图片展示Api * **/ export class ImageViewApi extends Component{ /** * 显示图片 * @param imageUrls array,//图片数组 * @param index int,//地址,初始显示第几张图片 * @param iconLeft int,//返回按钮图标 * **/ static show(imageUrls=[],index=0,iconLeft){ let view = <ImageView imageUrls={imageUrls} iconLeft={iconLeft} imageIndex={index}/>; if(showingDialog == null){ showingDialog = new RootSiblings(view); } else { showingDialog.update(view) } } /** * 隐藏图片 */ static hide(){ if (showingDialog != null && showingDialog instanceof RootSiblings) { showingDialog.destroy(); showingDialog = null; } } } class ImageView extends Component { static propTypes = { imageUrls:PropTypes.array,//图片路径数组 iconLeft:PropTypes.number,//返回按钮图标 imageIndex:PropTypes.number //显示图片下标 } /** * 设置默认属性 * **/ static defaultProps = { imageIndex:0, iconLeft:imageLeft, imageUrls:[] } // 构造 constructor(props) { super(props); this.imageList = []; this.state = { indicator:true, imageIndex:this.props.imageIndex }; } _getImageUrls(){ const {imageUrls,imageIndex} = this.props; if(this.imageList.length == 0){ let imageList = []; imageUrls.forEach((val,i,arr)=>{ imageList.push({ url: val, // Pass props to <Image />. isLoad:imageIndex == i ? false : true,//是否加载 true:未加载;false:未加载 props: { // headers: ... // source: img, onLoadStart:()=>{ // console.info("onLoadStart","onLoadStart") // this.setState({indicator:true}); }, onLoadEnd:()=>{ // console.info("onLoadEnd","onLoadEnd") this.setState({indicator:false}); } } , freeHeight: true }); }); this.imageList = imageList; } return this.imageList; } render(){ const {iconLeft} = this.props; const {indicator,imageIndex} = this.state; const renderHeader = <TouchableOpacity style={styles.iconLeft} delayPressIn={0} delayPressOut={0} onPressIn={() =>{ ImageViewApi.hide(); }}> <Image source={iconLeft} style={{resizeMode:"contain"}}/> </TouchableOpacity>; return( <View style={styles.container}> <ImageViewer imageUrls={this._getImageUrls()} // 照片路径 enableImageZoom={true} // 是否开启手势缩放 index={imageIndex} // 初始显示第几张 failImageSource={img} // 加载失败图片 onChange={(index) => { if( this.imageList[index].isLoad){ this.imageList[index].isLoad = false; this.setState({ indicator:true, imageIndex:index }); } }} // 图片切换时触发 renderHeader={() =>renderHeader} style={StyleSheetAdapt.styleJsonAdaptConvert({ position: "absolute", width:'w', height:'h', })} onClick={() => { // 图片单击事件,我在这里设置退出 }} /> { indicator &&<ActivityIndicator size="large" color={Theme.Colors.themeColor}/> } </View> ); } } const styles = StyleSheetAdapt.create({ indicator:{ marginTop:'0.5h', }, container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: 'black', position: "absolute", width:'w', height:'h', }, spinner: { marginBottom: 50 }, iconLeft:{ left:20, top:40, //backgroundColor: '#d35400', position: "absolute", zIndex: 9999 //z轴方向的层级,越大越在顶部 } });