安卓自定义MediaController的UI界面

来源:互联网 发布:js移除元素属性 编辑:程序博客网 时间:2024/06/06 07:29

做播放器通常会用到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)

代码:

try {Class clazz = Class.forName("com.android.internal.policy.impl.PhoneWindow");Constructor constructor = clazz.getDeclaredConstructor(Context.class);mWindow = (Window) constructor.newInstance(mContext);} catch (Exception e) {e.printStackTrace();}

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

3.mPlayDescription和mPauseDescription

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


3.修改UI:

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

3.另外系统布局里面的上一首pre和下一首next是Gone的,设置了Listener才会显示,可以在外面的MediaConrtoller对象调用setPrevNextListeners方法就能显示了。



是不是很简单呢!~




1 0
原创粉丝点击