2010-01-11 14 views
8

C'è un modo per personalizzare il MediaController? Devo cambiare lo stile dei pulsanti, SeekBar ecc.Cambia stile di Android MediaController

+0

Ecco un esempio di personalizzazione di MediaController: http://stackoverflow.com/questions/12482203/how-to-create-custom-ui-for-android-mediacontroller/14323144#14323144 – Blago

risposta

3

Il metodo makeControllerView doveva essere sovrascritto in modo da poter fornire la propria vista. Sfortunatamente, è nascosto al momento.

È possibile prendere la fonte di MediaController e reimplementarla o copiare e incollare i metodi nascosti in una sottoclasse in modo da poterla personalizzare.

+0

'makeControllerView' è' protected' for la fonte che sto guardando. Qualcuno sa quando è cambiato da 'privato' a' protetto'? – William

+0

Oh, forse stai parlando di @hide in javadoc per 'makeControllerView' in 'android.widget.MediaController'. Mentre questo bit javadoc sembra fermare l'annotazione '@ Override' dal lavoro, * non * impedisce effettivamente l'override del metodo. La domanda originale è rimasta pressoché invariata - era mai stata privata? – William

4

Che cosa si può fare è recurse la vista della gerarchia della vostra MediaController e impostare disegnabile del SeekBar di programmazione:

private void styleMediaController(View view) { 
    if (view instanceof MediaController) { 
     MediaController v = (MediaController) view; 
     for(int i = 0; i < v.getChildCount(); i++) { 
      styleMediaController(v.getChildAt(i)); 
     } 
    } else 
     if (view instanceof LinearLayout) { 
      LinearLayout ll = (LinearLayout) view; 
      for(int i = 0; i < ll.getChildCount(); i++) { 
       styleMediaController(ll.getChildAt(i)); 
      } 
     } else if (view instanceof SeekBar) { 
      ((SeekBar) view).setProgressDrawable(getResources().getDrawable(R.drawable.progressbar)); 
      ((SeekBar) view).setThumb(getResources().getDrawable(R.drawable.progresshandle)); 
     } 
} 

Poi, basta chiamare

styleMediaController(myMC); 
+0

Il tuo codice non funziona per me. Qual è la ragione per l'indice 'di paremeter'? 'v.getChildCount()' restituisce 0 ogni volta. – rekire

+0

@rekire Il parametro index è necessario perché la funzione viene chiamata in modo ricorsivo da sola, discendendo la gerarchia della vista di MediaController. – bk138

+1

Ma la variabile 'index' non viene mai usata. – rekire

1

ho cambiato il codice di bk138 di rispondere a basta cambiare il colore degli elementi. Non i drawable stessi. Questa soluzione è compatibile con i vecchi dispositivi insieme alla libreria di supporto v4.

private void styleMediaController(View view) { 
     if (view instanceof MediaController) { 
      MediaController v = (MediaController) view; 
      for (int i = 0; i < v.getChildCount(); i++) { 
       styleMediaController(v.getChildAt(i)); 
      } 
     } else if (view instanceof LinearLayout) { 
      LinearLayout ll = (LinearLayout) view; 
      for (int i = 0; i < ll.getChildCount(); i++) { 
       styleMediaController(ll.getChildAt(i)); 
      } 
     } else if (view instanceof SeekBar) { 
      ((SeekBar) view) 
        .getProgressDrawable() 
        .mutate() 
        .setColorFilter(
          getResources().getColor(
            R.color.MediaPlayerMeterColor), 
          PorterDuff.Mode.SRC_IN); 
      Drawable thumb = ((SeekBar) view).getThumb().mutate(); 
      if (thumb instanceof android.support.v4.graphics.drawable.DrawableWrapper) { 
       //compat mode, requires support library v4 
       ((android.support.v4.graphics.drawable.DrawableWrapper) thumb).setCompatTint(getResources() 
         .getColor(R.color.MediaPlayerThumbColor)); 
      } else { 
       //lollipop devices 
       thumb.setColorFilter(
         getResources().getColor(R.color.MediaPlayerThumbColor), 
         PorterDuff.Mode.SRC_IN); 
      } 
     } 
    } 

Poi, basta chiamare

styleMediaController(myMC); 

dovuto chiamare styleMediaController(myMC) nel OnPreparedListener del VideoView per farlo funzionare. Altrimenti la vista MediaController non ha figli.

+0

cos'è 'setCompatTint'? –

Problemi correlati