Skip to content

Commit 10fa83e

Browse files
André Krügerwojteg1337
authored andcommitted
feat: Implement thumbImage for Android (#106)
1 parent 9d99690 commit 10fa83e

File tree

5 files changed

+71
-9
lines changed

5 files changed

+71
-9
lines changed

android/src/main/java/com/reactnativecommunity/slider/ReactSlider.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,22 @@
77
package com.reactnativecommunity.slider;
88

99
import android.content.Context;
10+
import android.graphics.Bitmap;
11+
import android.graphics.BitmapFactory;
12+
import android.graphics.drawable.BitmapDrawable;
1013
import android.os.Build;
14+
15+
import androidx.annotation.RequiresApi;
1116
import androidx.appcompat.widget.AppCompatSeekBar;
17+
1218
import android.util.AttributeSet;
19+
20+
import java.net.URL;
21+
import java.util.concurrent.Callable;
22+
import java.util.concurrent.ExecutorService;
23+
import java.util.concurrent.Executors;
24+
import java.util.concurrent.Future;
25+
1326
import javax.annotation.Nullable;
1427

1528
/**
@@ -112,4 +125,40 @@ private int getTotalSteps() {
112125
private double getStepValue() {
113126
return mStep > 0 ? mStep : mStepCalculated;
114127
}
128+
129+
private BitmapDrawable getBitmapDrawable(final String uri) {
130+
BitmapDrawable bitmapDrawable = null;
131+
ExecutorService executorService = Executors.newSingleThreadExecutor();
132+
Future<BitmapDrawable> future = executorService.submit(new Callable<BitmapDrawable>() {
133+
@Override
134+
public BitmapDrawable call() {
135+
BitmapDrawable bitmapDrawable = null;
136+
try {
137+
Bitmap bitmap = BitmapFactory.decodeStream(new URL(uri).openStream());
138+
bitmapDrawable = new BitmapDrawable(getResources(), bitmap);
139+
} catch (Exception e) {
140+
e.printStackTrace();
141+
}
142+
return bitmapDrawable;
143+
}
144+
});
145+
try {
146+
bitmapDrawable = future.get();
147+
} catch (Exception e) {
148+
e.printStackTrace();
149+
}
150+
return bitmapDrawable;
151+
}
152+
153+
public void setThumbImage(final String uri) {
154+
if (uri != null) {
155+
setThumb(getBitmapDrawable(uri));
156+
// Enable alpha channel for the thumbImage
157+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
158+
setSplitTrack(false);
159+
}
160+
} else {
161+
setThumb(getThumb());
162+
}
163+
}
115164
}

android/src/main/java/com/reactnativecommunity/slider/ReactSliderManager.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,22 @@
1515
import android.view.ViewGroup;
1616
import android.widget.SeekBar;
1717
import com.facebook.react.bridge.ReactContext;
18+
import com.facebook.react.bridge.ReadableMap;
1819
import com.facebook.react.common.MapBuilder;
1920
import com.facebook.react.uimanager.LayoutShadowNode;
20-
import com.facebook.react.uimanager.ReactShadowNodeImpl;
2121
import com.facebook.react.uimanager.SimpleViewManager;
2222
import com.facebook.react.uimanager.ThemedReactContext;
2323
import com.facebook.react.uimanager.UIManagerModule;
2424
import com.facebook.react.uimanager.ViewProps;
2525
import com.facebook.react.uimanager.annotations.ReactProp;
26-
import com.facebook.react.uimanager.events.EventDispatcher;
2726
import com.facebook.yoga.YogaMeasureFunction;
2827
import com.facebook.yoga.YogaMeasureMode;
2928
import com.facebook.yoga.YogaMeasureOutput;
3029
import com.facebook.yoga.YogaNode;
3130
import java.util.Map;
3231

32+
import javax.annotation.Nullable;
33+
3334
/**
3435
* Manages instances of {@code ReactSlider}.
3536
*
@@ -186,6 +187,15 @@ public void setMinimumTrackTintColor(ReactSlider view, Integer color) {
186187
}
187188
}
188189

190+
@ReactProp(name = "thumbImage")
191+
public void setThumbImage(ReactSlider view, @Nullable ReadableMap source) {
192+
String uri = null;
193+
if (source != null) {
194+
uri = source.getString("uri");
195+
}
196+
view.setThumbImage(uri);
197+
}
198+
189199
@ReactProp(name = "maximumTrackTintColor", customType = "Color")
190200
public void setMaximumTrackTintColor(ReactSlider view, Integer color) {
191201
LayerDrawable drawable = (LayerDrawable) view.getProgressDrawable().getCurrent();

example/SliderExample.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ exports.examples = [
167167
},
168168
{
169169
title: 'Custom thumb image',
170-
platform: 'ios',
171170
render(): React.Element<any> {
172171
return <SliderExample thumbImage={require('./uie_thumb_big.png')} />;
173172
},

js/Slider.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
'use strict';
1212

1313
const React = require('react');
14-
const {Platform, StyleSheet} = require('react-native');
14+
const {Image, Platform, StyleSheet} = require('react-native');
1515
const RCTSliderNativeComponent = require('./RNCSliderNativeComponent');
1616

1717
import type {NativeComponent} from 'react-native/Libraries/Renderer/shims/ReactNative';
@@ -49,11 +49,6 @@ type IOSProps = $ReadOnly<{|
4949
* leftmost pixel of the image will be stretched to fill the track.
5050
*/
5151
maximumTrackImage?: ?ImageSource,
52-
53-
/**
54-
* Sets an image for the thumb. Only static images are supported.
55-
*/
56-
thumbImage?: ?ImageSource,
5752
|}>;
5853

5954
type Props = $ReadOnly<{|
@@ -141,6 +136,11 @@ type Props = $ReadOnly<{|
141136
*/
142137
testID?: ?string,
143138

139+
/**
140+
* Sets an image for the thumb. Only static images are supported.
141+
*/
142+
thumbImage?: ?ImageSource,
143+
144144
/**
145145
* If true the slider will be inverted.
146146
* Default value is false.
@@ -252,6 +252,7 @@ const Slider = (
252252
return (
253253
<RCTSliderNativeComponent
254254
{...localProps}
255+
thumbImage={Image.resolveAssetSource(props.thumbImage)}
255256
ref={forwardedRef}
256257
style={style}
257258
onChange={onChangeEvent}

js/__tests__/__snapshots__/Slider.test.js.snap

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ exports[`<Slider /> renders a slider with custom props 1`] = `
2121
"height": 40,
2222
}
2323
}
24+
thumbImage={null}
2425
thumbTintColor="green"
2526
value={0.5}
2627
/>
@@ -45,6 +46,7 @@ exports[`<Slider /> renders disabled slider 1`] = `
4546
"height": 40,
4647
}
4748
}
49+
thumbImage={null}
4850
value={0}
4951
/>
5052
`;
@@ -68,6 +70,7 @@ exports[`<Slider /> renders enabled slider 1`] = `
6870
"height": 40,
6971
}
7072
}
73+
thumbImage={null}
7174
value={0}
7275
/>
7376
`;

0 commit comments

Comments
 (0)