2017-01-05 4 views
2

私のseekBarスタイルはandroid Widget.AppCompat.SeekBar.Discreteです。 私は自分のtickMarkerを持っていますが、親指マーカーの前に表示されているのがわかりますが、親指の裏に目盛りが表示されたくありません。 enter image description hereサムの前にシークバーの目盛マーカーが表示されるのはなぜですか?

と私が持っているもの:

は、私が欲しいもの

enter image description here

私のXML:

<android.support.v7.widget.AppCompatSeekBar 
    style="@style/seekbarStyle" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:max="4" 
    android:padding="4dp" 
    android:progress="0"/> 

私のスタイル:

<style name="seekbarStyle" parent="Widget.AppCompat.SeekBar.Discrete"> 
    <item name="tickMark">@drawable/seekbar_tickmark</item> 
    <item name="android:thumb">@drawable/circle</item> 
</style> 
+0

を、あなたのコードを表示することができますか? –

+0

@MubasharJavedコードを追加 – FarshidABZ

+0

親指の色を変更するだけで、親指と目盛りが同じ色になることを意味します。 –

答えて

4

これはAppCompatSeekBarのバグです。 私はAppCompatSeekBarを拡張するカスタムクラスでこの問題を解決:

<resources> 
    <declare-styleable name="CustomSeekBar"> 
     <attr name="tickMarkFixed" format="reference"/> 
    </declare-styleable> 
</resources> 

とレイアウトにあなたがtickMarkFixed代わりの目盛りを使用する必要があります。attrs.xmlで

public class CustomSeekBar extends AppCompatSeekBar { 

    private Drawable mTickMark; 

    public CustomSeekBar(Context context) { 
     this(context, null); 
    } 

    public CustomSeekBar(Context context, AttributeSet attrs) { 
     this(context, attrs, android.support.v7.appcompat.R.attr.seekBarStyle); 
    } 

    public CustomSeekBar(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     applyAttributes(attrs, defStyleAttr); 
    } 

    private void applyAttributes(AttributeSet rawAttrs, int defStyleAttr) 
    { 
     TypedArray attrs = getContext().obtainStyledAttributes(rawAttrs, R.styleable.CustomSeekBar, defStyleAttr, 0); 
     try { 
      mTickMark = attrs.getDrawable(R.styleable.CustomSeekBar_tickMarkFixed); 
     } finally { 
      attrs.recycle(); 
     } 
    } 

    @Override 
    protected synchronized void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     drawTickMarks(canvas); 
    } 

    @Override 
    public int getThumbOffset() { 
     return super.getThumbOffset(); 
    } 

    void drawTickMarks(Canvas canvas) { 
     if (mTickMark != null) { 
      final int count = getMax(); 
      if (count > 1) { 
       final int w = mTickMark.getIntrinsicWidth(); 
       final int h = mTickMark.getIntrinsicHeight(); 
       final int halfThumbW = getThumb().getIntrinsicWidth()/2; 
       final int halfW = w >= 0 ? w/2 : 1; 
       final int halfH = h >= 0 ? h/2 : 1; 
       mTickMark.setBounds(-halfW, -halfH, halfW, halfH); 
       final float spacing = (getWidth() - getPaddingLeft() - getPaddingRight() + getThumbOffset() * 2 - halfThumbW * 2)/(float) count; 
       final int saveCount = canvas.save(); 
       canvas.translate(getPaddingLeft() - getThumbOffset() + halfThumbW, getHeight()/2); 
       for (int i = 0; i <= count; i++) { 
        if(i!=getProgress()) 
         mTickMark.draw(canvas); 
        canvas.translate(spacing, 0); 
       } 
       canvas.restoreToCount(saveCount); 
      } 
     } 
    } 
} 

+0

ありがとう、後でチェックします。 – FarshidABZ

関連する問題