2015-12-09 16 views
6

Tôi đang cố gắng vừa với hình ảnh trong các chế độ xem có chứa của chúng để tôi có thể có lưới hình ảnh liền mạch. Vấn đề là resizeMode='contain' dường như vừa với chiều rộng của màn hình hoặc ít nhất một số vùng chứa cấp cao hơn, tôi cần hình ảnh để vừa với kích thước của từng mục trong danh sách.phản ứng gốc - Hình ảnh phù hợp có chứa Chế độ xem, không phải toàn bộ kích thước màn hình

Dưới đây là một ví dụ rất xấu xí của phong cách và kết quả là lưới:

Các phong cách:

const styles = StyleSheet.create({ 
    container: { 
    flex: 1, 
    backgroundColor: 'blue' 
    }, 

    item: { 
    flex: 1, 
    overflow: 'hidden', 
    alignItems: 'center', 
    backgroundColor: 'orange', 
    position: 'relative', 
    margin: 10 
    }, 

    image: { 
    flex: 1 
    } 
}) 

Cách bố trí:

<TouchableOpacity 
    activeOpacity={ 0.75 } 
    style={ styles.item } 
> 
    <Image 
    style={ styles.image } 
    resizeMode='contain' 
    source={ temp } 
    /> 
</TouchableOpacity> 

Kết quả (với resizeMode='contain'):

enter image description here

Kết quả (với resizeMode='cover'):

enter image description here

Như bạn thấy, những hình ảnh cover ed rất lớn và rộng như toàn bộ màn hình và không phù hợp với quan điểm chứa ngay lập tức.

Cập nhật 1:

tôi đã có thể đạt được một kết quả gần với những gì tôi đang tìm kiếm bằng cách áp dụng một quy mô biến đổi đến hình ảnh và thu hẹp nó từ trung tâm:

Các transform:

transform: [{ scale: 0.55 }] 

Cách bố trí kết quả (không có lợi nhuận hoặc miếng đệm): enter image description here

+0

Bạn có thể đưa ra hình ảnh ví dụ về cách bạn muốn họ nhìn hoặc đóng nó không? Cảm ơn. –

+0

Hey @NaderDabit Tôi sẽ cập nhật với một ví dụ ngay bây giờ. – BarakChamo

+0

Tất cả các hình ảnh sẽ có hình vuông? –

Trả lời

3

Tôi không thể lấy ví dụ làm việc bằng cách sử dụng các thuộc tính resizeMode của Image, nhưng vì tất cả hình ảnh sẽ là hình vuông nên có cách để làm điều đó bằng cách sử dụng Kích thước của cửa sổ cùng với flexbox.

Đặt flexDirection: 'row'flexWrap: 'wrap', sau đó tất cả sẽ xếp hàng miễn là chúng có cùng kích thước.

tôi đặt nó lên here

https://snack.expo.io/HkbZNqjeZ

"use strict"; 

var React = require("react-native"); 
var { 
    AppRegistry, 
    StyleSheet, 
    Text, 
    View, 
    Image, 
    TouchableOpacity, 
    Dimensions, 
    ScrollView 
} = React; 

var deviceWidth = Dimensions.get("window").width; 
var temp = "http://thumbs.dreamstime.com/z/close-up-angry-chihuahua-growling-2-years-old-15126199.jpg"; 
var SampleApp = React.createClass({ 
    render: function() { 
    var images = []; 

    for (var i = 0; i < 10; i++) { 
     images.push(
     <TouchableOpacity key={i} activeOpacity={0.75} style={styles.item}> 
      <Image style={styles.image} source={{ uri: temp }} /> 
     </TouchableOpacity> 
    ); 
    } 

    return (
     <ScrollView style={{ flex: 1 }}> 
     <View style={styles.container}> 
      {images} 
     </View> 
     </ScrollView> 
    ); 
    } 
}); 
+0

Cảm ơn Nader, tôi đã sử dụng giải pháp của bạn và nó hoạt động hoàn hảo. Tôi đã hy vọng cho một cái gì đó sẽ sử dụng hỗ trợ flexbox dựng sẵn nhưng điều này đang làm những gì tôi cần. – BarakChamo

1

Tôi nghĩ rằng đó là vì bạn chưa định chiều rộng và chiều cao cho item.

Nếu bạn chỉ muốn có 2 hình ảnh liên tiếp, bạn có thể thử một cái gì đó như thế này thay vì sử dụng flex:

item: { 
width: '50%', 
height: '100%', 
overflow: 'hidden', 
alignItems: 'center', 
backgroundColor: 'orange', 
position: 'relative', 
margin: 10, 
}, 

này làm việc cho tôi, hy vọng nó sẽ giúp.

0

Thiết lập kích thước cho Xem và chắc chắn rằng bạn ảnh theo kiểu với chiều cao và chiều rộng thiết lập để 'undefined' như ví dụ dưới đây:

<View style={{width: 10, height:10 }} > 
     <Image style= {{flex:1 , width: undefined, height: undefined}}  
     source={require('../yourfolder/yourimage'} 
     /> 
    </View> 

này sẽ đảm bảo hình ảnh của bạn quy mô và phù hợp hoàn hảo với quan điểm của bạn.

Các vấn đề liên quan