2014-11-08 79 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))); 
} 
相關問題