63

如何在 a 上渲染阴影View?我尝试了许多, , 和的组合shadowColor,但似乎无济于事。我确信样式应用正确,因为我设置的其他属性有效。shadowOffsetshadowOpacityshadowRadius

4

9 回答 9

110

我正在使用 React-Native 0.40 及以下代码在 IOS 和 Android 上都适用于我。

(仅限 Android)使用 Android 的底层海拔 API 设置视图的海拔。这会为项目添加阴影并影响重叠视图的 z 顺序。仅在 Android 5.0+ 上支持,对早期版本没有影响。

 class MainApp extends Component {
  render() {
    return (
      <View style={styles.container}>

        <View elevation={5} style={styles.buttonContainer}>
          <Text style={styles.textStyle}>Shadow Applied</Text>
        </View>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#FFFFFF'
  },
  textStyle: {
    color: '#FFFFFF'
  },
  buttonContainer: {
    backgroundColor: '#2E9298',
    borderRadius: 10,
    padding: 10,
    shadowColor: '#000000',
    shadowOffset: {
      width: 0,
      height: 3
    },
    shadowRadius: 5,
    shadowOpacity: 1.0
  }
})

在 iPhone 上测试。

在此处输入图像描述

编辑

来自@詹姆斯的评论。谢谢。

注意: 对于那些在 android 上的,背景颜色是关键的。我使用 View 作为另一个元素的容器,在我指定背景颜色之前无法获得阴影。

于 2017-01-12T02:27:36.023 回答
31

使用海拔在 RN Android 上实现阴影。添加了海拔道具#27

<View elevation={5}> </View>

于 2016-03-14T06:48:53.367 回答
19

这似乎是 React native 中的一个错误,它shadowOpacity被设置为 typeCGFloat而不是float根据CALayer doc。在修复之前使用 iPhone 5 模拟器。(CGFloatfloat旧设备中。)

跟踪此问题的 React Native 问题是:

https://github.com/facebook/react-native/issues/449

于 2015-03-29T22:26:18.103 回答
15
    viewStyle : {
    backgroundColor: '#F8F8F8',
    justifyContent: 'center',
    alignItems: 'center',
    height: 60,
    paddingTop: 15,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.2,
    marginBottom: 10,
    elevation: 2,
    position: 'relative'
},

使用marginBottom:10

于 2017-05-25T05:40:00.803 回答
11

您必须为 View 提供海拔道具

<View elevation={5} style={styles.container}>
   <Text>Hello World !</Text>
 </View>

可以像这样添加样式:

 const styles = StyleSheet.create({

     container:{
        padding:20,
        backgroundColor:'#d9d9d9',
        shadowColor: "#000000",
        shadowOpacity: 0.8,
        shadowRadius: 2,
        shadowOffset: {
          height: 1,
          width: 1
        }
       },
   })
于 2017-06-08T14:50:20.697 回答
8
  panel: {
    // ios
    backgroundColor: '#03A9F4',
    alignItems: 'center', 
    shadowOffset: {width: 0, height: 13}, 
    shadowOpacity: 0.3,
    shadowRadius: 6,

    // android (Android +5.0)
    elevation: 3,
  }

或者您可以将react-native-shadow用于 android

于 2017-10-09T06:52:13.733 回答
6

所有关于利润

这适用于Android,但没有在ios中测试

import React, { PureComponent } from 'react'
import PropTypes from 'prop-types'
import { View, Platform } from 'react-native'
import EStyleSheet from 'react-native-extended-stylesheet'

const styles = EStyleSheet.create({
    wrapper: {
        margin: '-1.4rem'
    },
    shadow: {
        padding: '1.4rem',
        margin: '1.4rem',
        borderRadius: 4,
        borderWidth: 0,
        borderColor: 'transparent',
        ...Platform.select({
            ios: {
                shadowColor: 'rgba(0,0,0, 0.4)',
                shadowOffset: { height: 1, width: 1 },
                shadowOpacity: 0.7,
                shadowRadius: '1.4rem'
            },
            android: {
                elevation: '1.4rem'
            }
        })
    },
    container: {
        padding: 10,
        margin: '-1.4rem',
        borderRadius: 4,
        borderWidth: 0,
        borderColor: '#Fff',
        backgroundColor: '#fff'
    }
})

class ShadowWrapper extends PureComponent {
    static propTypes = {
        children: PropTypes.oneOfType([
            PropTypes.element,
            PropTypes.node,
            PropTypes.arrayOf(PropTypes.element)
        ]).isRequired
    }

    render () {
        return (
            View style={styles.wrapper}
                View style={styles.shadow}
                    View style={styles.container}
                        {this.props.children}
                    View
                View
            View
        )
    }
}

export default ShadowWrapper
于 2017-12-21T09:42:41.807 回答
4

按样式组件

const StyledView = styled.View`
      border-width: 1;
      border-radius: 2;
      border-color: #ddd;
      border-bottom-width: 0;
      shadow-color: #000;
      shadow-offset: {width: 0, height: 2};
      shadow-opacity: 0.8;
      shadow-radius: 2;
      elevation: 1;     
`

或按样式

const styles = StyleSheet.create({
  containerStyle: {
    borderWidth: 1,
    borderRadius: 2,
    borderColor: '#ddd',
    borderBottomWidth: 0,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.8,
    shadowRadius: 2,
    elevation: 1,
    marginLeft: 5,
    marginRight: 5,
    marginTop: 10,
  }
})
于 2019-06-22T10:28:39.063 回答
0

我正在使用 Styled Components 并为自己创建了一个辅助函数。

它采用给定的 Android 高度并创建相当等效的 iOS 阴影。

样式工具.js

import { css } from 'styled-components/native';

/*
 REMINDER!!!!!!!!!!!!!
 Shadows do not show up on iOS if `overflow: hidden` is used.
 https://react-native.canny.io/feature-requests/p/shadow-does-not-appear-if-overflow-hidden-is-set-on-ios
*/

// eslint-disable-next-line import/prefer-default-export
export const crossPlatformElevation = (elevation: number = 0) => css`
  /* Android - native default is 4, we're setting to 0 to match iOS. */
  elevation: ${elevation};

  /* iOS - default is no shadow. Only add if above zero */
  ${elevation > 0
    && css`
      shadow-color: black;
      shadow-offset: 0px ${0.5 * elevation}px;
      shadow-opacity: 0.3;
      shadow-radius: ${0.8 * elevation}px;
    `}
`;

使用

import styled from 'styled-components/native';
import { crossPlatformElevation } from "../../lib/stylingTools";

export const ContentContainer = styled.View`
  background: white;
  ${crossPlatformElevation(10)};
`;
于 2019-11-19T00:27:53.840 回答