diff --git a/lib/src/main/java/io/apptik/widget/MultiSlider.java b/lib/src/main/java/io/apptik/widget/MultiSlider.java index 85dec5d..330d49e 100644 --- a/lib/src/main/java/io/apptik/widget/MultiSlider.java +++ b/lib/src/main/java/io/apptik/widget/MultiSlider.java @@ -113,7 +113,7 @@ public interface OnTrackingChangeListener { boolean mMirrorForRtl = true; //list of all the loaded thumbs - private LinkedList mThumbs; + private final LinkedList mThumbs = new LinkedList<>(); /** @@ -133,7 +133,7 @@ public interface OnTrackingChangeListener { private int mScaledTouchSlop; private float mTouchDownX; //thumbs that are currently being dragged - private List mDraggingThumbs = new LinkedList<>(); + private final List mDraggingThumbs = new LinkedList<>(); //thumbs that are currently being touched LinkedList exactTouched = null; @@ -580,7 +580,6 @@ private void initMultiSlider(int numThumbs) { mMaxWidth = 48; mMinHeight = 24; mMaxHeight = 48; - mThumbs = new LinkedList(); for (int i = 0; i < numThumbs; i++) { mThumbs.add(new Thumb().setMin(mScaleMin).setMax(mScaleMax).setTag("thumb " + i)); @@ -1123,34 +1122,40 @@ public void jumpDrawablesToCurrentState() { @Override protected void drawableStateChanged() { - super.drawableStateChanged(); - if (mDraggingThumbs != null && !mDraggingThumbs.isEmpty()) { - int[] state = getDrawableState(); - for (Thumb thumb : mDraggingThumbs) { - if (thumb.getThumb() != null) - thumb.getThumb().setState(state); - } - for (Thumb thumb : mThumbs) { - if (!mDraggingThumbs.contains(thumb) && thumb.getThumb() != null && thumb - .getThumb().isStateful()) { - if (thumb.isEnabled()) { - thumb.getThumb().setState(new int[]{android.R.attr.state_enabled}); - } else { - thumb.getThumb().setState(new int[]{-android.R.attr.state_enabled}); + synchronized (mDraggingThumbs) { + if (!mDraggingThumbs.isEmpty()) { + int[] state = getDrawableState(); + for (Thumb thumb : mDraggingThumbs) { + if (thumb.getThumb() != null) { + thumb.getThumb().setState(state); } } - } - } else { - for (Thumb thumb : mThumbs) { - if (thumb.getThumb() != null && thumb.getThumb().isStateful()) { - if (thumb.isEnabled()) { - thumb.getThumb().setState(new int[]{android.R.attr.state_enabled}); - } else { - thumb.getThumb().setState(new int[]{-android.R.attr.state_enabled}); + for (Thumb thumb : mThumbs) { + if (!mDraggingThumbs.contains(thumb) && thumb.getThumb() != null && thumb + .getThumb().isStateful()) { + if (thumb.isEnabled()) { + thumb.getThumb().setState(new int[]{android.R.attr.state_enabled, + -android.R.attr.state_pressed}); + } else { + thumb.getThumb().setState(new int[]{-android.R.attr.state_enabled}); + } + } + } + } else { + for (Thumb thumb : mThumbs) { + if (thumb.getThumb() != null && thumb.getThumb().isStateful()) { + if (thumb.isEnabled()) { + thumb.getThumb().setState(new int[]{android.R.attr.state_enabled, + -android.R.attr.state_pressed}); + } else { + thumb.getThumb().setState(new int[]{-android.R.attr.state_enabled}); + } } } } } + super.drawableStateChanged(); + } @@ -1535,29 +1540,16 @@ else if (exactTouched != null && exactTouched.size() > 0) { break; case MotionEvent.ACTION_UP: - setPressed(false); //there are other pointers left case MotionEvent.ACTION_POINTER_UP: if (currThumb != null) { setThumbValue(currThumb, getValue(event, currThumb), true); setHotspot(xx, yy, currThumb); - boolean toUnPress = false; if (!isPressed()) { setPressed(true); - toUnPress = true; } onStopTrackingTouch(currThumb); - if (toUnPress) { - setPressed(false); - } - } else { -// currThumb = getClosestThumb(newValue); -// // Touch up when we never crossed the touch slop threshold should -// // be interpreted as a tap-seek to that location. -// onStartTrackingTouch(currThumb); -// setThumbValue(currThumb, newValue, true); -// onStopTrackingTouch(currThumb); } // ProgressBar doesn't know to repaint the thumb drawable // in its inactive state when the touch stops (because the @@ -1565,10 +1557,7 @@ else if (exactTouched != null && exactTouched.size() > 0) { invalidate(); break; case MotionEvent.ACTION_CANCEL: - if (mDraggingThumbs != null) { - onStopTrackingTouch(); - setPressed(false); - } + onStopTrackingTouch(); invalidate(); // see above explanation break; } @@ -1654,13 +1643,17 @@ private void attemptClaimDrag() { */ void onStartTrackingTouch(Thumb thumb) { if (thumb != null) { - setPressed(true); + mDraggingThumbs.add(thumb); + if (isPressed()) { + drawableStateChanged(); + } else { + setPressed(true); + } + if (thumb.getThumb() != null) { // This may be within the padding region. invalidate(thumb.getThumb().getBounds()); } - mDraggingThumbs.add(thumb); - drawableStateChanged(); if (hasOnTrackingChangeListener()) { mOnTrackingChangeListener.onStartTrackingTouch(this, thumb, thumb.getValue()); } @@ -1678,12 +1671,22 @@ void onStopTrackingTouch(Thumb thumb) { if (hasOnTrackingChangeListener()) { mOnTrackingChangeListener.onStopTrackingTouch(this, thumb, thumb.getValue()); } - drawableStateChanged(); + if (mDraggingThumbs.size() == 0) { + setPressed(false); + } else { + drawableStateChanged(); + } } } void onStopTrackingTouch() { - mDraggingThumbs.clear(); + for (Thumb thumb : mDraggingThumbs) { + mDraggingThumbs.remove(thumb); + if (hasOnTrackingChangeListener()) { + mOnTrackingChangeListener.onStopTrackingTouch(this, thumb, thumb.getValue()); + } + } + setPressed(false); } private boolean hasOnThumbValueChangeListener() {