@@ -2,23 +2,30 @@ import React, { useState, useMemo, useRef } from 'react';
22import { StyleSheet , ViewProps , Dimensions , View , Image , Animated } from 'react-native' ;
33import TransitionImage , { ImageProps } from '../TransitionImage' ;
44import MaskLayer , { MaskLayerProps } from '../MaskLayer' ;
5+ import Swiper from '../Swiper' ;
56import { ActivityIndicator } from 'react-native' ;
67export let ImageMainWidth = Dimensions . get ( 'window' ) . width ;
78export let ImageMainHeight = Dimensions . get ( 'window' ) . height ;
89
910const defaultImage = 'https://wx3.sinaimg.cn/mw690/4718260ely1gt2cg7t5udj23dw1wkhdu.jpg' ;
1011
12+ export interface ImageViewerDataSourceProps {
13+ url : string ;
14+ [ key : string ] : any ;
15+ }
1116export interface ImageViewerProps extends ViewProps {
1217 /** 图片宽度 */
1318 width ?: number ;
1419 /** 图片高度 */
1520 height ?: number ;
1621 /** 图像源(远程URL或本地文件资源 */
17- src ?: string | number ;
22+ src ?: string | ImageViewerDataSourceProps [ ] ;
23+ /** 默认显示第几张图片 */
24+ defaultIndex ?: number ;
1825}
1926
2027function ImageViewer ( props : ImageViewerProps ) {
21- const { width = 150 , height = 150 , src = defaultImage , ...others } = props ;
28+ const { width = 150 , height = 150 , src = defaultImage , defaultIndex = 0 , ...others } = props ;
2229 const [ visible , setVisible ] = useState ( false ) ;
2330 const fadeAnim = useRef ( new Animated . Value ( 0 ) ) . current ;
2431
@@ -34,22 +41,48 @@ function ImageViewer(props: ImageViewerProps) {
3441 } ) . start ( ) ;
3542 } , [ visible ] ) ;
3643
44+ const imgUrl = useMemo ( ( ) => {
45+ if ( Array . isArray ( src ) ) {
46+ return src [ defaultIndex ] . url ;
47+ }
48+ return src ;
49+ } , [ src ] ) ;
50+
3751 return (
3852 < View style = { { } } >
39- < TransitionImage
40- style = { { width : width , height : height } }
41- onPress = { ( ) => setVisible ( true ) }
42- source = { typeof src === 'number' ? src : { uri : src as string } }
43- PlaceholderContent = { < ActivityIndicator /> }
44- transition = { true }
45- transitionDuration = { 500 }
46- />
53+ < View style = { { flexDirection : 'row' , justifyContent : 'space-between' } } >
54+ { Array . isArray ( src ) ? (
55+ src . map ( ( item : ImageViewerDataSourceProps , index : number ) => {
56+ return (
57+ < TransitionImage
58+ key = { index }
59+ style = { { width : width , height : height , flex : 1 } }
60+ onPress = { ( ) => setVisible ( true ) }
61+ source = { { uri : item . url } }
62+ PlaceholderContent = { < ActivityIndicator /> }
63+ transition = { true }
64+ transitionDuration = { 500 }
65+ />
66+ ) ;
67+ } )
68+ ) : (
69+ < TransitionImage
70+ style = { { width : width , height : height } }
71+ onPress = { ( ) => setVisible ( true ) }
72+ source = { { uri : imgUrl } }
73+ PlaceholderContent = { < ActivityIndicator /> }
74+ transition = { true }
75+ transitionDuration = { 500 }
76+ />
77+ ) }
78+ </ View >
4779 < MaskLayer visible = { visible } onDismiss = { ( ) => setVisible ( false ) } opacity = { 0.9 } >
4880 < Animated . View style = { [ styles . content , { opacity : fadeAnim } ] } >
49- < Image
50- style = { { width : '100%' , height : '100%' , resizeMode : 'contain' } }
51- source = { typeof src === 'number' ? src : { uri : src as string } }
52- />
81+ { Array . isArray ( src ) ? (
82+ < Swiper dataSource = { src } height = { 200 } autoplay = { false } />
83+ ) : (
84+ < Image style = { { width : '100%' , height : '100%' , resizeMode : 'contain' } } source = { { uri : src } } />
85+ ) }
5386 </ Animated . View >
5487 </ MaskLayer >
5588 </ View >
0 commit comments