Development Tip

그림자를 어떻게 렌더링합니까?

yourdevel 2021. 1. 9. 10:58
반응형

그림자를 어떻게 렌더링합니까?


뷰에서 그림자를 어떻게 렌더링합니까? 나는 shadowColor, shadowOffset, shadowOpacity 및 shadowRadius의 많은 조합을 시도했지만 아무것도하지 않는 것 같습니다. 내가 설정 한 다른 속성이 작동하기 때문에 스타일이 올바르게 적용되었다고 확신합니다.


이 글은 네이티브 반작용 버그가 나타납니다 shadowOpacity입력 설정 CGFloat대신 float에 따라 의 CALayer의 문서 . 수정하기 전에 iPhone 5 시뮬레이터를 사용하십시오. ( CGFloat이다 float오래된 장치에서.)

이것을 추적하는 React Native 문제는 다음과 같습니다.

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


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에서 테스트되었습니다.

여기에 이미지 설명 입력

편집하다

@ James의 의견. 감사.

참고 : Android 사용자의 경우 backgroundColor가 중요 합니다. View를 다른 요소의 컨테이너로 사용하고 있었는데 배경색을 지정할 때까지 그림자를 얻을 수 없었습니다.


RN Android에서 그림자를 구현하려면 고도를 사용하십시오. 고도 소품 # 27 추가

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


    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


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
        }
       },
   })

  panel: {
    // ios
    backgroundColor: '#03A9F4',
    alignItems: 'center', 
    shadowOffset: {width: 0, height: 13}, 
    shadowOpacity: 0.3,
    shadowRadius: 6,

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

또는 android 용 react-native-shadow사용할 수 있습니다.


여백에 관한 모든 것

이것은 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

스타일 구성 요소 별

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,
  }
})

참조 URL : https://stackoverflow.com/questions/29323544/how-do-i-render-a-shadow

반응형