Android 自定义MediaController

做播放器通常会用到MediaController这个控制器,但系统MediaController的UI通常又要修改,于是我想到3个思路:1.自己写一个,卧槽return false不解释。2.继承MediaController,尝试过发现私有Field和Method不好弄false。3.copy代码,是他是他就是他~


1.创建MyMediaController:

好了,就是从MediaConrtoller里copy代码

public class MyMediaController extends FrameLayout{

//内容...内容...

}


2.处理报错:

这时候会发现三个报错:

1.mAccessibilityManager= AccessibilityManager.getInstance(context);

getInstance方法虽然是public的,但是@hide不能使用,所以报错。

AccessibilityManager类是无障碍服务的,暂时不需要,砍掉吧。。。如果要用,可以用反射机制调用。

2.mWindow =newPhoneWindow(mContext);

找不到这个类,ok,利用反射创建:

(注意,MediaController导包com.android.internal.policy.PhoneWindow位置貌似有点问题,应该是com.android.internal.policy.impl.PhoneWindow)

代码:

[java]  view plain  copy
  1. try {  
  2. Class clazz = Class.forName("com.android.internal.policy.impl.PhoneWindow");  
  3. Constructor constructor = clazz.getDeclaredConstructor(Context.class);  
  4. mWindow = (Window) constructor.newInstance(mContext);  
  5. catch (Exception e) {  
  6. e.printStackTrace();  
  7. }  

另外,网上找到另外个实现方法mWindow = PolicyManager.makeNewWindow(mContext);也能用反射得出,包是com.android.internal.policy.PolicyManager

3.mPlayDescription和mPauseDescription

这两货貌似是朗读描述的,删了。。。


3.修改UI:

1.在 makeControllerView里面改成我们的布局:
[html]  view plain  copy
  1. mRoot = inflate.inflate(R.layout.mymedia_controller, null);  
[html]  view plain  copy
  1.   
2.在initControllerView(View view)方法里面把com.android.internal.R替换成我们的R,再替换成我们的资源就行啦。

3.另外系统布局里面的上一首pre和下一首next是Gone的,设置了Listener才会显示,可以在外面的MediaConrtoller对象调用 setPrevNextListeners方法就能显示了。
Android中的MediaController是一个UI组件,可以控制视频播放的进度、音量等,同时也可以自定义它的外观和行为。下面是自定义MediaController的步骤: 1. 创建新的布局文件 在res/layout目录下创建一个新的布局文件(例如:custom_media_controller.xml),用来定义你自己的MediaController的布局。 2. 定义MediaController的布局 在布局文件中定义MediaController的布局,可以使用各种布局控件,如Button、SeekBar等。 ``` <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageButton android:id="@+id/media_controller_play_pause_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_play_arrow_black_24dp"/> <SeekBar android:id="@+id/media_controller_seek_bar" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"/> <TextView android:id="@+id/media_controller_time_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="00:00"/> </LinearLayout> ``` 以上代码创建了一个水平方向的LinearLayout,包含一个播放/暂停按钮、一个SeekBar和一个显示时间的TextView。 3. 创建自定义MediaController类 创建一个新的Java类,继承自MediaController类,用于加载自定义的布局和处理控件的事件。 ``` public class CustomMediaController extends MediaController { private ImageButton playPauseButton; private SeekBar seekBar; private TextView timeTextView; public CustomMediaController(Context context) { super(context); } @Override public void setAnchorView(View view) { super.setAnchorView(view); // 加载自定义布局 View customView = LayoutInflater.from(getContext()).inflate(R.layout.custom_media_controller, null); addView(customView); // 初始化控件 playPauseButton = (ImageButton) customView.findViewById(R.id.media_controller_play_pause_button); seekBar = (SeekBar) customView.findViewById(R.id.media_controller_seek_bar); timeTextView = (TextView) customView.findViewById(R.id.media_controller_time_text); // 处理控件的事件 playPauseButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (isPlaying()) { pause(); playPauseButton.setImageResource(R.drawable.ic_play_arrow_black_24dp); } else { start(); playPauseButton.setImageResource(R.drawable.ic_pause_black_24dp); } } }); seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { seekTo(progress); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { // do nothing } @Override public void onStopTrackingTouch(SeekBar seekBar) { // do nothing } }); } @Override public void show() { super.show(); // 更新SeekBar的进度和时间 seekBar.setMax(getDuration()); seekBar.setProgress(getCurrentPosition()); timeTextView.setText(formatTime(getCurrentPosition()) + " / " + formatTime(getDuration())); } @Override public void hide() { super.hide(); } private String formatTime(int time) { int seconds = time / 1000; int minutes = seconds / 60; int remainingSeconds = seconds % 60; return String.format("%02d:%02d", minutes, remainingSeconds); } } ``` 4. 使用自定义MediaController 使用自定义MediaController只需要将其设置给VideoView即可。 ``` VideoView videoView = (VideoView) findViewById(R.id.videoView); CustomMediaController mediaController = new CustomMediaController(this); videoView.setMediaController(mediaController); mediaController.setAnchorView(videoView); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值