编写不易, 希望大家点赞

import React, {PureComponent} from 'react';
import {Animated, Easing, View} from 'react-native'; export default class NoticeScroll extends PureComponent {
constructor(props) {
super(props);
this.state = {
newChildren: this.props.children,
};
this.animation = new Animated.Value();
this.direction = this.props.direction === 'vertical' ? 'height' : 'width';
this.transationValue = this.props.styles[this.direction];
this.key = ;
this.arr = [];
} startAnimation() {
const meter = this.props.meter || ;
Animated.timing(this.animation, {
toValue: -this.transationValue + meter,
duration: this.props.scrolltime || ,
easing: Easing.linear,
useNativeDriver: true,
}).start(() => {
this.animation = new Animated.Value();
this.initPosition();
this.startAnimation();
});
} initPosition() {
this.key++;
if (this.key < ) {
// React.Children.forEach(this.props.children, (child, index) => {
// let props = {
// key: `${this.key}${index}`,
// ...child.props
// };
// this.arr.push(React.cloneElement(child, props));
// });
React.Children.forEach(this.props.children, (child, index) => {
let newProps = {
key: `${this.key}${index}flag`,
...child.props,
};
this.arr.push(React.cloneElement(child, newProps));
});
} this.setState({
newChildren: [...this.arr],
});
} componentDidMount() {
this.initPosition();
this.startAnimation();
} componentWillUnmount() {
this.startAnimation = () => {};
} render() {
const {styles, direction} = this.props;
const {newChildren} = this.state;
return (
<View style={{overflow: 'hidden', height: , justifyContent: 'center'}}>
<Animated.View
style={{
transform: [
direction !== 'vertical'
? {translateX: this.animation}
: {translateY: this.animation},
],
flexDirection: 'row',
}}>
{newChildren}
</Animated.View>
</View>
);
}
}

组件可以在React中直接使用,把Animated.View 改成Animated.div即可

此代码有一个不好的地方,就是只能读取本地的,否则会有延迟

优化代码!!!

import React, { Component } from 'react';
import { View, Animated, Easing, Text, TouchableOpacity, InteractionManager } from 'react-native'; const styles = {
bgContainerStyle : {
flexDirection : 'row',
alignItems : 'center',
justifyContent : 'flex-start',
backgroundColor : '#FFFFFF',
overflow : 'hidden'
},
textMeasuringViewStyle: {
flexDirection : 'row',
opacity : ,
},
textMeasuringTextStyle: {
fontSize : ,
},
textStyle : {
fontSize : ,
color : '#000000',
}
}; export default class ScrollAnnounce extends Component {
constructor(props) {
super(props);
this.state = {
animation : null,
textList : [],
textWidth : ,
viewWidth : ,
start:false
}
} static defaultProps = {
duration : ,
speed : ,
textList : [],
width : ,
height : ,
direction : 'left',
reverse : false,
separator : ,
onTextClick : () => {},
} componentWillMount(){
this.setState({
textList : this.props.textList || [],
})
this.animatedTransformX = new Animated.Value();
} componentDidUpdate(){
let { textWidth, viewWidth } = this.state;
let { duration, speed, width, direction } = this.props;
let mDuration = duration;
if(speed && speed > ){
mDuration = (width + textWidth) / speed * ;
}
if(!this.state.animation && textWidth && viewWidth){
this.animatedTransformX.setValue(direction == 'left' ? width : (direction == 'right' ? -textWidth : width));
this.setState({
animation : Animated.timing(this.animatedTransformX, {
toValue: direction == 'left' ? -textWidth : (direction == 'right' ? width : -textWidth),
duration: mDuration,
useNativeDriver: true,
easing: Easing.linear,
}),
}, () => {
this.state.animation && this.state.animation.start(() => {
this.setState({
animation: null,
});
});
})
} } componentWillReceiveProps(nextProps){
let newText = nextProps.textList || [];
let oldText = this.props.textList || [];
if (newText !== oldText) {
this.state.animation && this.state.animation.stop();
this.setState({
textList : newText,
animation: null,
start:true
});
}
} componentWillUnmount(){
this.state.animation && this.state.animation.stop();
} textOnLayout = (e) => {
let width = e.nativeEvent.layout.width;
let { textList, separator } = this.props;
this.setState({
textWidth : width + ((textList.length - ) * separator),
})
} viewOnLayout = (e) => {
let width = e.nativeEvent.layout.width;
this.setState({
viewWidth : width,
})
} textView(list){
let { textStyle, onTextClick, reverse, separator } = this.props;
let itemView = [];
for(let i = ;i<list.length;i++){
let item = list[i];
if(reverse){
item.value = item.value.split("").reverse().join("");
}
itemView.push(
<TouchableOpacity key = {''+i} activeOpacity = {0.9} onPress = {() => {
onTextClick(item)
}}>
<View style = {{flexDirection : 'row',marginRight : i < list.length - ? separator : }}>
<Text style = {{
...styles.textStyle,
...textStyle
}}
numberOfLines = {}
>{item.value}</Text>
</View>
</TouchableOpacity>
);
}
return(
<Animated.View
style = {{flexDirection : 'row',width : this.state.textWidth,transform: [{ translateX: this.animatedTransformX }]}}
onLayout={(event) => this.viewOnLayout(event)}
>
{itemView}
</Animated.View>
) } textLengthView(list){
let { textStyle } = this.props;
let text = '';
for(let i = ;i<list.length;i++){
text += list[i].value;
}
return(
<View style = {{
...styles.textMeasuringViewStyle,
width : list.length *
}}>
<Text style = {{
...styles.textMeasuringTextStyle,
...textStyle
}}
onLayout={(event) => this.textOnLayout(event)}
numberOfLines = {}
>{text}</Text>
</View>
) } render(){
let { width, height, bgContainerStyle } = this.props;
let { textList,start } = this.state;
return(
<View style = {{
...styles.bgContainerStyle,
width : width,
height : height,
...bgContainerStyle,
}} opacity = {this.state.animation ? : }>
{start&&this.textView(textList) }
{start&&this.textLengthView(textList) }
</View>
) }
}

ScrollAnnounce

<ScrollAnnounce
textList = {noticeList}
speed = {}
width = {Platform.OS==='ios'?autoWidth():autoWidth()}
height = {}
direction = {'left'}
reverse = {false}
bgContainerStyle = {{backgroundColor : '#f8f8f8'}}
textStyle = {{fontSize : ,color : '#D1B793'}}
onTextClick = {(item) => {
this._toDetail(item)
}}
/>

React-native/React 公告滚动组件(原生代码)的更多相关文章

  1. 深入浅出 React Native:使用 JavaScript 构建原生应用

    深入浅出 React Native:使用 JavaScript 构建原生应用 链接:https://zhuanlan.zhihu.com/p/19996445 原文:Introducing React ...

  2. [RN] React Native代码转换成微信小程序代码的转换引擎工具

    React Native代码转换成微信小程序代码的转换引擎工具 https://github.com/areslabs/alita

  3. React Native 项目常用第三方组件汇总

    React Native 项目常用第三方组件汇总 https://www.jianshu.com/p/d9cd9a868764?utm_campaign=maleskine&utm_conte ...

  4. React Navigation & React Native & React Native Navigation

    React Navigation & React Native & React Native Navigation React Navigation https://facebook. ...

  5. React Native:使用 JavaScript 构建原生应用

    [转载] 本篇为联合翻译,译者:寸志,范洪春,kmokidd,姜天意 数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生 ...

  6. React Native知识5-Touchable类组件

    React Native 没有像web那样可以给元素绑定click事件,前面我们已经知道Text组件有onPress事件,为了给其他组件 也绑定点击事件,React Native提供了3个组件来做这件 ...

  7. React Native:使用 JavaScript 构建原生应用 详细剖析

    数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生的 iOS 应用——就在今天,Beta 版的仓库释出了! 基于 Pho ...

  8. Facebook 开源安卓版 React Native,开发者可将相同代码用于网页和 iOS 应用开发

    转自:http://mt.sohu.com/20150915/n421177212.shtml Facebook 创建了React Java 库,这样,Facebook 的工程团队就可以用相同的代码给 ...

  9. React Native 之 定义的组件 (跨文件使用)

    哈哈的~~~今天介绍的是自定义组件 然后去使用这个组件,让这个组件传递这各种文件之间  哈哈  下面开始吧!!!! 我们所要创建的是一个自定义的Button,先创建一个js文件起名为MyButton, ...

随机推荐

  1. RookeyFrame Bug 编号显示 系统自动生成 的问题,有时候依旧会显示text文本框

    编号显示 系统自动生成 的问题,有时候依旧会显示text文本框 1.在线新建model -> 启用编码规则 -> 新建字段Code(主键) 2.跟Code字段 创建编码规则 3.新增菜单 ...

  2. SpringCloud:入门介绍

    1.微服务简介 业界大牛马丁.福勒(Martin Fowler) 这样描述微服务: 论文网址:            https://martinfowler.com/articles/microse ...

  3. Hadoop NameNode 元数据以及查看元数据的方式

    HDFS中NameNode工作机制1.NameNode的主要功能(1)负责客户端请求的响应: (2)负责元数据的管理. 2.元数据管理namenode对数据管理采用了三种存储形式: (1)内存元数据: ...

  4. [WEB安全]伪造IP地址进行爆破的BurpSuite插件:BurpFakeIP

    0x01 简介 一个用于伪造ip地址进行爆破的BurpSuite插件,burpsuite伪造ip可用于突破waf及进行安全规则绕过等场景. 0x02 功能 伪造指定ip 伪造本地ip 伪造随机ip 随 ...

  5. [线段树]洛谷P5278 算术天才⑨与等差数列

    题目描述 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能否形成公差为k ...

  6. SpringMVC返回一个JSON对象到界面

    首先明确,在JavaScript中并没有类型这一说,只有一个类型就是var.我们要做的就是让JavaScript得到我们返回的一个对象让它以某种方式去处理数据. 前端代码 后台代码 @RequestB ...

  7. Pycon 北京2019

  8. Java垃圾回收(java GC)

    一.GC的阶段 对每个对象而言,垃圾回收分为两个阶段:finalization和reclamation. finalization: 指运行这个对象的finalize的方法. reclamation: ...

  9. Kubernetes 下零信任安全架构分析

    点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 杨宁(麟童) 阿 ...

  10. Python classes to extract information from the Linux kernel /proc files.

    python/python-linux-procfs/python-linux-procfs.git - Python classes to extract information from the ...