ilink-world/screens/home/IMarker.js

185 lines
5.4 KiB
JavaScript
Raw Normal View History

2019-06-16 13:09:54 +00:00
import React,{Component,PureComponent} from 'react';
import MapView,{Marker,MarkerAnimated,Callout,AnimatedRegion} from "react-native-maps"
import PropTypes from 'prop-types';
import {
StyleSheet,
View,
Image,
Animated,
Easing,
Platform,
Text,
} from 'react-native';
const userposi=require('./../../datas/img/png/user_place.png');
const mnetwork=require('./../../datas/img/png/home_network.png');
const othernetwork=require('./../../datas/img/png/other_net.png');
class IMarker extends PureComponent
{
constructor(props){
super(props)
const data=this.props.data
this.state={
animation:new Animated.Value(0),
subanimation:new Animated.Value(0),
coordinate:{
longitude: parseFloat(data.longitude),
latitude: parseFloat(data.latitude),
}
}
}
componentWillReceiveProps(nextProps) {
const duration = 500
const oldCoord={
longitude: parseFloat(this.props.data.longitude),
latitude: parseFloat(this.props.data.latitude),
}
const coord={
longitude: parseFloat(nextProps.data.longitude),
latitude: parseFloat(nextProps.data.latitude),
}
if (oldCoord.longitude!==coord.longitude || oldCoord.latitude!==coord.latitude) {
if (Platform.OS === 'android') {
if (this.markerRef) {
this.markerRef._component.animateMarkerToCoordinate(
coord,
duration
);
}
} else {
/*this.state.coordinate.timing({
cord,
duration
}).start();
*/}
}
}
startAnimation(){
const initialValue=0
const finalValue=1
this.state.animation.setValue(initialValue); //Step 3
Animated.timing( //Step 4
this.state.animation,
{
toValue: finalValue,
duration:500,
easing: Easing.linear(),
useNativeDriver:true
}
).start();
}
handleViewRef = ref => this.view = ref;
render() {
const {data,network,isSelected}=this.props;
const color=isSelected?"#F48FB1A0":"transparent"
const colorSup=isSelected?"#F06292A0":"transparent"
const display=isSelected?"block":"none";
if(data.longitude && data.latitude){
return (
<Marker.Animated
coordinate={this.state.coordinate.longitude?this.state.coordinate:{longitude:data.longitude,latitude:data.latitude}}
id={data.id}
title={this.props.title}
ref={(re) => {
this.markerRef = re
}}
onPress={e => {
if (!this.props.isUser)
this.props.onPress(data)
}}
image={this.getImage(data)}
/>
);
}
return (<View/>)
}
error(erro){
console.log("on error render image");
console.log(erro);
}
componentDidMount() {
}
componentDidUpdate(prevProps: Readonly<P>, prevState: Readonly<S>, snapshot: SS): void {
if(this.props.isUser)
if(this.markerRef && this.props.isNeedFocus){
this.markerRef._component.showCallout()
}
}
getImage(data) {
const {isUser,network}=this.props;
if(isUser){
return userposi
}else if(network && data.network===network.name){
return mnetwork
}
return othernetwork
}
getIcon(data) {
const {isSelected}=this.props
return isSelected ? (
<Animated.View style={{
width:32,
height:32,
justifyContent:'center',
alignItems:'center',
borderRadius:16,
backgroundColor:isSelected?"#81D4FAA0":"transparent",
transform: [
{
scaleX: this.animatedValue.interpolate({
inputRange: [0, 1],
outputRange: [1, 32]
})
},
{
scaleY: this.animatedValue.interpolate({
inputRange: [0, 1],
outputRange: [1,32]
})
}
]
}}>
<Image style={{alignSelf: 'center'}} source={this.getImage(data)}/>
</Animated.View>
) : (<Image style={{alignSelf: 'center'}} source={this.getImage(data)}/>);
}
startLoopSelectedAnimation() {
const initialValue=0
const finalValue=1
this.state.animation.setValue(initialValue); //Step 3
Animated.loop(Animated.timing( //Step 4
this.state.subanimation,
{
toValue: finalValue,
duration:1000,
easing: Easing.linear(),
useNativeDriver:true
}
),{iteration:-1}).start();
}
}
const styles = StyleSheet.create({
container: {
flex:1,
width:52,
height:52
},
ring:{
}
});
export default IMarker;