Come impostare il progresso di Android SeekBar disegnabile in modo programmato

Ho un problema di programmare regolarmente il progresso disegnabile di un SeekBar. Quando l'ho impostato nel file .xml tutto funziona bene.

<SeekBar android:id="@+id/sb" android:layout_width="fill_parent" android:layout_height="wrap_content" ..... android:progressDrawable="@drawable/seek_bar"/> 

impostato da .xml

  • Disegnare un'ombra esterna quando si disegna un'image
  • Crittografare con il module Node.js Crypto e decrittografare con Java (in applicazione Android)
  • ExoPlayer e comandi start / pause / seekTo
  • Imansible risolvere: com.android.support:appcompat-v7:15.+
  • TagSoup vs. Jsoup vs Parser HTML vs HotSax vs
  • Utilizzo di Alarmmanager per avviare un servizio a tempo determinato
  • Ma, ho un problema quando cerco di impostarla da codice come questo:

     seekBar.setProgressDrawable(getResources().getDrawable(R.drawable.seek_bar)); 

    Il disegno disegnato in fondo prende l'integer barra di ricerca e non riesco a modificare il progresso più tardi: il pollice si muove ma il tracciato progressivo riempie ancora la barra di ricerca intera. Inoltre, searchbar perde i suoi angoli arrotondati. Sembra che il tracciato di progresso sia in cima alla barra di ricerca.

    quando è impostato nel codice

    Ho provato la soluzione fornita su android progressBar non aggiorna vista / disegni di avanzamento , ma non funziona per me.

    Aiuto apprezzato,

    Milos

  • java.lang.NoClassDefFoundError: android.support.v7.appcompat.R $ styleable
  • Come fare clic su un indirizzo email?
  • Colore del text di ActionBar
  • Come get i valori di tutto EditText all'interno di un ListView
  • Perché dice che "non si può fare riferimento a una variabile non finale che all'interno di una class interna definita in un metodo diverso"?
  • Come timeout acquisizione del segnale GPS
  • 3 Solutions collect form web for “Come impostare il progresso di Android SeekBar disegnabile in modo programmato”

    Ho risolto il problema utilizzando la forma .xml come background per il mio SeekBar. La soluzione SeekBar completa che può essere usata tramite il metodo setProgressDrawable () dovrebbe essere così:

     //seek_bar.xml <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@android:id/background" android:drawable="@drawable/seek_bar_background"/> <item android:id="@android:id/progress" android:drawable="@drawable/seek_bar_progress" /> </layer-list> //seek_bar_background.xml <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <gradient android:angle="270" android:startColor="#8a8c8f" android:endColor="#58595b" /> <corners android:radius="5dip" /> </shape> //seek_bar_progress.xml <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@android:id/background" android:drawable="@drawable/seek_bar_background"/> <item android:id="@android:id/progress"> <clip android:drawable="@drawable/seek_bar_progress_fill" /> </item> </layer-list> //seek_bar_progress_fill.xml <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <gradient android:startColor="#b3d27e" android:endColor="#93c044" android:angle="270" /> <corners android:radius="5dip" /> </shape> 

    Nel codice, puoi utilizzarlo come questo:

     progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.seek_bar)); 

    La risposta data sopra è per l'utilizzo di xml, ma solo nel caso in cui qualcuno abbia voluto farlo in modo programmato lo ho sotto.

     public class SeekBarBackgroundDrawable extends Drawable { private Paint mPaint = new Paint(); private float dy; public SeekBarBackgroundDrawable(Context ctx) { mPaint.setColor(Color.WHITE); dy = ctx.getResources().getDimension(R.dimen.one_dp); } @Override public void draw(Canvas canvas) { canvas.drawRect(getBounds().left,getBounds().centerY()-dy/2,getBounds().right,getBounds().centerY()+dy/2,mPaint); } @Override public void setAlpha(int i) { mPaint.setAlpha(i); } @Override public void setColorFilter(ColorFilter colorFilter) { } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } 

    }

    Sopra la class è per lo background della barra di ricerca (la parte che esiste sempre sotto il tracciato progressivo)

     public class SeekBarProgressDrawable extends ClipDrawable { private Paint mPaint = new Paint(); private float dy; private Rect mRect; public SeekBarProgressDrawable(Drawable drawable, int gravity, int orientation, Context ctx) { super(drawable, gravity, orientation); mPaint.setColor(Color.WHITE); dy = ctx.getResources().getDimension(R.dimen.two_dp); } @Override public void draw(Canvas canvas) { if (mRect==null) { mRect = new Rect(getBounds().left, (int)(getBounds().centerY() - dy / 2), getBounds().right, (int)(getBounds().centerY() + dy / 2)); setBounds(mRect); } super.draw(canvas); } @Override public void setAlpha(int i) { mPaint.setAlpha(i); } @Override public void setColorFilter(ColorFilter colorFilter) { } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } 

    }

    Sopra è il progresso disegnabile. Si noti che è un clip disegnabile. La parte fredda qui è che sto fissando i limiti per essere quello che voglio, insieme al colore. Ciò consente di personalizzare bene il proprio disegnatore.

     //Custom background drawable allows you to draw how you want it to look if needed SeekBarBackgroundDrawable backgroundDrawable = new SeekBarBackgroundDrawable(mContext); ColorDrawable progressDrawable = new ColorDrawable(Color.BLUE); //Custom seek bar progress drawable. Also allows you to modify appearance. SeekBarProgressDrawable clipProgressDrawable = new SeekBarProgressDrawable(progressDrawable,Gravity.LEFT,ClipDrawable.HORIZONTAL,mContext); Drawable[] drawables = new Drawable[]{backgroundDrawable,clipProgressDrawable}; //Create layer drawables with android pre-defined ids LayerDrawable layerDrawable = new LayerDrawable(drawables); layerDrawable.setId(0,android.R.id.background); layerDrawable.setId(1,android.R.id.progress); //Set to seek bar seekBar.setProgressDrawable(layerDrawable); 

    Il codice superiore utilizza drawables personalizzati per modificare la barra di ricerca. La mia ragione principale per farlo è che modificherò l'aspetto dello background disegnabile, quindi ha "tacche" (anche se non ancora implementate). Non puoi farlo con un disegno disegnato xml (alless non facilmente).

    Un'altra cosa che ho notato è che questo process impedisce ai SeekBar di get la stessa width del pollice disegnabile. Imposta i limiti dei disegni in modo da non arrivare mai alti.

    Ho avuto problemi che cambiano i codici di ricerca e di avanzamento dal codice prima. Una volta ho dovuto caricare due volte il disegnatore prima che fosse efficace. Penso che si tratti di imbottitura dopo aver cambiato l'image.

    Sto solo indovinando qui, ma provate ad impostare l'imbottitura in seguito

      getResources().getDrawable(R.drawable.seek_bar) // once seekBar.setProgressDrawable(getResources().getDrawable(R.drawable.seek_bar)); //twice seekBar.setPadding(int,int,int,int) 

    e anche non poteva fare del male per invalidarlo.

      seekBar.postInvalidate() 

    Molto hacky e non mi piace, ma ha risolto qualcosa di simile per me prima

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.