在具有颜色的容器内创建一个不透明度为 0 的“洞” - css on react native(QR 扫描仪的布局)

Posted

技术标签:

【中文标题】在具有颜色的容器内创建一个不透明度为 0 的“洞” - css on react native(QR 扫描仪的布局)【英文标题】:Creating a "hole" with 0 opacity inside a container with color - css on react native (Layout for a QR scanner) 【发布时间】:2020-03-19 20:15:40 【问题描述】:

我正在使用 react-native-camera,所以我可以扫描 QR,这很好用。 在相机的顶部,我想要不透明的白色,屏幕中间应该有一个空白方块,表示用户应该扫描中间的 QR。 我正在努力做到这一点,因为当我将白屏布局放在空白方块的顶部时,没有看到空白方块。当我将空白方块放在布局顶部时,因为空白的不透明度为 0,所以看不到它。

如何创建一个屏幕,其中整个屏幕都有颜色但中间有一个“孔”?

为了帮助您准确了解我的需求,这就是我现在所处的位置:

我需要边框内的部分不透明度为 0

【问题讨论】:

白色不是简单的黑色方块?应该随处可见? 什么意思?我仍然需要正方形内部的不透明度为 0 - 只是按原样显示相机。 啊,所以你的意思是里面是透明的? 我相信你需要 SVG。 @Temani Ali 是的 【参考方案1】:

我最终通过使用 SVG 解决了这个问题。这是为碰巧在这里绊倒的人准备的。

我使用 react-native-svg 来为“洞”创建背景和蒙版:

const styles = StyleSheet.create(
container: 
    position: 'absolute',
    width: deviceWidth,
    height: deviceHeight,
,
layout: 
    position: 'absolute',
    width: deviceWidth,
    height: deviceHeight,
    zIndex: 2,
,
camera: 
    position: 'absolute',
    width: deviceWidth,
    height: deviceHeight,
    zIndex: 1,

)

const QrScannerLayout = () => (
<View style=styles.layout>
    <Svg  >
        <Defs>
            <Mask id="mask" x="0" y="0"  >
                <Rect   fill='white' opacity=0.8 />
                <Rect
                    x=(deviceWidth / 2) - (QR_SCAN_SQUARE_SIZE / 2)
                    y=(deviceHeight / 2) - (QR_SCAN_SQUARE_SIZE / 2)
                    rx='50'
                    ry='50'
                    width=QR_SCAN_SQUARE_SIZE
                    height=QR_SCAN_SQUARE_SIZE
                    stroke='white'
                    strokeWidth="5"
                    fill-opacity="0"
                />
            </Mask>
        </Defs>
        <Rect   mask="url(#mask)" fill='white' />
    </Svg>
</View>

);

    render() 
    return (
        <View style=styles.container>
            <QrScannerLayout />
            <RNCamera
                ref=ref => 
                    this.camera = ref;
                
                captureAudio=false
                onBarCodeRead=this.barcodeRecognized
                style=styles.camera
            >
            </RNCamera>
        </View>
    );

【讨论】:

【参考方案2】:

在您选择的居中元素上使用巨大的box-shadow

body 
  display: flex;
  justify-content: center;
  align-items: center;
  background: red;
  height: 100vh;


.box 
  width: 50vw;
  height: 50vh;
  border: 2px solid white;
  border-radius: 5vh;
  box-shadow: 0 0 0 2000px rgba(255, 255, 255, .5)
&lt;div class="box"&gt;&lt;/div&gt;

【讨论】:

不适用于 react-native。没有盒子阴影。有阴影不适用于 android,所以这对我来说不是解决方案。谢谢【参考方案3】:

我找到了答案: 把它放在你的 customMarker 属性中

import Dimensions from "react-native";

let devicewidth=Dimensions.get("window").width
render() 
    return (
        <View>
            <QRCodeScanner 
                showMarker            
                customMarker=
                    <View style=flex:1>
                        <View style=flex:1,backgroundColor:"rgba(0,0,0,0.3)"/>
                        <View style=width:devicewidth,
                            height:devicewidth,
                            borderColor:"rgba(0,0,0,0.3)",
                            borderWidth:devicewidth/6,
                        >
                            <View style=flex:1,borderColor:"red",borderWidth:1/>
                        </View>
                        <View style=flex:1,backgroundColor:"rgba(0,0,0,0.3)"/>
                    </View>
                />
         </View>
     )

那么你可以在borderWidth属性上设置洞的大小(borderwidth:devicewidth/how big you want the hole to be)

【讨论】:

以上是关于在具有颜色的容器内创建一个不透明度为 0 的“洞” - css on react native(QR 扫描仪的布局)的主要内容,如果未能解决你的问题,请参考以下文章

Swift UIView 背景颜色不透明度

CSS 为 div 的背景颜色而不是内容添加不透明度

使用 Ghostscript 更改 PDF 不透明度

使用 ImageMagick 创建的动画 gif 具有故障块颜色背景

寻找具有不透明度的“等效”颜色

使已经绘制的内容透明?