JackDanielsAndCode / react-native-multi-slider

Pure JS react native slider component with one or two markers.
MIT License
151 stars 95 forks source link

Does this module support Android? #17

Closed oney closed 7 years ago

oney commented 8 years ago

It seems that it doesn't work great in Android.

jrans commented 8 years ago

Really would like to come back and refactor the code and improve performance. As it's just javascript it should support but never tested it out. In the mean time if you'd like to improve/ make a PR please do!

chung-nguyen commented 8 years ago

I managed to get this to work with Android by changing the render method of Slider like this.

render() { var {positionOne, positionTwo} = this.state; var {selectedStyle, unselectedStyle, sliderLength} = this.props; var twoMarkers = positionTwo;

var fixedPositionOne = Math.floor(positionOne / this.stepLength) * this.stepLength;
var fixedPositionTwo = Math.floor(positionTwo / this.stepLength) * this.stepLength;

var trackOneLength = fixedPositionOne;
var trackOneStyle = twoMarkers ? unselectedStyle : selectedStyle;
var trackThreeLength = twoMarkers ? sliderLength - (fixedPositionTwo) : 0;
var trackThreeStyle = unselectedStyle;
var trackTwoLength = sliderLength - trackOneLength - trackThreeLength;
var trackTwoStyle = twoMarkers ? selectedStyle : unselectedStyle;
var Marker = this.props.customMarker;
var {slipDisplacement, height, width, borderRadius} = this.props.touchDimensions;
var touchStyle = {
  height: height,
  width: width,
  borderRadius: borderRadius || 0
};

return (
  <View style={[styles.container, this.props.containerStyle]}>
    <View style={[styles.fullTrack, { width: sliderLength }]}>
      <View style={[this.props.trackStyle, styles.track, trackOneStyle, { width: trackOneLength }]} />
      <View style={[this.props.trackStyle, styles.track, trackTwoStyle, { width: trackTwoLength }]} />
      { twoMarkers && (
        <View style={[this.props.trackStyle, styles.track, trackThreeStyle, { width: trackThreeLength }]} />
      ) }

      <View
        style={[styles.touch, touchStyle, {left: -(trackTwoLength + trackThreeLength + width / 2)}]}
        ref={component => this._markerOne = component}
        {...this._panResponderOne.panHandlers}
        >
        <Marker
          pressed={this.state.onePressed}
          value={this.state.valueOne}
          markerStyle={this.props.markerStyle}
          pressedMarkerStyle={this.props.pressedMarkerStyle}
          />
      </View>

      { twoMarkers && (positionOne !== this.props.sliderLength) && (
        <View
          style={[styles.touch, touchStyle, {left: -(trackThreeLength + width * 1.5)}]}
          ref={component => this._markerTwo = component}
          {...this._panResponderTwo.panHandlers}
          >
          <Marker
            pressed={this.state.twoPressed}
            value={this.state.valueOne}
            markerStyle={this.props.markerStyle}
            pressedMarkerStyle={this.props.pressedMarkerStyle}
            />
        </View>
      ) }

    </View>
  </View>
);

}

sylvainbaronnet commented 8 years ago

@chung-nguyen great, could you submit a PR ?

ddobby94 commented 7 years ago

@jrans @sylvainbaronnet Hey guys could you merge that nice PR?