React Native 通告消息竖向轮播组件的封装

本文实例为大家分享了React Native通告消息竖向轮播组件的封装代码,供大家参考,具体内容如下

export default class ScrollVertical extends Component {
static defaultProps = {
enableAnimation: true,};

constructor(props) {
super(props)
let translateValue= new Animated.ValueXY({x: 0,y: 0})
translateValue.addListener(({x,y})=>{
// Log('value',x,y)
})
this.state = {
translateValue: translateValue,// 滚屏高度
scrollHeight: this.props.scrollHeight || 32,// 滚屏内容
kb_content: [],// Animated.View 滚动到的 y轴坐标
kb_tempValue: 0,// 最大偏移量
kb_contentOffsetY: 0,// 每一次滚动切换之前延迟的时间
delay: this.props.delay || 500,// 每一次滚动切换的持续时间
duration: this.props.duration || 500,enableAnimation: true,}
}

render() {
return (
<View style={[styles.kbContainer,{height: this.state.scrollHeight},this.props.kbContainer]}>
{
this.state.kb_content.length !== 0 ?
<Animated.View
style={[
{flexDirection: 'column'},{
transform: [
{translateY: this.state.translateValue.y}
]
}
]}>
{this.state.kb_content.map(this._createKbItem.bind(this))}

: null } ) }

componentWillReceiveProps(nextProps) {
Log('componentWillReceiveProps',nextProps)
this.setState({
enableAnimation: nextProps.enableAnimation?true:false
},() => {
this.startAnimation();
}
)
}

componentDidMount() {
Log('componentDidMount')
let content = this.props.data || []
if (content.length !== 0) {
let h = (content.length + 1) * this.state.scrollHeight
this.setState({
kb_content: content.concat(content[0]),kb_contentOffsetY: h
})

  // 开始动画
  // this._startAnimation()
  this.startAnimation();
}

}

_createKbItem(kbItem,index) {
return (
<View key={index}
style={[{justifyContent: 'center',height: this.state.scrollHeight},this.props.scrollStyle]}>

{kbItem.content} ) }

startAnimation = () => {
if (this.state.enableAnimation) {
if(!this.animation){
this.animation = setTimeout(() => {
this.animation=null;
this._startAnimation();
},this.state.delay);
}

}

}

componentWillUnmount() {
if (this.animation) {
clearTimeout(this.animation);
}
if(this.state.translateValue){
this.state.translateValue.removeAllListeners();
}
}

_startAnimation = () => {
this.state.kb_tempValue -= this.state.scrollHeight;
if (this.props.onChange) {
let index = Math.abs(this.state.kb_tempValue) / (this.state.scrollHeight);
this.props.onChange(index<this.state.kb_content.length-1?index:0);
}
Animated.sequence([

  // Animated.delay(this.state.delay),Animated.timing(
    this.state.translateValue,{
      isInteraction: false,toValue: {x: 0,y: this.state.kb_tempValue},duration: this.state.duration,// 动画持续的时间(单位是毫秒),默认为500
      easing: Easing.linear
    }
  ),])
  .start(() => {
    // 无缝切换
    // Log('end')
    if (this.state.kb_tempValue - this.state.scrollHeight === -this.state.kb_contentOffsetY) {
      // 快速拉回到初始状态
      this.state.translateValue.setValue({x: 0,y: 0});
      this.state.kb_tempValue = 0;
    }
    this.startAnimation();



  })

}
}

const styles = StyleSheet.create({
kbContainer: {
// 必须要有一个背景或者一个border,否则本身高度将不起作用
backgroundColor: 'transparent',overflow: 'hidden'
},kb_text_c: {
fontSize: 18,color: '#181818',}

使用

import ScrollVertical from '../../app-widget/scroll-vertical'

const dataArray = [
{
title: '降价了',},{
title: '全场五折',{
title: '打到骨折',}
]
export default class extends React.Component {

render() {
let array = [{ content: '' }];
if (dataArray && dataArray.length > 0) {
array = [];
for (let item of dataArray) {
array.push({ content: item.title});
}
}
return (
<View style={{ padding: Constant.sizeMarginDefault,paddingBottom: 0,backgroundColor: '#FFFFFF' }}>
<TouchableOpacity onPress={() => {
if (dataArray && dataArray.length > 0) {
Log(dataArray[this.index].title)
}
}} style={{ flexDirection: 'row',backgroundColor: "#FFFFFF",alignItems: 'center',borderRadius: 8,paddingLeft: 5,paddingRight: 5 }}>
<Text style={{ fontSize: Constant.scaleFontSize(14) }} fontWeight={'bold'}>公告
<View style={{ marginLeft: 5,marginRight: 8,backgroundColor: '#b01638',width: 22,}}>
<Text style={{ color: 'white',fontSize: Constant.fontSizeSmall }}>新

{ this.index = index; })} enableAnimation={true} data={array} delay={2500} duration={1000} scrollHeight={34} scrollStyle={{ alignItems: 'flex-start' }} textStyle={{ color: Constant.colorTxtContent,fontSize: Constant.fontSizeSmall }} /> 查看 );

}
};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)