2014-11-08 47 views
0

我正在创建一个自定义搜索栏,就像主题为Google Play音乐的新材料中的一个。我已经完成了将交互性带到seekbar拇指所需的内容。但问题是当视图首先膨胀并附加到窗口时,进度条被绘制,但拇指未被绘制。自定义seekbar拇指不会在充气后显示

我在大量的研究和阅读后第一次写了一个观点。知道这种行为的原因是很好的。

我写的seekbar的代码就在这里。

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(); 
} 

} 
+0

我可以知道downvote的原因吗? – 2014-11-08 09:09:17

回答

0

我只是在构造函数中设置可绘制级别而不是设置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))); 
}