Реагировать на анимированный значок поворота на 180 градусов на событие - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь повернуть значок на 180 градусов при каждом выполнении события.

Ссылка: Экспо

Найти его в BarCollapsible -> toggleView ()

Я должен сделать это, движение должно быть 180 градусов каждый раз.

Если мне нужно открыть коллапс, движение должно идти снизу вверх.

Если мне нужно свернуть коллапс, движение должно идти сверху вниз влево.

Цвет не должен меняться.

import React, { Component } from 'react';
import {
  StyleSheet,
  Animated,
  View,
  Text,
  TouchableHighlight,
  TouchableNativeFeedback,
  Platform,
  Easing,
} from 'react-native';
import Icon from 'react-native-vector-icons/FontAwesome';
import MaterialIcons from 'react-native-vector-icons/MaterialIcons';
import * as Animatable from 'react-native-animatable';
const AnimatedIcon = Animatable.createAnimatableComponent(Icon);

const RippleColor = (...args) =>
  Platform.Version >= 21 ? TouchableNativeFeedback.Ripple(...args) : null;

/*const Animations = {
  rotate: {
    0: {
      rotate: '0deg',
      color: 'rgba(0,0,0,0.6)',
    },
    1: {
      rotate: '180deg',
      color: 'rgba(255, 87, 34, 0.5)',
    },
  },
};*/

export default class BarCollapsible extends Component {
  constructor(props) {
    super(props);
    this.state = {
      fadeAnim: new Animated.Value(0),
      icon: props.icon,
      onPressed: null,
      title: props.title,
      children: null,
      show: props.showOnStart,
    };
  }

  static defaultProps = {
    showOnStart: false,
    icon: 'angle-right',
    iconOpened: 'minus',
    iconActive: 'plus',
    iconCollapsed: 'plus',
    tintColor: '#ccc',
    iconSize: 15,
  };

  componentWillMount() {
    const { fadeAnim, spinValue } = this.state;
    Animated.parallel([Animated.timing(fadeAnim, { toValue: 1 })]).start(
      () => {}
    );
    /*Animatable.initializeRegistryWithDefinitions({
      rotate: Animations.rotate,
    });*/
  }

  toggleView = () => {
    const { show, iconCollapsed, iconOpened } = this.state;
    this.animatable.rotate(0);
    this.setState({
      show: !show,
      icon: show ? iconCollapsed : iconOpened,
    });
  };

  renderCollapsible = () => {
    const { tintColor, iconSize, children, badgeText } = this.props;
    const { icon, fadeAnim, title, spinValue } = this.state;

    return (
      <View style={{ backgroundColor: '#fff', width: '100%' }}>
        <TouchableNativeFeedback
          onPress={this.toggleView}
          delayPressIn={0}
          delayPressOut={0}
          useForeground={true}
          background={RippleColor('#ccc')}>
          <View style={styles.bar}>
            <MaterialIcons
              name={'videogame-asset'}
              size={25}
              color={'#4CAF50'}
            />
            <Text style={[styles.title]}>{title}</Text>
            <View
              style={{
                //backgroundColor: '#f23521',
                flexDirection: 'row',
                justifyContent: 'flex-end',
                flex: 1,
                marginRight: 5,
              }}>
              {badgeText && (
                <Text
                  style={{
                    color: '#fff',
                    fontSize: 15,
                    backgroundColor: '#1194ff',
                    borderRadius: 4,
                    padding: 5,
                    fontWeight: 'bold',
                    marginRight: 5,
                  }}>
                  {badgeText}
                </Text>
              )}
              <View
                style={{
                  flexDirection: 'row',
                  alignItems: 'center',
                }}>
                <AnimatedIcon
                  ref={ref => {
                    this.animatable = ref;
                  }}
                  name={'chevron-down'}
                  size={iconSize}
                />
              </View>
            </View>
          </View>
        </TouchableNativeFeedback>
        {this.state.show && (
          <Animated.View style={{ opacity: fadeAnim }}>
            {children}
          </Animated.View>
        )}
      </View>
    );
  };

  render() {
    return this.renderCollapsible();
  }
}

const styles = StyleSheet.create({
  bar: {
    flexDirection: 'row',
    alignItems: 'center',
    paddingTop: 15,
    paddingLeft: 15,
    paddingBottom: 15,
    //backgroundColor: "#cccaaa"
  },

  title: {
    color: '#000',
    //marginTop: 16,
    marginLeft: 30,
    //marginBottom: 16,
    fontSize: 13,
    textAlign: 'left',
    fontWeight: 'bold',
  },
});

Где я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...