Пользовательский большой палец на панели поиска не отображается после надувания

Я создаю пользовательскую панель поиска, подобную той, что в новом материале, посвященном Google Play Music. Я сделал то, что требуется, чтобы придать интерактивность большому пальцу панели поиска. Но проблема в том, что когда представление сначала раздувается и прикрепляется к окну, индикатор выполнения рисуется, но большой палец не рисуется.

Я пишу представление в первый раз после долгих исследований и чтения. Было бы здорово узнать причину такого поведения.

Код панели поиска, которую я написал, находится здесь.

public class SizableSeekBar extends DebugSeekBar {

public static String TAG = "SizableSeekBar";

/**
 * Listener Set Using setOnSeekBarChangeListner(OnSeekBarChangeListener
 * listener)
 */
private OnSeekBarChangeListener mListener;

/**
 * The Thumb Drawable used that will be resized
 */
private Drawable mThumb;

/**
 * Animator used to animate the grow animation
 */
private ValueAnimator growAnimator;

/**
 * Animator used to animate the shrink animation
 */
private ValueAnimator shrinkAnimator;

/**
 * Interpolator used for shrink and grow animation
 */
private TimeInterpolator mInterpolator = new AccelerateDecelerateInterpolator();

/**
 * Listener for animator to update size of the Drawable
 */

/**
 * Maximum Thumb Size Ratio to use for resizing the Thumb
 */
private float mMaxThumbSizeRatio = 2f;

/**
 * Current Thumb size Ratio
 */
private float mCurrentThumbSizeRatio = 1f;

private ValueAnimator.AnimatorUpdateListener mAnimationUpdateListner = new AnimatorUpdateListener() {

    @Override
    public void onAnimationUpdate(ValueAnimator animator) {
        mCurrentThumbSizeRatio = ((Float) animator.getAnimatedValue())
                .floatValue();
        mThumb.setLevel((int) (10000 * (mCurrentThumbSizeRatio / mMaxThumbSizeRatio)));
        SizableSeekBar.this.invalidate();
    }
};

/**
 * Internal OnSeekbarChangeListener used for grow and shrink animation and
 * call respective Callbacks of mListner
 */
private OnSeekBarChangeListener mInternalListener = new OnSeekBarChangeListener() {

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        Log.e(TAG, "Stoping Tracking");
        startThumbShrink();
        if (mListener != null)
            mListener.onStopTrackingTouch(SizableSeekBar.this);
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        Log.e(TAG, "Starting Tracking");
        startThumbGrow();
        if (mListener != null)
            mListener.onStartTrackingTouch(SizableSeekBar.this);
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        if (mListener != null)
            mListener.onProgressChanged(SizableSeekBar.this, progress,
                    fromUser);
    }

};

public SizableSeekBar(Context context, AttributeSet attrs) {
    super(context, attrs);
    super.setOnSeekBarChangeListener(mInternalListener);
    // fixes wrong thumboffset
    setThumbOffset(mThumb.getIntrinsicWidth() / 2);
}

public SizableSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    super.setOnSeekBarChangeListener(mInternalListener);
    // fixes wrong thumboffset
    setThumbOffset(mThumb.getIntrinsicWidth() / 2);
}

@Override
public void setOnSeekBarChangeListener(OnSeekBarChangeListener listener) {
    mListener = listener;
}

/**
 * Sets the Interpolator to be used for grow and shrink animations
 * 
 * @param interpolator
 *            The interpolator which is to be set
 * 
 */
public void setInterpolator(TimeInterpolator interpolator) {
    mInterpolator = interpolator;
}

@Override
public void setThumb(Drawable thumb) {
    if (thumb == null)
        return;
    // If Thumb Drawable is not ScaleDrawable then wrap it up in new
    // ScaleDrawable
    if (!ScaleDrawable.class.isInstance(thumb))
        thumb = new ScaleDrawable(thumb, Gravity.CENTER, 1f, 1f);
    mThumb = thumb;
    super.setThumb(thumb);
    mThumb.setLevel((int) (10000 * (1.f / mMaxThumbSizeRatio)));

}

/**
 * Starts the thumb grow animation
 */
private void startThumbGrow() {
    if (shrinkAnimator != null) {
        shrinkAnimator.cancel();
        shrinkAnimator = null;
    }
    growAnimator = ValueAnimator.ofFloat(1, mMaxThumbSizeRatio);
    growAnimator.setInterpolator(mInterpolator);
    growAnimator.addUpdateListener(mAnimationUpdateListner);
    growAnimator.setDuration(300);
    growAnimator.start();

}

/**
 * Starts the thumb shrink animation
 */
private void startThumbShrink() {
    if (growAnimator != null) {
        growAnimator.cancel();
        growAnimator = null;
    }
    shrinkAnimator = ValueAnimator.ofFloat(mCurrentThumbSizeRatio, 1f);
    shrinkAnimator.setInterpolator(mInterpolator);
    shrinkAnimator.addUpdateListener(mAnimationUpdateListner);
    shrinkAnimator.setDuration(300);
    shrinkAnimator.start();
}

}

person Community    schedule 08.11.2014    source источник
comment
Можно узнать причину минуса?   -  person    schedule 08.11.2014


Ответы (1)


Я просто устанавливаю уровень отрисовки большого пальца в конструкторе, а не функцию set thumb().

public SizableSeekBar(Context context, AttributeSet attrs) {
    super(context, attrs);
    super.setOnSeekBarChangeListener(mInternalListener);
    // fixes wrong thumboffset
    setThumbOffset(mThumb.getIntrinsicWidth() / 2);
    mThumb.setLevel((int) (10000 * (mCurrentThumbSizeRatio / mMaxThumbSizeRatio)));
}
person Community    schedule 08.11.2014