Text Overlay Image with Darkened Opacity React Native

27,761

Solution 1

Try changing the container's style to

container: {
 flex: 1, 
 backgroundColor: 'rgba(0,0,0,.6)'
},

Solution 2

Instead of applying the opacity to entire ImageBackground element, implement it on the image itself Eg.

<ImageBackground style={styles.imageContainer}
                 imageStyle={{ opacity: 0.5 }}
                 source={require('../assets/images/background.png')}>
                <View style={styles.welcomeContainer}>
                    <Image source={require('../assets/images/zeptagram-logo.png')} style={styles.welcomeImage} />
                </View>
            </ImageBackground>

Solution 3

I solve my work with Background inside Image tag and It works fine. like this

<Image source={require('./img/2.jpg')} style=
              {{height:deviceRowHeight,width:deviceWidth}}>
    <View style={{backgroundColor:'rgba(0,0,0,.6)',
                 height:deviceRowHeight,width:deviceWidth}}>
         <Text> Test Text </Text>
    </View>
</Image>

Solution 4

Opacity will affect the entire view. Try having 2 views instead. One that's absolutely positioned with the image contained. Another with your text and button content.

You can absolutely position a view using position : "absolute", top: 0, left: 0

Share:
27,761
Robert Tomas G IV
Author by

Robert Tomas G IV

As time matures, my role has changed from being a member of uniformity to representing dissimilarity, not just physically but ideally. My being is conventionally expressed through that which has been created, yet intricately maintained by my personality. I am an pro-twitter hash-tag-Facebooker who has pressed the like button to the motto “working to live” many times. Music is the therapeutic groove of my life that enables the 808 of my heartbeat to realize the tranquility of just being for a moment, yet unrestrained sound reminds me the need for some chaos. I am locally grown (Atlanta, GA), artificially influenced (by developing technologies), and completely wholesome. I am dedicated. I am poetically convoluted, surprisingly simple, and politically entertained. I am a Mac and a PC. I am a team player. I am passionate. My skills vary from advanced back-end to front-end web development, video editing, photoshop, networking architect, Raspberry Pi engineering, mobile application development, analytical research, business intelligence and research, and entrepreneurship. I love the projects I work on and thrive to master what I don't understand, seeking high learning curves and challenging environments.

Updated on July 09, 2022

Comments

  • Robert Tomas G IV
    Robert Tomas G IV almost 2 years

    I am attempting to overlay a title over an image - with the image darkened with a lower opacity. However, the opacity effect is changing the overlaying text as well - making it dim. Any fix to this? Here is what is looks like:

    enter image description here

    And here is my code for the custom component (article preview - which the above image is a row of article preview components):

    //component for article preview touchable image
    /* will require the following
    - rss feed and api
    - user's keyword interests from parse In home.js
    - parse db needs to be augmented to include what they heart
    - parse db needs to be augmented to include what they press on (like google news)
    */
    var React = require('react-native');
    var {
      View, 
      StyleSheet, 
      Text, 
      Image, 
      TouchableHighlight, 
    } = React;
    
    //dimensions
    var Dimensions = require('Dimensions');
    var window = Dimensions.get('window');
    var ImageButton = require('../../common/imageButton');
    var KeywordBox = require('../../authentication/onboarding/keyword-box');
    
    //additional libraries
    
    module.exports = React.createClass({
      //onPress function that triggers when button pressed
      //this.props.text is property that can be dynamically filled within button 
      /* following props:
        - source={this.props.source}
        - onPress={this.props.onPress}
        - {this.props.text}
        - {this.props.heartText}
        - key={this.props.key} 
        - text={this.props.category} 
        - this.props.selected
      */
      render: function() {
        return (
          <TouchableHighlight 
            underlayColor={'transparent'}
            onPress={this.props.onPress} >
              <Image 
                source={this.props.source} 
                style={[styles.articlePreview, this.border('red')]}>
                      <View style={[styles.container, this.border('organge')]}>
                          <View style={[styles.header, this.border('blue')]}>
                              <Text style={[styles.previewText]}>{this.props.text}</Text>
                          </View>
                          <View style={[styles.footer, this.border('white')]}>
                            <View style={[styles.heartRow, this.border('black')]}>
                              <ImageButton
                                  style={[styles.heartBtn, , this.border('red')]}
                                  resizeMode={'contain'}
                                  onPress={this.onHeartPress}
                                  source={require('../../img/heart_btn.png')} />
                              <Text style={[styles.heartText]}>{this.props.heartText + ' favorites'}</Text>
                            </View>
                              <KeywordBox 
                                  style={[styles.category, this.border('blue')]}
                                  key={this.props.key} 
                                  text={this.props.category} 
                                  onPress={this.props.categoryPress}
                                  selected={this.props.selected} />
                          </View>
                      </View>
              </Image>
          </TouchableHighlight>
        );
      }, 
      onHeartPress: function() {
        //will move this function to a general module
      }, 
      border: function(color) {
          return {
            //borderColor: color, 
            //borderWidth: 4,
          } 
       },
    });
    
    var styles = StyleSheet.create({
      heartText: {
        color: 'white', 
        fontSize: 12, 
        fontWeight: 'bold',
        alignSelf: 'center', 
        marginLeft: 5, 
        fontFamily: 'SFCompactText-Medium'
      }, 
      heartRow: {
        flexDirection: 'row', 
        justifyContent: 'space-around', 
        alignSelf: 'center', 
        justifyContent: 'center', 
      }, 
      heartBtn: {
        height: (92/97)*(window.width/13), 
        width: window.width/13, 
        alignSelf:'center', 
      }, 
      category: {
        fontFamily: 'Bebas Neue', 
        fontSize: 10,
        fontWeight: 'bold'
      }, 
      header: {
        flex: 3, 
        alignItems: 'center', 
        justifyContent: 'space-around', 
        marginTop: window.height/30,
      }, 
      footer: {
        flex: 1, 
        flexDirection: 'row', 
        justifyContent: 'space-between', 
        alignItems: 'center', 
        margin: window.height/50,
      }, 
      container: {
        flex: 1, 
        backgroundColor: 'black', 
        opacity: 0.6, 
      }, 
      articlePreview: {
        flex: 1, 
        height: window.height/3.2, 
        width: window.width, 
        flexDirection: 'column'
      }, 
      previewText: {
        fontFamily: 'Bebas Neue', 
        fontSize: 23,
        color: 'white', 
        alignSelf: 'center', 
        textAlign: 'center', 
        margin: 5, 
        position: 'absolute',
        top: 0,
        right: 0,
        bottom: 0,
        left: 0
      }, 
    
    });