2010-01-11 106 views
8

有沒有辦法自定義MediaController?我需要改變按鈕的樣式,SeekBar等更改android MediaController的樣式

+0

以下是一個MediaController自定義示例:http://stackoverflow.com/questions/12482203/how-to-create-custom-ui-for-android-mediacontroller/14323144#14323144 – Blago 2013-01-14 17:15:41

回答

3

方法makeControllerView被意圖覆蓋,所以你可以提供自己的看法。不幸的是,它現在是隱藏的。

您可能想要獲取MediaController的源代碼並重新實現它,或者將隱藏方法複製並粘貼到子類中,以便自定義它。

+0

'makeControllerView' is'protected' for我正在看的來源。有人知道什麼時候從「私人」變爲「受保護」? – William 2015-01-29 20:22:50

+0

哦,也許你正在討論'android.widget.MediaController'中的'makeControllerView'的javadoc中的@hide。當這個javadoc位似乎停止了@ @ Override註解的工作時,它實際上並不能防止重寫該方法。原來的問題幾乎沒有改變 - 這是否是私人的? – William 2015-01-29 22:41:15

4

你可以做的是遞歸你的MediaController的視圖層次和編程設置搜索欄的繪製:

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

然後,只需調用

styleMediaController(myMC); 
+0

您的代碼對我無效。 paremeter'index'的原因是什麼? 'v.getChildCount()'每次返回0。 – rekire 2012-12-28 12:02:23

+0

@rekire索引參數是必需的,因爲該函數自身被遞歸調用,降序MediaController視圖的視圖層次結構。 – bk138 2012-12-29 14:21:55

+1

但是從不使用變量'index'。 – rekire 2012-12-29 14:39:28

1

我改變bk138的的代碼回答到只需更改元素的顏色即可。本身並不是可繪製的。該解決方案與舊版設備以及支持庫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); 
      } 
     } 
    } 

然後,只需調用

styleMediaController(myMC); 

只好打電話styleMediaController(myMC)VideoViewOnPreparedListener,使其工作。否則,MediaController視圖沒有子項。

+0

什麼是'setCompatTint'? – 2017-07-14 17:09:23