Erkennung der Daumenposition in SeekBar vor API Version 16

Grundsätzlich muss ich feststellen, wann sich der Fortschritt in der SeekBar ändert und eine Textansicht auf den Daumen zieht, die den Fortschrittswert angibt.

Ich mache dies durch die Implementierung eines OnSeekBarChangeListener und auf dem public void onProgressChanged(SeekBar seekBar, int progress, boolean b) Methode, ich nenne Rect thumbRect = seekBar.getThumb().getBounds(); Um festzustellen, wo der Daumen positioniert ist.

Dies funktioniert einwandfrei, aber anscheinend ist getThumb() nur in API Level 16+ (Android 4.1) verfügbar, was zu einem NoSuchMethodError bei früheren Versionen führt.

Irgendeine Idee, wie man dieses Problem umgehen kann?

  • Android SeekBar Hintergrund entfernen
  • ValueAnimator wiederholt sich nur einmal
  • Android SeekBar setzt Fortschritt Wert
  • Android-Sucher-Set benutzerdefinierte Stil mit neun-Patch-Bilder
  • Android - Wie kann ich die Standard-SeekBar-Dicke ändern?
  • Android: SeekBar Increment Value - Wie zu
  • Android SeekBar hat sich horizontal umgedreht
  • SeekBar mit Dezimalwerten
  • 4 Solutions collect form web for “Erkennung der Daumenposition in SeekBar vor API Version 16”

    Ich konnte meine eigene Klasse benutzen, um den Daumen zu bekommen:

    MySeekBar.java

     package mobi.sherif.seekbarthumbposition; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.SeekBar; public class MySeekBar extends SeekBar { public MySeekBar(Context context) { super(context); } public MySeekBar(Context context, AttributeSet attrs) { super(context, attrs); } public MySeekBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } Drawable mThumb; @Override public void setThumb(Drawable thumb) { super.setThumb(thumb); mThumb = thumb; } public Drawable getSeekBarThumb() { return mThumb; } } 

    In der Aktivität funktioniert das perfekt:

     package mobi.sherif.seekbarthumbposition; import android.app.Activity; import android.graphics.Rect; import android.os.Bundle; import android.util.Log; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; public class MainActivity extends Activity implements OnSeekBarChangeListener { MySeekBar mSeekBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSeekBar = (MySeekBar) findViewById(R.id.seekbar); mSeekBar.setOnSeekBarChangeListener(this); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean b) { Rect thumbRect = mSeekBar.getSeekBarThumb().getBounds(); Log.v("sherif", "(" + thumbRect.left + ", " + thumbRect.top + ", " + thumbRect.right + ", " + thumbRect.bottom + ")"); } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } } 

    Eine großartige Lösung! Vielen Dank. Es ist nur nessesary, um hinzuzufügen, dass benutzerdefinierte seekbar Sie benötigen, um Ihre xml zu ändern

      <com.example.MySeekBar android:id="@+id/..." android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:minHeight="3dp" android:maxHeight="3dp" android:progressDrawable="@drawable/seek_bar_2" android:thumb="@drawable/thumbler_seekbart_circle" android:thumbOffset="8dp" /> 

    Android: thumbOffset = "8dp" – ist ein HALB von einem Daumen, den es besser ist, zu spenifizieren, also wird es keine Fehlanpassung des Textzentrums und des Daumens geben

    Positionierung kann so aussehen:

     int possition = (int) (seekBar.getX() //the beginning of the seekbar + seekBar.getThumbOffset() / 2 //the half of our thumb - the text to be above it's centre + ((MySeekBar) seekBar).getSeekBarThumb().getBounds().exactCenterX()); //position of a thumb inside the seek bar 

    Hoffentlich kann das einige Stunden für jemand anderes sparen!

    Ich habe diese Methode anstelle einer benutzerdefinierten seekBar erstellt:

     public int getSeekBarThumbPosX(SeekBar seekBar) { int posX; if (Build.VERSION.SDK_INT >= 16) { posX = seekBar.getThumb().getBounds().centerX(); } else { int left = seekBar.getLeft() + seekBar.getPaddingLeft(); int right = seekBar.getRight() - seekBar.getPaddingRight(); float width = (float) (seekBar.getProgress() * (right - left)) / seekBar.getMax(); posX = Math.round(width) + seekBar.getThumbOffset(); } return posX; } 

    @Sherif elKhatibs Antwort ist großartig, hat aber den Nachteil, dass man auch auf API> = 16 eine Kopie des Daumens hört. Ich habe es so verbessert, dass es nur den Thumb Drawable auf API <= 15 und es überschreibt die Methode in SeekBar.java , um zu vermeiden, dass zwei Methoden das gleiche auf API> = 16. Nur nach unten: Es braucht Ziel SDK zu sein> = 16, was in den meisten Apps heutzutage der Fall sein sollte.

     public class ThumbSeekBar extends AppCompatSeekBar { private Drawable thumb; public ThumbSeekBar(Context context) { super(context); } public ThumbSeekBar(Context context, AttributeSet attrs) { super(context, attrs); } public ThumbSeekBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public Drawable getThumb() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { return super.getThumb(); } return thumb; } @Override public void setThumb(Drawable thumb) { super.setThumb(thumb); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { this.thumb = thumb; } } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.