[React Native学习]之 UI布局

2017-05-27  本文已影响0人  rockman_

flex布局

View组件的回调函数

onPressStart,onPressMove,onPressEnd三个函数分别代表开始触摸事件、触摸点移动事件和触摸结束事件。这三个回调函数都会收到一个event对象参数。基本结构为;

{
    timeStamp:aNumber,
    nativeEvent:{
        locationX:aNumber,
        locationY:aNumber,
}
}
export default class Project19 extends Component {

  _onTouchMove(event){
    console.log("touch move:" + event.timeStamp + ',X') 
        + event.nativeEvent.locationX + ',Y' + event.nativeEvent.locationY;
  }
  _onTouchStart(event){
    console.log("touch start:" + event.timeStamp + ',X') 
        + event.nativeEvent.locationX + ',Y' + event.nativeEvent.locationY;
  }
  _onTouchEnd(event){
    console.log("touch end:" + event.timeStamp + ',X') 
        + event.nativeEvent.locationX + ',Y' + event.nativeEvent.locationY;
  }

  render() {
    return (
      <View style={styles.container}
        onTouchStart={this._onTouchStart}
        onTouchMove={this._onTouchMove}
        onTouchEnd={this._onTouchEnd}>
      </View>
    );
  }
  }

有个特殊的特性:就是在React Native开发中,通常是在最上层的组件中处理触摸事件的;但这三个回调函数总能收到事件,而不管用户当前触摸区域是空白的,还是有其他组件已经处理了触摸事件。

PinterEvents属性

pointerEvents是字符串类型的属性,它可以取值为none、box-none、box-only、auto

  1. none 发生在本组件与本组件的子组件上的触摸事件都会交给本组件的父组件处理.
  2. box-none 发生在本组件显示范围内,但不是子组件显示范围内的事件交给本组件,在子组件显示范围内交给子组件处理
  3. box-only 发生在本组件显示范围内的触摸事件将全部由本组件处理,即使触摸事件发生在本组件的子组件显示范围内
  4. auto 视组件的不同而不同,并不是所有的子组件都支持box-none和box-only两个值,
export default class Project19 extends Component {
  constructor(props){
      super(props);
      this.state = {
        bigButtonPointerEvents:null,
      };

      this.onBigButtonPressed = this.onBigButtonPressed.bind(this);
      this.onSmallButtonPressed = this.onSmallButtonPressed.bind(this);
  }

  onBigButtonPressed(){
    console.log('Big button pressed');
  }

  onSmallButtonPressed(){
    if (this.state.bigButtonPointerEvents === null) {
        console.log('big button will not responde');
        this.setState({bigButtonPointerEvents:'none'});
        return;
    }
    console.log('big button will responde');
        this.setState({bigButtonPointerEvents: 'box-none'});//改变状态机变量
  }

  render(){
    return(
        <View style={styles.container}>
           <Text style={styles.sButtonStyle}
            onPress={this.onSmallButtonPressed}>
            Sma Button
           </Text>
           <Text style={styles.bButtonStyle}
              onPress={this.onBigButtonPressed}
              pointerEvents={this.state.bigButtonPointEvents}>
              Big button         
             </Text>
        </View>
      );
  }
    
}

Image组件

class AwesomeProject extends Component {
    render() {
        return (
            //根View
            <View style={styles.container}>
                <Image style={styles.imageStyle}
                       source={require('./image/big_star.png')}/>
            </View>
        );
    }
}

在ReactNative开发中,不允许使用字符串变量来指定需要预先加载的图片名称。因为React native在编译代码是处理所有的require声明,还不是在动态的处理,所以不能动态加载图片资源。

  1. cover模式只求在显示比例不失真的情况下填充整个显示区域。可以对图片进行放大或者缩小,超出显示区域的部分不显示, 也就是说,图片可能部分会显示不了。
  2. contain模式是要求显示整张图片, 可以对它进行等比缩小, 图片会显示完整,可能会露出Image控件的底色。 如果图片宽高都小于控件宽高,则不会对图片进行放大。
  3. stretch模式不考虑保持图片原来的宽,高比.填充整个Image定义的显示区域,这种模式显示的图片可能会畸形和失真。
  4. center模式, 9月11号的0.33版本才支持,contain模式基础上支持等比放大。

可触摸组件

export default class Project19 extends Component {
  
  render(){
    return(
        <View style={{flex: 1, backroundColor:'white'}}>
          <TouchableHighlight>
            <View style={{width:120, height:70, backgroundColor:'grey'}}/>
          </TouchableHighlight>
        </View>
      );
  }
    
}
  1. onPress 点击事件回调函数
  2. onLongPress 长按事件
  3. delayLongPress 设置长按事件的时长是多少毫 米 默认是500ms
  4. delayPressOut 设置离开屏幕多少毫秒后
  5. onPressOut事件被激活, 默认是0
  6. delayPressIn 设置手指触摸屏幕多少毫米厚,
  7. onPressIn事件被激活,默认是0

随笔

justifyContent:在弹性盒对象的 <div> 元素中的各项周围留有空白

上一篇 下一篇

猜你喜欢

热点阅读