如何在 React Native for android 中设置阴影?

Posted

技术标签:

【中文标题】如何在 React Native for android 中设置阴影?【英文标题】:How to set shadows in React Native for android? 【发布时间】:2017-05-10 06:17:56 【问题描述】:

您好我正在尝试为我的工厂设置阴影,但到目前为止我的尝试失败了/p>

这是我尝试过的

  <View
    style=
      width: 56,
      height: 56,
      elevation: 2,
      borderRadius: 28,
      marginBottom: 3,
      backgroundColor: 'rgba(231,76,60,1)',
    
  ></View>

我需要达到的目标

【问题讨论】:

【参考方案1】:

添加 CSS 属性 elevation: 1android 中呈现阴影,无需安装任何 3rd 方库。

elevationView 元素上可用的仅限 Android 的样式属性。

见:React Native Docs for the elevation style property


如果您对 3rd 方软件持开放态度,另一种获取 Android 阴影的方法是安装 react-native-shadow

示例(改编自自述文件):

import React,  Component  from "react";
import  TouchableHighlight  from "react-native";

import  BoxShadow  from "react-native-shadow";

export default class ShadowButton extends Component 
  render() 
    const shadowOpt = 
      width: 160,
      height: 170,
      color: "#000",
      border: 2,
      radius: 3,
      opacity: 0.2,
      x: 0,
      y: 3,
      style:  marginVertical: 5 
    ;

    return (
      <BoxShadow setting=shadowOpt>
        <TouchableHighlight
          style=
            position: "relative",
            width: 160,
            height: 170,
            backgroundColor: "#fff",
            borderRadius: 3,
            // marginVertical: 5,
            overflow: "hidden"
          
        >
          ...
        </TouchableHighlight>
      </BoxShadow>
    );
  

【讨论】:

添加 css 属性 elevation: 1 在 Android 中呈现阴影,无需安装任何 3rd 方库。我用 React Native 0.52 测试了它 使用elevation 时要小心,因为它不会尊重您对shadow 的设置,例如颜色和偏移量。 这个库,不知道child的指定宽高怎么办。 . .因为它需要。 @LeangSocheat 你有没有想过如果你事先不知道宽度或高度怎么办?我有同样的问题。谢谢。 @FuzzyTree 关于 react-native-shadow 模块似乎缺少主要内容。【参考方案2】:

另一个不使用第三方库的解决方案是使用elevation

从 react-native 文档中提取。 https://facebook.github.io/react-native/docs/view.html

(Android-only)设置视图的高度,使用 Android 的 底层高程 API。这会为项目添加阴影,并且 影响重叠视图的 z 顺序。仅支持 Android 5.0+, 对早期版本没有影响。

elevation 将进入style 属性,可以这样实现。

<View style= elevation: 2 >
    children
</View>

海拔越高,阴影越大。希望这会有所帮助!

【讨论】:

为什么高程属性写在两个大括号内? @divine 外括号用于JS插值,内括号用于对象 这只会在视图的底部做阴影,它不允许你在另一边做阴影 正确,ios 在使用 react-native 时可以更好地处理很多事情,阴影就是其中之一。 请注意elevation——就像它在文档中所说的那样,它“影响重叠视图的 z 顺序”——它基本上就像一个 zIndex 你不能覆盖并且可以导致真正令人困惑的行为。例如,在带有粘性部分标题的 SectionList 中,如果您将 elevation: 3 放在列表中的项目上,它们会突然开始越过标题,将它们隐藏起来(当然仅在 Android 上) .这几乎是不可能调试的!【参考方案3】:

除非为元素指定了backgroundColor,否则Android 上的elevation 样式属性不起作用。

Android - elevation style property does not work without backgroundColor

例子:


  shadowColor: 'black',
  shadowOpacity: 0.26,
  shadowOffset:  width: 0, height: 2,
  shadowRadius: 10,
  elevation: 3,
  backgroundColor: 'white'

【讨论】:

这真的需要更多的赞成票,我不知道为什么它不起作用 这就是我要找的。该解决方案适用于 Android 和 iOS,无需安装第三方库。 这是我遗漏的关键点......这需要更多的支持 这就是解决方案!!!背景颜色使它起作用!!!!谢谢^_^ 接受的答案应该是这个。【参考方案4】:

你可以试试

//ios    
shadowOpacity: 0.3,
shadowRadius: 3,
shadowOffset: 
    height: 0,
    width: 0
,
//android
elevation: 1

【讨论】:

Elevation 没有为 android 创建足够大或可配置的阴影 - react-native-shadow 似乎是最好的选择【参考方案5】:

以下内容将帮助您为每个 Platform 提供所需的样式:

import  Text, View, Platform  from 'react-native';

......
<View style=styles.viewClass></View>
......


const styles = 
viewClass: 
    justifyContent: 'center',
    alignItems: 'center',
    height: 60,
    ...Platform.select(
        ios: 
            shadowColor: '#000',
            shadowOffset:  width: 0, height: 2 ,
            shadowOpacity: 0.2,
        ,
        android: 
            elevation: 1

        ,
      ),

;

【讨论】:

不需要指定平台,因为iOS中的海拔属性将被忽略 @cody 是的,你是对的!但我的示例展示了如何为不同平台设置样式。【参考方案6】:

对于安卓屏幕,您可以使用此属性elevation

例如:

 HeaderView:
    backgroundColor:'#F8F8F8',
    justifyContent:'center',
    alignItems:'center',
    height:60,
    paddingTop:15,

    //Its for IOS
    shadowColor: '#000',
    shadowOffset:  width: 0, height: 2 ,
    shadowOpacity: 0.2,

    // its for android 
    elevation: 5,
    position:'relative',

,

【讨论】:

它可以工作,但在 Android 中,我如何更改阴影颜色?【参考方案7】:

只需使用 'elevation' 属性在 android 中获取阴影。像下面的东西

const Header = () => 
    // const  textStyle, viewStyle  = styles;
    return (
      <View style=styles.viewStyle>    
        <Text style=styles.textStyle>Albums</Text>
      </View>
    )



const styles = 
    viewStyle:
        backgroundColor:'#f8f8f8',
        justifyContext:'center',
        alignItems: 'center',
        padding:16,
        elevation: 2
    

【讨论】:

【参考方案8】:

我添加了 borderBottomWidth: 0,它在 android 中对我来说效果很好。

【讨论】:

【参考方案9】:

你可以使用我的react-native-simple-shadow-view

这可以在 Android 中实现与 iOS 中几乎相同的阴影 无需使用高程,使用与 iOS 相同的阴影参数(shadowColor、shadowOpacity、shadowRadius、偏移等),因此您无需编写特定于平台的阴影样式 可用于半透明视图 在 android 18 及更高版本中受支持

【讨论】:

可以用它替换Animated.View吗? 尝试:const AnimatedShadowView = Animated.createAnimatedComponent(ShadowView)。它应该工作【参考方案10】:

另外我想补充一点,如果尝试在子元素具有边框半径的 TouchableHighlight 组件中应用阴影,则父元素 (TouchableHighlight) 也需要设置半径,以便在 Android 上使用高程道具。

【讨论】:

【参考方案11】:

我已经为 react-native 实现了 CardView,它支持 android(所有版本)和 iOS。让我知道它是否对您有帮助。 https://github.com/Kishanjvaghela/react-native-cardview

import CardView from 'react-native-cardview'
<CardView
          cardElevation=2
          cardMaxElevation=2
          cornerRadius=5>
          <Text>
              Elevation 0
          </Text>
</CardView>

【讨论】:

【参考方案12】:

简而言之,你不能在 android 中这样做,因为如果你只看到关于 shadow 的文档 Support IOS see doc

您可以安装 3rd 方react-native-shadow 的最佳选择

【讨论】:

【参考方案13】:

为圆生成阴影,react native,android

根据此处的答案以及我在 github (react-native-shadow) 中找到的文本,我做了一些测试,并认为以下内容可能会对某些人有所帮助。

测试位于圆形按钮上 环境:Windows 10 PC,react-native 使用 react-native-shadow(对圆形效果不好)和 react-native 的高程参数(https://facebook.github.io/react-native/docs/view-style-props#elevation)不同的值,在安卓模拟器上运行(genymotion)

这是屏幕的样子:

代码:

import React,  Component  from 'react';
import  View, TouchableHighlight, Text  from 'react-native';
import  BoxShadow  from 'react-native-shadow'

export default class ShadowsTest extends Component 

  render() 
    const shadowOpt = 
      width: 100,
      height: 100,
      color: "#000",
      border: 2,
      radius: 50,
      opacity: 0.8,
      x: 3,
      y: 3,
      //style:  marginVertical: 5 
    

    return (
      <View style= flex: 1 >
        <Header
          text="Shadows Test" />

        <View style= flexDirection: 'row', justifyContent: 'center' >
          <View style= margin: 10, alignItems: 'center',
              justifyContent: 'center' >
            <TouchableHighlight style=
              position: 'relative',
              width: 100,
              height: 100,
              backgroundColor: "#fff",
              borderRadius: 50,
              borderWidth: 0.8,
              borderColor: '#000',
              // marginVertical:5,
              alignItems: 'center',
              justifyContent: 'center',
              overflow: "hidden" >
              <Text style= textAlign: 'center' >
                0: plain border
              </Text>
            </TouchableHighlight>
          </View>

          <View style= margin: 10, alignItems: 'center',
              justifyContent: 'center' >
            <BoxShadow setting= shadowOpt >
              <TouchableHighlight style=
                position: 'relative',
                width: 100,
                height: 100,
                backgroundColor: "#fff",
                borderRadius: 50,
                borderWidth: 1,
                borderColor: '#aaa',
                // marginVertical:5,
                alignItems: 'center',
                justifyContent: 'center',
                overflow: "hidden" >
                <Text style= textAlign: 'center' >
                  1: RN shadow package
                </Text>
              </TouchableHighlight>
            </BoxShadow>
          </View>
        </View>

        <View style= flexDirection: 'row', justifyContent: 'center' >
          <View style= margin: 10, alignItems: 'center',
              justifyContent: 'center' >
              <TouchableHighlight style=
                position: 'relative',
                width: 100,
                height: 100,
                backgroundColor: "#fff",
                borderRadius: 50,
                borderWidth: 1,
                borderColor: '#aaa',
                // marginVertical:5,
                alignItems: 'center',
                justifyContent: 'center',
                overflow: "hidden",
                shadowOffset:  width: 15, height: 15 ,
                shadowColor: "black",
                shadowOpacity: 0.9,
                shadowRadius: 10,
               >
                <Text style= textAlign: 'center' >
                  2: vanilla RN: shadow (may work on iOS)
                </Text>
              </TouchableHighlight>
          </View>
          <View style= margin: 10, alignItems: 'center',
              justifyContent: 'center' >
              <TouchableHighlight style=
                position: 'relative',
                width: 100,
                height: 100,
                backgroundColor: "#fff",
                borderRadius: 50,
                borderWidth: 1,
                borderColor: '#aaa',
                // marginVertical:5,
                alignItems: 'center',
                justifyContent: 'center',
                overflow: "hidden",
                elevation: 15,
               >
                <Text style= textAlign: 'center' >
                  3: vanilla RN: elevation only (15)
                </Text>
              </TouchableHighlight>
          </View>
        </View>

        <View style= flexDirection: 'row', justifyContent: 'center', marginBottom: 30 >
          <View style= margin: 10, alignItems: 'center',
              justifyContent: 'center' >
              <TouchableHighlight style=
                position: 'relative',
                width: 100,
                height: 100,
                backgroundColor: "#fff",
                borderRadius: 50,
                borderWidth: 1,
                borderColor: '#aaa',
                // marginVertical:5,
                alignItems: 'center',
                justifyContent: 'center',
                overflow: "hidden",
                elevation: 5,
               >
                <Text style= textAlign: 'center' >
                  4: vanilla RN: elevation only (5)
                </Text>
              </TouchableHighlight>
          </View>
          <View style= margin: 10, alignItems: 'center',
              justifyContent: 'center' >
              <TouchableHighlight style=
                position: 'relative',
                width: 100,
                height: 100,
                backgroundColor: "#fff",
                borderRadius: 50,
                borderWidth: 1,
                borderColor: '#aaa',
                // marginVertical:5,
                alignItems: 'center',
                justifyContent: 'center',
                overflow: "hidden",
                elevation: 50,
               >
                <Text style= textAlign: 'center' >
                  5: vanilla RN: elevation only (50)
                </Text>
              </TouchableHighlight>
          </View>
        </View>
      </View>
    )
  

【讨论】:

【参考方案14】:

由于某种原因,它只适用于我添加borderColor: 'transparent'(或任何其他颜色)。我的样式输出如下所示:


        borderColor: "transparent", // Required to show shadows on Android for some reason !?!?
        shadowColor: '#000',
        shadowOffset: 
          width: 0,
          height: 0,
        ,
        shadowOpacity: 0.3,
        shadowRadius: 5,

        elevation: 15,
      

【讨论】:

【参考方案15】:

elevation 在 Expo v30 && React-native v0.55.4 中仍然没有工作。 我在这里尝试了所有答案。

另外,不要尝试 react-native-shadow - 他们的阴影渲染很糟糕。 所以,我正在继续研究。

【讨论】:

谢谢。我想知道为什么海拔对世博会不起作用。我的是 SDK 32 :)【参考方案16】:

设置elevation: 3,您应该会在没有第 3 方库的情况下看到组件底部的阴影。至少在 RN 0.57.4

【讨论】:

【参考方案17】:

我遇到了同样的问题阴影/海拔没有显示在 Android 上,海拔:2。然后我注意到视图元素是傻瓜宽度,所以我在视图元素中添加了 margin:2 并正确显示了高度。

风格:

    margin: 2,
    shadowColor: '#000',
    shadowOffset: 
      width: 0,
      height: 1
    ,
    shadowOpacity: 0.2,
    shadowRadius: 1.41,
    elevation: 2

安卓:

iOS:

【讨论】:

以上是关于如何在 React Native for android 中设置阴影?的主要内容,如果未能解决你的问题,请参考以下文章

在React native 如何写if判断和for循环

如何在 React Native for android 中设置阴影?

如何在 React Native 中的循环中查找

如何在 react-native for android 中更改应用程序图标背景颜色

如何在“GraphQL for react-native”中链接模式(客户端和服务器)

我们如何在 React Native for iOS 中调整 RCTRootView 的大小/开始?