react-native自定義PopupWindow實(shí)現(xiàn)

轉(zhuǎn)載請注明出處:王亟亟的大牛之路

自從泰國回來就忙的不行,各種開會(huì),各種方案猿推,各種報(bào)告跑慕。學(xué)習(xí)進(jìn)度有些受阻,回家時(shí)間也比較晚整個(gè)人的狀態(tài)也不是很高效贴妻,不如好好休息。
今天下午強(qiáng)行擠了2小時(shí)把組里的一個(gè)小組件開源下,勉強(qiáng)算擠出一些產(chǎn)能吧阐斜。

安利地址:
Useful-Open-Source-Android 安卓收納"褲"

Useful-Open-Source-React-Native React-Native收納"褲"

雖然手頭事情比較多,但是我還是盡量保持每日一更诀紊,每天都要有所收獲谒出!


運(yùn)行效果:

實(shí)現(xiàn)思路:

外觀:
三角形的"箭頭"圖形+一個(gè)視圖組

外觀實(shí)現(xiàn):
因?yàn)樵O(shè)計(jì)的原因整個(gè)pop成為了2個(gè)個(gè)體,一個(gè)是三角,一個(gè)就是具體內(nèi)容窗體笤喳。
三角可以使用切圖为居,但是自己用ART.Path()實(shí)現(xiàn)拓展性更好,畢竟不用因?yàn)槌笃潦謾C(jī)去做代碼修改杀狡。
下面一部分就是一個(gè)正常的<View>多個(gè)<TouchableOpacity/></View>
(這里沒用listview來實(shí)現(xiàn)列表蒙畴,各位看官也可以自行修改,修改成本不是很高呜象,畢竟js可以傳方法忍抽,所以點(diǎn)擊行為也可以傳props解決)

事件:
展現(xiàn)/消失由外層容器控制,控件內(nèi)對應(yīng)字段為isVisible: this.props.show


使用與分析:

源碼地址:react-native-popupWindow

團(tuán)隊(duì)開源內(nèi)容地址(我們會(huì)繼續(xù)努力):https://github.com/PacteraOpenSourceGroup

控件產(chǎn)出:wwl901215

ok,流程走完 我們讀一下這個(gè)彈窗控件的源碼(標(biāo)注是我發(fā)文前加的董朝,給新手學(xué)習(xí)理解用鸠项,如果影響高端玩家讀源碼抱歉)

如何使用(第一版,暫不考慮發(fā)布npm)

import MenuPopWindow from '你存放的位置'

實(shí)際使用

<MenuPopWindow width={60} height={100} show={this.state.showPop} closeModal={(show) => { this.setState({ showPop: show }) }} dataArray={['第一!!', '第二!!', '第三!!']} />
import React from 'react'
import {
    StyleSheet,
    View,
    Text,
    Image,
    TouchableOpacity,
    Alert,//彈窗
    Modal,
    Dimensions,//用于獲取設(shè)備屏幕的寬高
    ART,//繪圖,Android默認(rèn)就包含ART庫子姜,IOS需要單獨(dú)添加依賴庫
} from 'react-native'
const { width, height } = Dimensions.get('window');
let mwidth = 70;
let mheight = 100;
const bgColor = '#2d2d2d';//背景色,沒有設(shè)置外部傳入
const top = 50;
let dataArray;//列表數(shù)據(jù)源
export default class MenuModal extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            isVisible: this.props.show,
        }
        //數(shù)據(jù)傳遞
        mwidth = this.props.width || 70;
        mheight = this.props.height || 100;
        dataArray = this.props.dataArray;
    }

    componentWillReceiveProps(nextProps) {
        this.setState({ isVisible: nextProps.show });
    }
    //處理狀態(tài)
    closeModal() {
        this.setState({
            isVisible: false
        });
        this.props.closeModal(false);
    }

    render() {
        //繪制路徑
        const path = ART.Path();
        path.moveTo(width - 10 - mwidth * 1 / 3 + 3, top);
        path.lineTo(width - 10 - mwidth * 1 / 3 + 9, top - 7);
        path.lineTo(width - 10 - mwidth * 1 / 3 + 15, top);
        path.close();
        return (
            <View style={styles.container}>
                <Modal
                    transparent={true}
                    visible={this.state.isVisible}
                    //動(dòng)畫效果類型
                    animationType={'fade'}
                    onRequestClose={() => this.closeModal()}>
                    <TouchableOpacity style={styles.container} activeOpacity={1} onPress={() => this.closeModal()}>
                        <ART.Surface width={width} height={100} >
                            <ART.Shape d={path} fill={bgColor} />
                        </ART.Surface>
                        <View style={styles.modal}>
                            <TouchableOpacity activeOpacity={1} onPress={() => Alert.alert('點(diǎn)擊了第1個(gè)')} style={styles.itemView}>
                                <Image style={styles.imgStyle} source={require('../res/icon_qr.png')} />
                                <Text style={styles.textStyle}>{dataArray[0]}</Text>
                            </TouchableOpacity>
                            <TouchableOpacity activeOpacity={1} onPress={() => Alert.alert('點(diǎn)擊了第2個(gè)')} style={[styles.itemView, { borderColor: '#999', borderTopWidth: 1, borderBottomWidth: 1 }]}>
                                <Image style={styles.imgStyle} source={require('../res/icon_qr.png')} />
                                <Text style={styles.textStyle}>{dataArray[1]}</Text>
                            </TouchableOpacity>
                            <TouchableOpacity activeOpacity={1} onPress={() => Alert.alert('點(diǎn)擊了第3個(gè)')} style={styles.itemView}>
                                <Image style={styles.imgStyle} source={require('../res/icon_qr.png')} />
                                <Text style={styles.textStyle}>{dataArray[2]}</Text>
                            </TouchableOpacity>
                        </View>
                    </TouchableOpacity>
                </Modal>
            </View>
        )
    }
}
//樣式鏈
const styles = StyleSheet.create({
    container: {
        width: width,
        height: height,
    },
    modal: {
        backgroundColor: bgColor,
        // opacity:0.8,
        width: mwidth,
        height: mheight,
        position: 'absolute',
        left: width - mwidth - 10,
        top: top,
        padding: 5,
        justifyContent: 'center',
        alignItems: 'center',
        borderRadius: 3,
    },
    itemView: {
        flexDirection: 'row',
        justifyContent: 'center',
        alignItems: 'center',
        flex: 1,
    },
    textStyle: {
        color: '#fff',
        fontSize: 14,
        marginLeft: 2,
    },
    imgStyle: {
        width: 12,
        height: 12,
    }
});

感謝各位觀眾老爺祟绊!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哥捕,隨后出現(xiàn)的幾起案子牧抽,更是在濱河造成了極大的恐慌,老刑警劉巖遥赚,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扬舒,死亡現(xiàn)場離奇詭異,居然都是意外死亡凫佛,警方通過查閱死者的電腦和手機(jī)讲坎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愧薛,“玉大人晨炕,你說我怎么就攤上這事『谅” “怎么了瓮栗?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞄勾。 經(jīng)常有香客問我费奸,道長,這世上最難降的妖魔是什么进陡? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任愿阐,我火速辦了婚禮,結(jié)果婚禮上四濒,老公的妹妹穿的比我還像新娘换况。我一直安慰自己,他們只是感情好盗蟆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布戈二。 她就那樣靜靜地躺著,像睡著了一般喳资。 火紅的嫁衣襯著肌膚如雪觉吭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天仆邓,我揣著相機(jī)與錄音鲜滩,去河邊找鬼。 笑死节值,一個(gè)胖子當(dāng)著我的面吹牛徙硅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搞疗,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼嗓蘑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匿乃?” 一聲冷哼從身側(cè)響起桩皿,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幢炸,沒想到半個(gè)月后泄隔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宛徊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年佛嬉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闸天。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巷燥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出号枕,到底是詐尸還是另有隱情缰揪,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布葱淳,位于F島的核電站钝腺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赞厕。R本人自食惡果不足惜艳狐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望皿桑。 院中可真熱鬧毫目,春花似錦蔬啡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刮便,卻和暖如春空猜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恨旱。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工辈毯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搜贤。 一個(gè)月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓谆沃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仪芒。 傳聞我的和親對象是個(gè)殘疾皇子管毙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,288評論 25 707
  • React Native優(yōu)秀博客,以及優(yōu)秀的Github庫列表(很多英文資料源自于[awesome-react-n...
    董董董董董董董董董大笨蛋閱讀 10,649評論 4 162
  • 持續(xù)更新中...... 一套企業(yè)級的 UI 設(shè)計(jì)語言和 React 實(shí)現(xiàn)桌硫。 https://mobile.ant....
    日不落000閱讀 5,724評論 0 35
  • 把纏論比作一個(gè)開得巨大無比的花夭咬,把自己比作一只小螞蟻,然后想像自己是只螞蟻 铆隘,爬在一片花瓣上卓舵,在花瓣的紋路間迷失,...
    異朽閣無厘頭閱讀 487評論 0 0
  • 2017.9.14(204—8/99)《焦點(diǎn)分享64》 今年縣統(tǒng)一招聘教師膀钠,我們學(xué)校打報(bào)告要三個(gè)物理老師掏湾,結(jié)...
    方正省閱讀 274評論 1 4