React Native-Android位置绝对按钮不可应用

时间:2019-06-06 12:31:38

标签: react-native react-native-android

我有一个react native组件,该组件使用WebRTC处理两个对等方之间的通信。

一切都可以在ios上完美运行,但是在android上,按钮是不可单击的,由于位置:绝对,按钮在元素后面的某个位置呈现,并且它们不可应用,因此我可以肯定它的作用。

我的问题是……我在做什么错?为什么要渲染却无法在Android上应用它们?

按钮为:结束通话位于中央底部,切换摄像头位于右侧底部。

PS:我删除了大多数组件逻辑,因为它们与问题无关。

import React, { Component } from 'react';
    import PropTypes from 'prop-types';
    import { RTCView } from 'react-native-webrtc';
    import WebSocketWrapper from '../components/generic/WebSocketWrapper/WebSocketWrapper';
    import { Image, StyleSheet, View, Text, Platform, ActivityIndicator, Dimensions } from 'react-native';
    import RNSecureStorage, { ACCESSIBLE } from 'rn-secure-storage';
    import WebRtcPeer from 'react-native-kurento-utils';
    import { COLORS } from '../styles/colors';
    import { SafeAreaView } from 'react-navigation';
    import axios from 'axios';
    import Toast from 'react-native-root-toast';
    import Icon from 'react-native-vector-icons/MaterialIcons';
    import IconIonicons from 'react-native-vector-icons/Ionicons';
    import { TouchableOpacity } from 'react-native-gesture-handler';
    import logger from '#/logging.service';
    import utils from '#/utils.service';

    const BTN_CIRCLE_SIZE = 60;
    const ICON_CIRCLE_SIZE = BTN_CIRCLE_SIZE / 2;
    const styles = StyleSheet.create({
      rtcViewsContainer: {},
      remoteView: {
        alignSelf: 'center',
        top: 0,
        right: 0,
        bottom: 0,
        left: 0,
        backgroundColor: '#000000'
      },
      selfView: {
        position: 'absolute',
        alignSelf: 'flex-start',
        width: 150,
        height: 150,
        left: 16,
        bottom: 32,
        borderWidth: 0.5
      },
      textContainer: {
        flex: 1,
        padding: 32,
        width: '100%',
        alignItems: 'center',
        justifyContent: 'center'
      },
      introductionText: {
        justifyContent: 'center',
        alignItems: 'center',
        fontSize: 13,
        lineHeight: 22,
        textAlign: 'center'
      },
      logo: {
        alignSelf: 'center',
        height: 70,
        width: 150
      },
      logoContainer: {
        height: 70,
        position: 'absolute',
        top: 0,
        left: 0,
        right: 0,
        justifyContent: 'center',
        alignItems: 'center'
      },
      endCallIconContainer: {
        position: 'absolute',
        zIndex: 100,
        bottom: 32,
        width: BTN_CIRCLE_SIZE,
        justifyContent: 'center',
        alignItems: 'center',
        flexDirection: 'row'
      },
      endCallIconTouchable: {
        width: BTN_CIRCLE_SIZE,
        height: BTN_CIRCLE_SIZE,
        borderRadius: BTN_CIRCLE_SIZE / 2,
        alignSelf: 'center',
        zIndex: 110,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: 'red'
      },
      switchCameraIconTouchable: {
        width: BTN_CIRCLE_SIZE,
        height: BTN_CIRCLE_SIZE,
        borderRadius: BTN_CIRCLE_SIZE / 2,
        alignSelf: 'flex-end',
        zIndex: 110,
        justifyContent: 'center',
        alignItems: 'center'
      },
      switchCameraIcon: {
        width: BTN_CIRCLE_SIZE,
        height: BTN_CIRCLE_SIZE
      },
      endCallIcon: {
        alignSelf: 'center'
      }
    });

    export default class VideoCallIdentification extends Component {
      static navigationOptions = {
        header: null
      };

      displayRTCViews() {
        return !!(this.state.remoteURL && this.state.videoURL);
      }

      getText() {
        if (this.state.CALL_STATE === this.CALL_STATES.FINISHED_CALL) {
          return 'Please wait ...';
        } else if (this.state.REGISTERED_STATE === this.CALL_STATES.REGISTERED) {
          return 'An agent will be with you soon. You will be prompted to give access to your microphone and camera in order for the video call to proceed!';
        }
      }
      componentWillUnmount() {
        this.stopCommunication();
      }
      getRemoveViewDimensions() {
        return {
          width: Dimensions.get('window').width,
          height: Dimensions.get('window').height
        };
      }
      onSocketError(e) {
        logger.log('!!!!!!!!!!!!!!! Socket Erorr!', e);
        utils.toast('An unexpected error has ocurred!');
        this.stopWebRtc();
        this.props.navigation.navigate('CompleteAccountPage');
      }
      getEndCallBarSize() {
        return {
          left: Dimensions.get('window').width / 2 - BTN_CIRCLE_SIZE / 2,
          height: BTN_CIRCLE_SIZE
        };
      }
      getSwitchCameraBarSize() {
        return {
          right: 32,
          height: BTN_CIRCLE_SIZE
        };
      }
      changeCamera() {
        this.webRtcConnection.toggleCamera();
      }
      render() {
        return (
          <View
            style={{ marginTop: 0, paddingLeft: 0, paddingRight: 0, marginBottom: 0, flex: 1, width: '100%', ...this.getRemoveViewDimensions() }}
            containerStyle={{ flex: 1, width: '100%', ...this.getRemoveViewDimensions() }}
          >
            <SafeAreaView style={{ ...this.getRemoveViewDimensions(), position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }}>
              {this.displayRTCViews() ? (
                <View>
                  <View style={{ ...styles.rtcViewsContainer, ...this.getRemoveViewDimensions() }}>
                    <RTCView streamURL={this.state.remoteURL} style={{ ...styles.remoteView, ...this.getRemoveViewDimensions() }} />
                    <RTCView streamURL={this.state.videoURL} style={styles.selfView} />
                  </View>
                  <View style={{ ...styles.endCallIconContainer, ...this.getEndCallBarSize() }}>
                    <TouchableOpacity style={styles.endCallIconTouchable} onPress={() => this.stopCommunication(true).bind(this)}>
                      <Icon style={styles.endCallIcon} size={ICON_CIRCLE_SIZE} name="call-end" color="#ffffff" />
                    </TouchableOpacity>
                  </View>
                  <View style={{ ...styles.endCallIconContainer, ...this.getSwitchCameraBarSize() }}>
                    <TouchableOpacity style={styles.switchCameraIconTouchable} onPress={() => this.changeCamera(true)}>
                      <IconIonicons style={styles.endCallIcon} size={BTN_CIRCLE_SIZE} name="ios-reverse-camera" color="#ffffff" />
                    </TouchableOpacity>
                  </View>
                </View>
              ) : (
                <View style={styles.textContainer}>
                  <View style={styles.logoContainer}>
                    <Image source={require('../assets/images/logoAndNameColored.png')} style={styles.logo} resizeMode="contain" />
                  </View>
                  <Text style={styles.introductionText}>{this.getText()}</Text>
                  <ActivityIndicator style={{ marginTop: 22 }} size="large" color={COLORS.APP_PURPLE} />
                </View>
              )}

              <WebSocketWrapper
                ref={ref => {
                  if (!this.state.socket) {
                    this.setState({ socket: ref });
                  }
                }}
                onError={this.onSocketError.bind(this)}
                onOpen={this.onSocketOpen.bind(this)}
                url={this.state.socketUrl}
                onMessage={this.onmessage.bind(this)}
              />
            </SafeAreaView>
          </View>
        );
      }
    }

    VideoCallIdentification.propTypes = {
      navigation: PropTypes.object
    };

0 个答案:

没有答案