Как поместить липкий Touchable в горизонтальный ScrollView в React Native?

Я пытаюсь создать простое приложение / игру для изучения и практики React Native. В настоящее время я пытаюсь создать липкий TouchableNativeFeedback, который перемещается вместе с экраном, поскольку я использую ScrollView.

Идея состоит в том, что левая половина экрана перемещает персонажа влево, а правая половина экрана перемещает его вправо. Я хочу, чтобы эти элементы управления были зафиксированы на дисплее и не двигались.

Вот как это начинается

Как поместить липкий Touchable в горизонтальный ScrollView в React Native?

Это после небольшого перемещения scrollView

Как поместить липкий Touchable в горизонтальный ScrollView в React Native?

Сначала я пытался изменить значение style.left при прокрутке, но это не кажется хорошим / стабильным решением.

Вот текущий код:

render() {     
    return (
        <ScrollView 
            //onScroll = {this._onScroll}
            ref = {(scrollView) => { this.scrollView = scrollView; }}
            style = {styles.container}
            horizontal= {true}
            snapToAlignment = {"center"}
        >
            <View style = {styles.wrapperView}>
                    <ImageBackground
                        style = {styles.container}
                        source = {require('../images/second.png')}
                    >

                    <TouchableNativeFeedback onPressIn = {this._onPressButton} onPressOut = {this._onPressButton}>
                        <View style = {
                                {
                                    width: width/2,
                                    height: '100%',
                                    position: 'absolute',
                                    left: this.state.touchableLeft,
                                    backgroundColor: 'red',
                                }
                            }>

                        </View>
                    </TouchableNativeFeedback>

                    ... (code about the character)

                </ImageBackground>
            </View>
       </ScrollView>
    );
  }

и код стилей

const styles = StyleSheet.create({
    container: {
        width: '100%',
        height: '100%',

    },
    wrapperView:{
        width: width*3 + 300,
    },
  });

и просто для справки, это то, что я изначально пробовал:

_onScroll = (event) => {
    this.setState( {
        touchableLeft: this.state.touchableLeft + event.nativeEvent.contentOffset.x
     } )
}

Я просмотрел следующие вопросы и статьи, но не смог найти решение, которое могло бы мне помочь. Обычно люди используют flex, чтобы закрепить свои заголовки над ScrollView, и это невероятно удобно, но в этой ситуации я не уверен, как продолжить. Статьи / вопросы:

Как закрепить заголовок раздела ListView

http://docs.nativebase.io/docs/examples/StickyHeaderExample.html

Липкий компонент внутри scrollview

почему бы вам просто не сделать их абсолютно позиционированными по отношению к экрану, независимо от положения прокрутки или чего-то еще?

John Ruddell 06.04.2018 04:39

Думаю, я понимаю, что вы имеете в виду, и это, вероятно, очень глупо с моей стороны, я попробую это через 2 дня, когда у меня снова будет доступ к своему коду. Я отправлю решение, если смогу исправить

Kemal Tezer Dilsiz 06.04.2018 15:36

Я поместил часть Touchable за пределы ScrollView и попытался установить абсолютное положение, но это просто заставило его исчезнуть из представления

Kemal Tezer Dilsiz 10.04.2018 02:45

Хорошо, попробуйте разместить сенсорные компоненты после компонента прокрутки или до ... это звучит как порядок элементов с точки зрения более высокой иерархии ... Также попробуйте установить более высокий zindex для сенсорных компонентов

John Ruddell 10.04.2018 02:47

Я поместил его в компонент, который включает этот компонент, и он сработал. Итак, теперь он находится в главном компоненте, из которого этот компонент вызывается. Я попытался поставить его перед ScrollView, и это не сработало. Постараюсь написать решение и выложить

Kemal Tezer Dilsiz 10.04.2018 02:59

Сладкий! Рад, что смог вам с этим помочь :)

John Ruddell 10.04.2018 03:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
1 052
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Моя проблема была решена путем вывода TouchableNativeFeedback за пределы класса. Класс в вопросе назывался Background и был отображен в классе с именем App.

  <View style = {styles.container}>
    <Background />
    <TouchableNativeFeedback onPressIn = {this._onPressButton} onPressOut = {this._onPressButton}>
        <View style = {
                {
                    width: '50%',
                    height: '100%',
                    position: 'absolute',
                    left:0,
                    //left: this.state.touchableLeft,
                    //backgroundColor: 'red',

                }
            }>

        </View>
    </TouchableNativeFeedback>
  </View>

Как вы можете видеть, когда я переместил его сюда, он оказался там, где я хотел, даже если я переместил экран. Было бы хорошей практикой перенести его в другой класс компонента, а затем просто вызвать его экземпляр.

Спасибо Джону Радделлу за помощь при поиске решения

Другие вопросы по теме