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
Antwort
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.
'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
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
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);
Ihr Code funktioniert nicht für mich. Was ist der Grund für den "Index"? 'v.getChildCount()' gibt jedes Mal 0 zurück. – rekire
@rekire Der Parameter index wird benötigt, weil die Funktion rekursiv aufgerufen wird und die Ansichtshierarchie der MediaController-Ansicht absteigt. – bk138
Aber die Variable "index" wird nie verwendet. – rekire
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.
Was ist 'setCompatTint'? –
Hier ist ein Beispiel MediaController Anpassung: http://stackoverflow.com/questions/12482203/how-to-create-custom-ui-for-android-mediacontroller/14323144#14323144 – Blago