如何使用 3 个文本执行此日历循环滑动滚动

Posted

技术标签:

【中文标题】如何使用 3 个文本执行此日历循环滑动滚动【英文标题】:How to do this calendar circular swipe scroll with 3 texts 【发布时间】:2022-01-07 05:14:39 【问题描述】:

这是我的模型。

我想要这个动画:

当我向左滑动时,三月占据中心位置,四月取代右侧的三月 当我向右滑动时,1 月份位于中心位置,12 月份取代左侧的 1 月份

我真的不知道从哪里开始,也不知道如何实现。

图片中使用的代码,这里是:

import React from 'react';
import View, StyleSheet, Text, TouchableOpacity from 'react-native';

const MonthSlider = () => 
  return (
    <View
      style=
        flexDirection: 'row',
        flex: 0.2,
        paddingBottom: 100,
      >
      <View
        style=
          flexDirection: 'column',
          flex: 0.25,
          alignItems: 'center',
          marginTop: 10,
        >
        <TouchableOpacity
          style=alignItems: 'center'
          onPress=() => alert('January clicked')>
          <View style=styles.nonActiveCircle />
          <Text style=styles.nonActiveMonth>January</Text>
        </TouchableOpacity>
      </View>
      <View
        style=
          flexDirection: 'column',
          flex: 0.5,
          alignItems: 'center',
          marginTop: 10,
        >
        <View style=styles.activeCircle />
        <Text style=styles.year>2021</Text>
        <Text style=styles.activeMonth>February</Text>
      </View>
      <View
        style=
          flexDirection: 'column',
          flex: 0.25,
          marginTop: 10,
          alignItems: 'center',
        >
        <TouchableOpacity
          style=alignItems: 'center'
          onPress=() => alert('March clicked')>
          <View style=styles.nonActiveCircle />
          <Text style=styles.nonActiveMonth>March</Text>
        </TouchableOpacity>
      </View>
    </View>
  );
;

const styles = StyleSheet.create(
  nonActiveMonth: 
    fontSize: 20,
    color: '#8BA8C3',
    fontWeight: 'bold',
  ,
  activeMonth: 
    fontSize: 30,
    color: 'white',
    fontWeight: 'bold',
  ,
  nonActiveCircle: 
    width: 8,
    height: 8,
    borderRadius: 8 / 2,
    backgroundColor: '#8BA8C3',
    marginTop: 10,
  ,
  activeCircle: 
    width: 25,
    height: 25,
    borderRadius: 25 / 2,
    backgroundColor: 'white',
    borderWidth: 5,
    borderColor: '#175287',
    bottom: 20,
    marginBottom: -20,
  ,
  year: 
    fontSize: 20,
    color: '#8BA8C3',
  ,
);

export default MonthSlider;

【问题讨论】:

【参考方案1】:

也许一个好的开始是使用'react-view-slider'或'ScrollView'并做这样的事情:

import React,  useState  from 'react';
import View, StyleSheet, Text, TouchableOpacity from 'react-native';
import Swiper from 'react-native-swiper';

const MonthSlider = () => 

  // Months
  const months = ["January","February","March","April","May","June","July","August","September","October","November","December"];

  // State iMonths
  const [ iMonth, setIMonth ] = useState(1);

  // Month click
  const MonthClick = (i) => 
    alert( months[i] +' clicked')
    setIMonth(i);
  ;

  // This function renders the view at the given index.
  const renderView = ( index, active ) => (
    months.map( (month,i) =>
      <View key=i style=styles.month + ( active == i ) ? styles.active : styles.inactive >
        <TouchableOpacity 
          style=styles.bt
          onPress=() => MonthClick(i)
        >
            <View style= active == i ? styles.activeCircle : styles.nonActiveCircle  />
            <Text style= active == i ? styles.activeMonth : styles.nonActiveMonth >month</Text>
        </TouchableOpacity>
      </View>
    )
  );

  return (
    <Swiper style=styles.monthWrapper showsButtons=false horizontal=true showsPagination=false>
      renderView(0,0)
    </Swiper>
  );
;

const styles = StyleSheet.create(
       
  /* New styles */
  monthWrapper:
    flex:0.5,
    display:'flex',
    flexDirection: 'row',
    height:'100px',
    textAlign:'center',
  ,
  bt:
    textAlign:"center"
  ,
  month:
    alignItems: 'center',
    backgroundColor: '#9DD6EB'        
  ,
  active:
    color:'#000',
    flex: 0.5,
    opacity:1,
    fontSize: 30,
    color: 'white',
    fontWeight: 'bold',      
  ,
  inactive: 
    fontSize: 20,
    color: '#8BA8C3',
    fontWeight: 'bold',
  ,
  
  /* Old styles */
  nonActiveMonth: 
    fontSize: 20,
    color: '#8BA8C3',
    fontWeight: 'bold',
  ,
  activeMonth: 
    fontSize: 30,
    color: 'white',
    fontWeight: 'bold',
  ,
  nonActiveCircle: 
    width: 12,
    height: 12,
    borderRadius: '100%',
    backgroundColor: '#8BA8C3',
    marginTop: 10,
    alignSelf:'center'
  ,
  activeCircle: 
    width: 40,
    height: 40,
    borderRadius: '100%',
    backgroundColor: 'white',
    borderWidth: 5,
    borderColor: '#175287',
    bottom: 20,
    marginBottom: -20,
  ,
);

export default MonthSlider;

【讨论】:

感谢您的回答,但我正在使用 react native,我无法安装此 react 插件当我在我的 react native 项目上运行您的代码时它不起作用 哦@ShinichiKudo 我的错。我认为这是一个反应库。让我等一下,我会在这里测试一些东西。 我的朋友我改变了导入和一点点代码。也许这种方式可以帮助你作为一个开始。 非常感谢,我会用你的答案,谢谢你的时间 没问题。我很乐意为您提供一点帮助。干杯!

以上是关于如何使用 3 个文本执行此日历循环滑动滚动的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIView 中设置滚动视图以向上滑动被键盘隐藏的文本字段?

android日历控件

ViewPager自动滚动

如何防止垂直滚动并通过一个滑动手势触发水平

如何编辑此循环?

使用 UIScrollView 循环浏览图像