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.

  • Größe der android Benachrichtigung Bar und Titelleiste?
  • Android 4.1.2 Dialoge werden zweimal aufgerufen
  • SurfaceView.getHolder nicht zurückgeben SurfaceHolder
  • Ionic android build - nicht genug Speicher, um jvm zu starten
  • Facebook Canvas App in WebView funktioniert nicht auf Android (in native Facebook App)
  • Kämpfen, um Xamarin Ausnahmebehandlung zu verstehen
  • 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?

  • Wie bekomme ich die Bildschirmgröße von Android?
  • Wie fügt man Kalenderereignisse zum Standardkalender hinzu, still ohne Absicht, in Android 4?
  • Gibt es irgendjemand wissen, wie man Window () im Dienst auf Android?
  • Android Verschiedene Menü-Ressourcen
  • Herunterladen von gesendeten Mails von Yahoo, Gmail und Hotmail
  • ScrollView Inside ScrollView
  • 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.