package com.simplecity.amp_library.ui.views; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.drawable.Drawable; import android.graphics.drawable.ScaleDrawable; import android.util.AttributeSet; import android.view.Gravity; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.SeekBar; import com.simplecity.amp_library.utils.ResourceUtils; public class SizableSeekBar extends SeekBar { private ValueAnimator.AnimatorUpdateListener mAnimatorListener = new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { mCurrentThumbSizeRatio = (Float) valueAnimator.getAnimatedValue(); mThumb.setLevel((int) (10000F * (mCurrentThumbSizeRatio / mMaxThumbSizeRatio))); SizableSeekBar.this.invalidate(); } }; float mCurrentThumbSizeRatio = 1.0f; private OnSeekBarChangeListener mInternalListener = new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { startThumbShrinkAnimation(); if (mSeekListener != null) mSeekListener.onStopTrackingTouch(SizableSeekBar.this); } @Override public void onStartTrackingTouch(SeekBar seekBar) { startThumbGrowAnimation(); if (mSeekListener != null) mSeekListener.onStartTrackingTouch(SizableSeekBar.this); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (mSeekListener != null) mSeekListener.onProgressChanged(SizableSeekBar.this, progress, fromUser); } }; float mMaxThumbSizeRatio = 2.0f; OnSeekBarChangeListener mSeekListener; private Drawable mPendingThumb; Drawable mThumb; private ValueAnimator mThumbGrowAnimator; private ValueAnimator mThumbShrinkAnimator; private AccelerateDecelerateInterpolator mInterpolator = new AccelerateDecelerateInterpolator(); public SizableSeekBar(Context context) { super(context); super.setOnSeekBarChangeListener(mInternalListener); setThumb(mPendingThumb); mPendingThumb = null; configureThumbPadding(); } public SizableSeekBar(Context context, AttributeSet attrs) { super(context, attrs); super.setOnSeekBarChangeListener(mInternalListener); setThumb(mPendingThumb); mPendingThumb = null; configureThumbPadding(); } private void configureThumbPadding() { setThumbOffset(getThumbOffset() - ResourceUtils.toPixels(4.5f)); } void startThumbGrowAnimation() { if (mThumbShrinkAnimator != null) { mThumbShrinkAnimator.cancel(); mThumbShrinkAnimator = null; } mThumbGrowAnimator = ValueAnimator.ofFloat(mCurrentThumbSizeRatio, mMaxThumbSizeRatio); mThumbGrowAnimator.setInterpolator(mInterpolator); mThumbGrowAnimator.addUpdateListener(mAnimatorListener); mThumbGrowAnimator.setDuration(300); mThumbGrowAnimator.start(); } void startThumbShrinkAnimation() { if (mThumbGrowAnimator != null) { mThumbGrowAnimator.cancel(); mThumbGrowAnimator = null; } mThumbShrinkAnimator = ValueAnimator.ofFloat(mCurrentThumbSizeRatio, 1.0f); mThumbShrinkAnimator.setInterpolator(mInterpolator); mThumbShrinkAnimator.addUpdateListener(mAnimatorListener); mThumbShrinkAnimator.setDuration(300); mThumbShrinkAnimator.start(); } @Override protected void onSizeChanged(int i, int j, int k, int l) { super.onSizeChanged(i, j, k, l); configureThumbPadding(); } @Override public void setOnSeekBarChangeListener(OnSeekBarChangeListener listener) { mSeekListener = listener; } public void setInterpolator(AccelerateDecelerateInterpolator interpolator) { mInterpolator = interpolator; } @Override public void setThumb(Drawable thumb) { if (thumb == null) { return; } if (!(thumb instanceof ScaleDrawable)) { thumb = new ScaleDrawable(thumb, Gravity.CENTER, 1.0F, 1.0F); } mThumb = thumb; mThumb.setLevel((int) (10000F * (1.0F / mMaxThumbSizeRatio))); configureThumbPadding(); super.setThumb(mThumb); } public Drawable getThumb() { return mThumb; } }