Drawable personalizzato per ProgressBar / ProgressDialog

Leggendo la documentazione limitata fornita da Google, ho la sensazione che sia ansible modificare l’aspetto (disegnabile) di ProgressBar / ProgressDialog semplicemente creando un nuovo stile e assegnandolo alla proprietà di stile di ProgressBar. Ma non riesco a farlo funzionare correttamente. Ecco cosa ho fatto finora:

Ho creato una forma come questa (mp2.xml)

     

quindi creato un’animazione (mp3.xml) come questa:

                                        

quindi creato uno stile (attrs.xml) in questo modo:

    @anim/mp3   

e nel mio main.xml ho impostato lo stile in questo modo:

     

Ma mostra ancora lo stesso drawable di prima. Che cosa sto facendo di sbagliato?

Ho usato quanto segue per creare una barra di avanzamento personalizzata.

File res/drawable/progress_bar_states.xml dichiara i colors dei diversi stati:

                      

E il codice all’interno del tuo layout xml:

   

Godere!

Ho avuto qualche problema nell’usare una finestra di dialogo Indeterminate Progress con la soluzione qui, dopo un po ‘di lavoro e tentativi ed errori l’ho fatta funzionare.

Innanzitutto, crea l’animazione che desideri utilizzare per la finestra di dialogo Progresso. Nel mio caso ho usato 5 immagini.

../res/anim/progress_dialog_icon_drawable_animation.xml:

        

Dove vuoi mostrare una ProgressDialog:

 dialog = new ProgressDialog(Context.this); dialog.setIndeterminate(true); dialog.setIndeterminateDrawable(getResources().getDrawable(R.anim.progress_dialog_icon_drawable_animation)); dialog.setMessage("Some Text"); dialog.show(); 

Questa soluzione è davvero semplice e ha funzionato per me, è ansible estendere ProgressDialog e farlo sovrascrivere internamente il drawable, tuttavia, questo è stato davvero troppo complicato per ciò di cui avevo bisogno, quindi non l’ho fatto.

Prova a impostare:

 android:indeterminateDrawable="@drawable/progress" 

Ha funzionato per me. Ecco anche il codice per progress.xml:

 < ?xml version="1.0" encoding="utf-8"?>       

Il tuo stile dovrebbe assomigliare a questo:

  

Progresso personalizzato con scala!

 < ?xml version="1.0" encoding="utf-8"?>               

faccio il tuo codice. Posso correre ma ho bisogno di modificare due posizioni:

  1. name="android:indeterminateDrawable" invece di android:progressDrawable

  2. modificare il nome attrs.xml —> styles.xml

Non sono sicuro, ma in questo caso puoi comunque utilizzare un AlertDialog personalizzato completo con un file di layout separato impostato nella finestra di avviso e impostare l’animazione per la tua visualizzazione di immagini utilizzando parte del tuo codice sopra che dovrebbe anche farlo!

 public class CustomProgressBar { private RelativeLayout rl; private ProgressBar mProgressBar; private Context mContext; private String color__ = "#FF4081"; private ViewGroup layout; public CustomProgressBar (Context context, boolean isMiddle, ViewGroup layout) { initProgressBar(context, isMiddle, layout); } public CustomProgressBar (Context context, boolean isMiddle) { try { layout = (ViewGroup) ((Activity) context).findViewById(android.R.id.content).getRootView(); } catch (Exception e) { e.printStackTrace(); } initProgressBar(context, isMiddle, layout); } void initProgressBar(Context context, boolean isMiddle, ViewGroup layout) { mContext = context; if (layout != null) { int padding; if (isMiddle) { mProgressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleSmall); // mProgressBar.setBackgroundResource(R.drawable.pb_custom_progress);//Color.parseColor("#55000000") padding = context.getResources().getDimensionPixelOffset(R.dimen.padding); } else { padding = context.getResources().getDimensionPixelOffset(R.dimen.padding); mProgressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleSmall); } mProgressBar.setPadding(padding, padding, padding, padding); mProgressBar.setBackgroundResource(R.drawable.pg_back); mProgressBar.setIndeterminate(true); try { color__ = AppData.getTopColor(context);//UservaluesModel.getAppSettings().getSelectedColor(); } catch (Exception e) { color__ = "#FF4081"; } int color = Color.parseColor(color__); // color=getContrastColor(color); // color__ = color__.replaceAll("#", "");//R.color.colorAccent mProgressBar.getIndeterminateDrawable().setColorFilter(color, android.graphics.PorterDuff.Mode.SRC_ATOP); } } RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); rl = new RelativeLayout(context); if (!isMiddle) { int valueInPixels = (int) context.getResources().getDimension(R.dimen.padding); lp.setMargins(0, 0, 0, (int) (valueInPixels / 1.5));//(int) Utils.convertDpToPixel(valueInPixels, context)); rl.setClickable(false); lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); } else { rl.setGravity(Gravity.CENTER); rl.setClickable(true); } lp.addRule(RelativeLayout.CENTER_IN_PARENT); mProgressBar.setScaleY(1.55f); mProgressBar.setScaleX(1.55f); mProgressBar.setLayoutParams(lp); rl.addView(mProgressBar); layout.addView(rl, params); } } public void show() { if (mProgressBar != null) mProgressBar.setVisibility(View.VISIBLE); } public void hide() { if (mProgressBar != null) { rl.setClickable(false); mProgressBar.setVisibility(View.INVISIBLE); } } } 

E poi chiama

 customProgressBar = new CustomProgressBar (Activity, true); customProgressBar .show();