具有变暗不透明度的文本叠加图像 React Native

Posted

技术标签:

【中文标题】具有变暗不透明度的文本叠加图像 React Native【英文标题】:Text Overlay Image with Darkened Opacity React Native 【发布时间】:2016-04-05 19:46:35 【问题描述】:

我正在尝试在图像上叠加标题 - 图像变暗且不透明度较低。但是,不透明度效果也改变了覆盖文本 - 使其变暗。有什么解决办法吗?如下所示:

这是我的自定义组件的代码(文章预览 - 上图是一排文章预览组件):

//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
  , 

);

【问题讨论】:

【参考方案1】:

尝试将容器的样式更改为

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

【讨论】:

这可以解决问题。如果rgba() 不起作用,则应将 React Native 更新到 0.16 或更高版本。【参考方案2】:

不要将不透明度应用于整个 ImageBackground 元素,而是在图像本身上实现它,例如。

<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>

【讨论】:

超级出路..简单而最好的 通常希望使用&lt;ImageBackground&gt; 作为其他组件的背景。在这种情况下,纳德的回答也会给&lt;ImageBackground&gt; 的孩子着色,即使他们是同龄人。通过 imageStyle 道具设置不透明度时,这不是问题。这是我认为最好的答案。【参考方案3】:

不透明度会影响整个视图。尝试改为拥有 2 个视图。一个绝对定位于包含图像的位置。另一个包含您的文本和按钮内容。

您可以使用 position : "absolute", top: 0, left: 0 来绝对定位视图

【讨论】:

我今天会研究一下 - 似乎我只是切换了 UI 以完全避免这个问题,并采取了谷歌新闻 UX 路线 你运气好吗? 我最终所做的是完全改变视图以类似于 Google 新闻【参考方案4】:

我使用 Image 标签内的背景解决了我的工作,它工作正常。 像这样

<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>

【讨论】:

内容的 backgroundColor rgba 可以解决所有问题。 ... &lt;Image&gt; 组件不能包含子组件。 @Jago 你可以使用reactnative.dev/docs/imagebackground

以上是关于具有变暗不透明度的文本叠加图像 React Native的主要内容,如果未能解决你的问题,请参考以下文章

在 React Native iOS 中的图像顶部呈现具有透明背景的文本框

如何使图像变暗以保持透明度不受 CSS 或 JS 影响?

透明叠加创建PNG

如何在带有文本的图像上方创建透明的深色叠加层?

在具有透明背景的绘制文本上添加图案覆盖

C# 具有叠加/不透明图像的拖放效果