Я хотел бы сделать часть Touchable
traslucid, то есть, чтобы иметь возможность видеть фон за ним.
Возможно, взломать MaskedView
и снова нарисовать мой фон внутри Touchable
в качестве children
реквизита MaskedView
. Однако это работает только для ограниченного числа сценариев. Вот это работает:
Однако, как только я добавляю некоторые поля, например, вещи выходят из фазы:
Пара разъяснений, на всякий случай:
- Мое настоящее намерение - использовать градиент, который идет между противоположными углами экрана. В этом случае все не работает даже в простом сценарии, который я представил.
- Я знаю, почему этот хак не работает, но я не смог придумать что-нибудь лучше
Вот MWE, использующий вид вместо изображения, так что мне не нужно связывать файл png
:
import React from 'react';
import {
View,
TouchableOpacity,
} from 'react-native';
import MaskedView from '@react-native-community/masked-view';
import LinearGradient from 'react-native-linear-gradient';
export default function () {
return (
<LinearGradient start={{x: 0, y: 0}} end={{x: 1, y: 0}}
colors={['red', 'blue', 'green']}
style={
{flex: 1,
alignItems: 'stretch',
justifyContent: 'center'}
}>
<TouchableOpacity>
<View style={
{height: 100,
alignItems: 'stretch',
justifyContent: 'center',
backgroundColor: 'white',
borderRadius: 30,
//marginLeft: 50, // -> if you uncomment this line, the translucid effect is ruined
}
}>
<MaskedView
style={{height: '100%', backgroundColor: 'yellow',
alignItems: 'stretch', justifyContent: 'center',
}}
maskElement={
<View style={{flex: 1, backgroundColor: 'transparent',
alignItems: 'center', justifyContent: 'center',
}}>
<View style={{width: 300, height: '100%', backgroundColor: 'black'}}/>
</View>
}
>
<LinearGradient start={{x: 0, y: 0}} end={{x: 1, y: 0}}
colors={['red', 'blue', 'green']}
style={{height: '100%'}}
/>
</MaskedView>
</View>
</TouchableOpacity>
</LinearGradient>
);
}