react native 如下简称RN。javascript
RN的mask绘制,主要是何时出发mask层的绘制。java
好比,被某一个state改变触发了。触发后按照RN的渲染规则,应当是从新render,从新render时什么mask层若是要全屏遮罩,那么应该放到render渲染的最后一处渲染,也就是绝对定位后,从左上0绘制一个透明的view覆盖当前屏幕的宽高。react
实现的一个例子,点击按钮触发mask,点击mask再取消。react-native
这个例子虽然很简单,可是能够用来熟悉RN的界面渲染机制,都是经过state来控制的。这也是符合RN风格的一种渲染机制,我的认为setNativeProps不是一个好的方法,官方也明确说明在setState + shouldComponentUpdate 确实没法达到性能要求,那能够尝试使用setNativeProps。性能
如下是上面那个例子的所有代码:flex
import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, TouchableHighlight, TouchableWithoutFeedback, View } from 'react-native'; const Dimensions = require('Dimensions'); global.screenWidth = Dimensions.get('window').width; global.screenHeight = Dimensions.get('window').height; export default class rnPicker extends Component { constructor(props) { super(props); this.state = { showMask: false }; } render() { let maskView = this._renderMask(); return ( <View style={{flex:1,justifyContent:'center',alignItems:'center'}}> <TouchableHighlight style={{borderWidth:1,borderColor:'#444444',borderRadius: 4,padding:4,backgroundColor:'#2aa6f9'}} underlayColor={'#f8f8f8'} onPress={this._changeMask.bind(this)}> <Text style={{color:'#ffffff'}}>Show Mask</Text> </TouchableHighlight> {maskView} </View> ); } _changeMask() { this.setState({ 'showMask': !this.state.showMask }) } _renderMask() { if (this.state.showMask) { return ( <View style={{position:'absolute',top:0,left:0,width:global.screenWidth,height:global.screenHeight,backgroundColor:'#000000',opacity:.45}}> <Text style={{width:global.screenWidth,height:global.screenHeight}} onPress={this._changeMask.bind(this)}></Text> </View> ); } else { return null; } } }
有空的时候再详细补充一下博客,最终作成一个picker的组件ui