2010-01-11 5 views
8

Gibt es eine Möglichkeit, den MediaController anzupassen? Ich muss den Stil von Knöpfen, SeekBar usw. ändern.Ändern Sie den Stil von Android MediaController

+0

Hier ist ein Beispiel MediaController Anpassung: http://stackoverflow.com/questions/12482203/how-to-create-custom-ui-for-android-mediacontroller/14323144#14323144 – Blago

Antwort

3

Die Methode makeControllerView sollte überschrieben werden, also konnten Sie Ihre eigene Ansicht liefern. Leider ist es im Moment versteckt.

Sie können die Quelle von MediaController nehmen und diese entweder neu implementieren oder die versteckten Methoden kopieren und in eine Unterklasse einfügen, um sie anzupassen.

+0

'makeControllerView' ist" geschützt "für die Quelle, die ich sehe. Weiß jemand, wann es sich von "privat" zu "geschützt" geändert hat? – William

+0

Oh, vielleicht sprechen Sie über die @Hide im Javadoc für die 'makeControllerView' in' android.widget.MediaController'. Obwohl dieses javadoc-Bit scheinbar die '@ Override'-Annotation von der Arbeit abhebt, verhindert es * tatsächlich * nicht, die Methode zu überschreiben. Die ursprüngliche Frage steht fast unverändert - war das jemals privat? – William

4

Was können Sie tun, ist die Ansicht Hierarchie Ihrer MediaController- Rekursion und die SeekBar des ziehbar gesetzt programmatisch:

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)); 
     } 
} 

Dann rufen Sie einfach

styleMediaController(myMC); 
+0

Ihr Code funktioniert nicht für mich. Was ist der Grund für den "Index"? 'v.getChildCount()' gibt jedes Mal 0 zurück. – rekire

+0

@rekire Der Parameter index wird benötigt, weil die Funktion rekursiv aufgerufen wird und die Ansichtshierarchie der MediaController-Ansicht absteigt. – bk138

+1

Aber die Variable "index" wird nie verwendet. – rekire

1

ich den Code von bk138 s geändert beantworten zu Ändern Sie einfach die Farbe der Elemente. Nicht die Zeichen selbst. Diese Lösung ist kompatibel zu alten Geräten in Verbindung mit der Support-Bibliothek 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); 
      } 
     } 
    } 

Dann rufen Sie einfach

styleMediaController(myMC); 

styleMediaController(myMC) im OnPreparedListener des VideoView zu nennen Wäre es funktioniert. Ansonsten hat die MediaController-Ansicht keine Kinder.

+0

Was ist 'setCompatTint'? –

Verwandte Themen