RN中的按钮

Touchable系列组件

为了能让视图能够响应用的的点击事件,我们需要借助Touchablexxx组件,来包裹我们的视图。
下面是四个Touchable系列的组件 一一举例

  • TouchableWithoutFeedback:响应用户的点击事件,如果你想在处理点击事件的同时不显示任何视觉反馈,使用它是个不错的选择。
  • TouchableHighlight:在TouchableWithoutFeedback的基础上添加了当按下时背景会变暗的效果。
  • TouchableOpacity:相比TouchableHighlight在按下去会使背景变暗的效果,TouchableOpacity会在用户手指按下时降低按钮的透明度,而不会改变背景的颜色。
  • TouchableNativeFeedback:在Android上还可以使用TouchableNativeFeedback,它会在用户手指按下时形成类似水波纹的视觉效果。注意,此组件只支持Android。
TouchableWithoutFeedback

TouchableWithoutFeedback一个Touchable系列组件中最基本的一个组价,只响应用户的点击事件不会做任何UI上的改变,在使用的过程中需要特别留意。

提示:无论是TouchableWithoutFeedback还是其他三种Touchable组件,都是在根节点都是只支持一个组件,如果你需要多个组件同时相应单击事件,可以用一个View将它们包裹着,它的这种根节点只支持一个组件的特性和ScrollView很类似。也就是TouchableWithoutFeedback之下必须只含有一个子View

export default class TouchableWithoutFeedbackTest extends Component {

    constructor(props){
        super();
        this.state={
            count:0
        }
    }


    render() {
        return(
            <View>
        <TouchableWithoutFeedback
            onPress={()=> {
                this.setState({count: this.state.count+1})
            }}
            onLongPress={()=>{
                Alert.alert('提示','确定要删除吗?',[
                    {text:'取消',onPress:()=>{}, style:'cancel'},
                    {text:'确定',onPress:()=>{}, style:''}
                ])


            }}
            delayLongPress={5000}>  
            <View style={styles.button}>
                <Text style={styles.buttonText}>
                    我是TouchableWithoutFeedback,单击我
                </Text>
            </View>
        </TouchableWithoutFeedback>
        <Text style={styles.text}>您单击了:{this.state.count}次</Text>
            </View>
    )
    }
}
const styles = StyleSheet.create({
    button:{
        borderWidth:1,
    },
    buttonText:{
        fontSize:18
    },
    text:{
        fontSize:25
    }
});

里面是空间的点击事件和长按事件
里面最常用的几个属性

  • onPress(); 点击的时候
  • onLongPress();长按的时候
  • delayLongPress();长按的时间间隔
  • disabled true-禁止再次点击 false-可以点击 这个属性可以达到禁用按钮的效果
  • onPressIn()在开始点击的时候触发的事件
  • onPressOut() 在结束点击的时候触发的事件
  • delayPressIn() 从用户点击按钮到onPressIn 被回调的延时
  • delayPressOut() 从用户点击按钮后到onPressOut()的延时时间
    下面是 disabled的事例
export default class DisabledText extends Component {

    constructor(props){
        super();
        this.state={
            press:false,
            text:'啥也没有'
        }
    }


    render() {
        return (
            <View>
                <TouchableWithoutFeedback
                    onPress={()=>{
                        this.setState({
                            press:true,
                            text:'正在登陆....'
                        })
                         setTimeout(()=>{
                            this.setState({
                                press:false,
                                text:'暂时不能登录....'
                            })
                        },2000)
                    }}
                    disabled={this.state.press}
                >
                    <View>
                        <Text>
                            点几发动机阿卡丽附近
                        </Text>
                    </View>
                </TouchableWithoutFeedback>
                <Text>
                    {this.state.text}
                </Text>
            </View>
        )
    }
}

TouchableHighlight的使用

TouchableHighlight 是Touchable系列组件中比较常用的一个,它是在TouchableWithoutFeedback 的基础上添加了一些UI上的扩展,既当手指按下的时候,该视图的不透明度会降低,同时会看到相应的颜色(视图变暗或者变亮),从TouchableHighlight 的源码中我们可以看出,其实这个颜色就是在TouchableHighlight 的最外层个添加了一个View,通过改变这个View的背景色及透明度来达到这一效果。

  • activeOpacity
    我们可以通过activeOpacity来设置TouchableHighlight 被按下时的不透明度,从TouchableHighlight 的源码中可以看出,它的默认不透明度为0.85,我们可以根据需要进行调节。
  • underlayColor 按下去的颜色 默认状态下为balck黑色。
import React, { Component } from 'react';

import {
    AppRegistry,
    StyleSheet,
    Text,
    View,
    TouchableWithoutFeedback,
    Alert,
    TouchableHighlight
} from 'react-native';

export default class TouchableHighlightTest extends Component {

    constructor(props){
        super();
        this.state={
            count:0
        }
    }


    render() {
        return(
            <View>
                <TouchableHighlight
                    activeOpacity={0.5}
                    underlayColor='green'
                    onHideUnderlay={()=>{
                        this.setState({text:'衬底被隐藏'})
                    }}
                    onShowUnderlay={()=>{
                        this.setState({text:'衬底显示'})
                    }}
                    onPress={()=>{

                    }}
                >
                    <View  >
                        <Text  >
                            TouchableHighlight
                        </Text>
                    </View>
                </TouchableHighlight>
                <Text>{this.state.text}</Text>
            </View>
        )
    }
}
TouchableOpacity的使用

TouchableOpacity也是Touchable系列组件中比较常用的一个,它是在TouchableWithoutFeedback的基础上添加了一些UI上的扩展,但这些扩展相比TouchableHighlight 少了一个额外的颜色变化。它是通过在按下去改变视图的不透明度来表示按钮被点击的。

在扩展属性方面TouchableOpacity相比TouchableHighlight,就少了很多,只有一个activeOpacity,来设置按下去的透明度。

export default class TouchableOpacityTest extends Component {

    constructor(props){
        super();
        this.state={
            count:0,
            text:'d'
        }
    }


    render() {
        return(
            <View>
                <TouchableOpacity
                    activeOpacity={0.5}

                    onPress={()=>{
                        this.setState({
                            text:'点击了'
                        })
                    }}>
                    <View>
                        <Text>
                            TouchableHighlight
                        </Text>
                    </View>
                </TouchableOpacity>
                <Text>{this.state.text}</Text>
            </View>
        )
    }
}
TouchableNativeFeedback

为了支持Android5.0新增的触控反馈,React Native加入了TouchableNativeFeedback 组件,TouchableNativeFeedback 在TouchableWithoutFeedback 所支持的属性的基础上增加了按下去的水波纹效果。我们可以通过background 属性来自定义原生触摸操作反馈的背景。(只支持android)

里面有个属性 是 background
决定在触摸反馈的时候显示什么类型的背景。它接受一个有着type属性和一些基于type属性的额外数据的对象。推荐使用以下的静态方法之一来创建这个对象:

    1. TouchableNativeFeedback.SelectableBackground() - 会创建一个对象,表示安卓主题默认的对于被选中对象的背景。(?android:attr/selectableItemBackground)
    1. TouchableNativeFeedback.SelectableBackgroundBorderless() - 会创建一个对象,表示安卓主题默认的对于被选中的无边框对象的背景。(?android:attr/selectableItemBackgroundBorderless)。只在Android API level 21+适用。
    1. TouchableNativeFeedback.Ripple(color, borderless) - 会创建一个对象,当按钮被按下时产生一个涟漪状的背景,你可以通过color参数来指定颜色,如果参数borderless是true,那么涟漪还会渲染到视图的范围之外。(参见原生的actionbar buttons作为该效果的一个例子)。这个背景类型只在Android API level 21+适用也就是Android5.0或以上设备。
export default class TouchableNativeFeedbackTest extends Component {

    constructor(props){
        super();
        this.state={
            count:0,
            text:'d'
        }
    }


    render() {
        return(
            <View>
                <TouchableNativeFeedback

                    background={TouchableNativeFeedback.SelectableBackgroundBorderless()}>

                    onPress={()=>{
                        this.setState({
                            text:'点击了'
                        })
                    }}>
                    <View>
                        <Text>
                            TouchableHighlig
                        </Text>
                    </View>
                </TouchableNativeFeedback>
                <Text>{this.state.text}</Text>
            </View>
        )
    }
}

参考地址 传送门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,275评论 25 707
  • 尊重版权,未经授权不得转载本文出自:http://www.jianshu.com/u/ca3943a4172a 在...
    CrazyCodeBoy阅读 25,812评论 5 20
  • 人要是找不到倾述的对象,也没有办法倾述自己的烦恼和所有。那可怎么办呢,时间久了,连人都会与社会脱节的吧。我就是这样...
    b4e714bbadbd阅读 171评论 0 0
  • 今天有点背,连续穿坏了两双鞋子。 下班前脚上的一只鞋子脱胶了,几乎使鞋子变成两半。勉强穿着回到...
    心田一瓣阅读 495评论 0 2
  • 功名富贵全不恋,热血回国铸“天眼”。 十载风霜尘与土,踏遍西南选址艰。 一文难倒英雄汉,五岳三山去筹款。 倾其所有...
    任尔风云我自逍阅读 357评论 6 8