##前言
为什么要写这篇文章呢?

  • Firsr:直接集成ijkplayer的控制界面太丑了
  • Second:无法满足我们的需求

我们来看下直接集成的ijkplayer控制界面:

是不是没法用,那么我们现在来自定义。

##自定义MediaController

首先我们先去看看ijplayer怎么做的,然后我们照葫芦画瓢,去修修改改。

###一、ijplayer的demo如何实现?

package tv.danmaku.ijk.media.example.widget.media;import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.ActionBar;
import android.util.AttributeSet;
import android.view.View;
import android.widget.MediaController;import java.util.ArrayList;public class AndroidMediaController extends MediaController implements IMediaController {private ActionBar mActionBar;public AndroidMediaController(Context context, AttributeSet attrs) {super(context, attrs);initView(context);}public AndroidMediaController(Context context, boolean useFastForward) {super(context, useFastForward);initView(context);}public AndroidMediaController(Context context) {super(context);initView(context);}private void initView(Context context) {}public void setSupportActionBar(@Nullable ActionBar actionBar) {mActionBar = actionBar;if (isShowing()) {actionBar.show();} else {actionBar.hide();}}@Overridepublic void show() {super.show();if (mActionBar != null)mActionBar.show();}@Overridepublic void hide() {super.hide();if (mActionBar != null)mActionBar.hide();for (View view : mShowOnceArray)view.setVisibility(View.GONE);mShowOnceArray.clear();}//----------// Extends//----------private ArrayList<View> mShowOnceArray = new ArrayList<View>();public void showOnce(@NonNull View view) {mShowOnceArray.add(view);view.setVisibility(View.VISIBLE);show();}
}

例子中AndroidMediaController的功能主要是支持将顶部的toolbar和MediaController绑定在一起,一起show/hide.

从上面代码可以看出来AndroidMediaController集成自MediaController也就是说,主要功能是在android.widget.MediaController实现的。

那么我们想要打造个性控制界面,就需要移植MediaController然后做定制。

###二、MediaController的解读
先来看一下API:

一个包含媒体播放器(MediaPlayer)控件的视图。包含了一些典型的按钮,像"播放(Play)/暂停(Pause)", “倒带(Rewind)”, "快进(Fast Forward)"与进度滑动器(progress slider)。它管理媒体播放器(MediaController)的状态以保持控件的同步。

通过编程来实例化使用这个类。这个媒体控制器将创建一个具有默认设置的控件,并把它们放到一个窗口里漂浮在你的应用程序上。具体来说,这些控件会漂浮在通过setAnchorView()指定的视图上。如果这个窗口空闲3秒那么它将消失,直到用户触摸这个视图的时候重现。

当媒体控制器是在一个XML布局资源文件中创建的时候,像show()和 hide()这些函数是无效的。媒体播放器将根据这些规则去显示和隐藏:

  • 在调用setPrevNextListeners()函数之前,"previous"和 "next"按钮都是隐藏的。

  • 如果setPrevNextListeners()函数被调用但传入的监听器参数是null,那么"previous"和 "next"按钮是可见的但是处于禁用状态。

  • “rewind” 和 "fastforward"按钮是显示的,如果不需要可以使用构造函数MediaController(Context, boolean)将boolean设置为false。

几个重要方法解析:

public void hide ()
从屏幕中移除控制器。

public boolean isShowing ()
判断媒体控制器是否处于可见状态

public void onFinishInflate ()
XML文件加载视图完成时调用。这个函数在加载的最后阶段被调用,所有的子视图已经被添加。即使子类重写了onFinishInflate方法,也应该始终确保调用父类方法,以便我们调用

public void setAnchorView (View view)
设置这个控制器绑定(anchor/锚)到一个视图上。例如可以是一个VideoView对象,或者是你的activity的主视图。

public void setMediaPlayer (MediaController.MediaPlayerControl player)
把这个媒体控制器设置到VideoView对象上。

public void setPrevNextListeners (View.OnClickListener next, View.OnClickListener prev)
设置"previous"和 "next"按钮的监听器函数。

public void show (int timeout)
在屏幕上显示这个控制器。它将在闲置’超时 (timeout)’毫秒到达后自动消失。
参数:timeout 这个参数以毫秒为单位。如果设置为0将一直显示到调用hide()函数为止。

android.widget.MediaController就了解到这里,我们接下来要做的就是,copy一份android.widget.MediaController然后进行个性化定制。

###三、移植mediaController
第一步:
首先创建一个自定义的mediaController,我们这里叫 MyMediaController,代码原封不动的把android.widget.MediaController拷进来。

上图左侧是安卓的MediaController,右侧是我们自定义的mediaController

第二步:
接下来我们去改造里面:这里我们需要注意一下接下来要创建的PhoneWindow对象。
如图右侧是我们的改造方案:

那么为什么要这样改造呢?
因为PhoneWindow是隐藏API,我们没法直接使用(文章结尾会补充该知识点)。所以我们需要通过反射去获取。
代码如下:

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

第三步:
更换布局文件:

只需mRoot = inflate.inflate(R.layout.media_my_controller, null);更换布局文件,布局文件根据ui设计的就可以。

这里我们可以自己设计我们的控制界面喽!! 让我们看一下效果:

到这里我们ijkplayer打造个性化控制界面就完成了,不过这里给大家补充一个知识点,就是上面说到的隐藏API。

##补充知识点
//======知识点>
上面我们说到PhoneWindow不能直接使用,而是要通过反着,那么我们先来看下PhoneWindow类。
我们看到注释上面会有@hide,也就是说@hide标记的类和函数称为隐藏API,不能被开发者直接调用,除此之外还有位于包com.android.internal的内部API,也不可以被使用者直接调用,那么这两类API有什么不同呢?

###内部API和隐藏API的不同
隐藏API隐藏是为了防止开发人员使用SDK中未完成或者未稳定(接口和架构方面看)的部分。比如,Bluetooth API在API Level 5(android 2.0)之前就存在,但在API Level 3和4(android 1.5和1.6)中使用@hide隐藏起来了。当该API稳定下来,google的开发人员移除@hide属性,在API Level 5中就有Bluetooth API了。还有很多东西在Level 4和5之间发生了变化。如果程序依赖于某些隐藏API,可能会在新版本的Android OS上运行出现问题。

而内部API则不计划对外开放。这是android的内部餐厅,开发人员可以视为黑盒子。这里面的东西同样可能发生改变。同样的,如果您的程序依赖于内部API,在新的Android发布后,可能遇到麻烦。

隐藏API = 正在开发中
内部API = 黑盒

###内部和隐藏API的编译时和运行时对比
当您使用Android SDK进行开发时,会引用一个非常重要的jar文件android.jar。它位于Android SDK的平台目录SDK_DIR/platforms/platform-X/android.jar(其中X为API Level,可以是5或者10或其它的数字)。在android.jar中,com.android.internal中所有的类移除了,同样的,所有标记为@hide的类、枚举、字段、方法也移除了。

但是当您在设备中运行应用程序时,加载的是framework.jar(大约等价于android.jar),它没有被裁减,包含所有的内部类和隐藏API。所以您可以使用反射机制来访问隐藏API和内部API

~~号外~~福利~~号外~~
程序员的福音: “老曾筋骨祛痛贴”,百年祖传配方,专治腰间盘肩周颈椎坐骨神经腰腿疼痛等,博主亲测效果非常棒,因长期久坐写代码,坐姿不规范导致脖子疼,腰椎疼,用过之后疼痛逐渐缓解,现在已无任何疼痛,用过后让你写代码一身轻松,so easy,妈妈再也不用担心我们写代码了。
购买链接: https://k.weidian.com/tja7GYzB

扫码下方二维码,关注公众号“伟大程序猿的诞生“,回复“膏药”领取优惠券
扫码关注公众号“伟大程序猿的诞生“,更多干货新鲜文章等着你~

公众号回复“资料获取”,获取更多干货哦~
公众号回复“膏药”,领取优惠券哦~

有问题添加本人微信号“fenghuokeji996” 或扫描博客导航栏本人二维码

安卓直播详细教程(三)-----ijkplayer打造个性化控制界面相关推荐

  1. 【ZT】MTK X20编译环境搭建 烧写安卓固件详细教程

    http://jingyan.eeboard.com/article/75888 MTK X20编译环境搭建 MTK X20编译环境搭建 作者: lgkgkfg 上传时间为: 2017-04-17 1 ...

  2. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星 ...

  3. 带视频详细教程三套模板免授权交友盲盒1.8.0H5脱单盲盒交友源码

    简介: 本套源码为H5独立版无需授权,无需公众号,有三套模板可自由切换,后台是thinkphp的框架. 有详细文档搭建教程. 本系统免公众号支持第三方免签约支付支持打包安卓+IOS双端 支付接口:微信 ...

  4. mtk 手机 linux,【ZT】MTK X20编译环境搭建 烧写安卓固件详细教程

    拿到Mediatek X20开发板上网找了一下还没看到一个详细的固件烧写教程,即使是诚迈科技和96boards上也没有详细烧写教程,笔者研究了一下,现在将Mediatek X20开发板烧写固件的详细方 ...

  5. Win11运行安卓超详细教程!芜湖起飞!

    一.前提 Windows 11 版本号为 Build 22000.xxx 或更高版本. 您的电脑硬件 BIOS/UEFI 支持虚拟化功能. 二.支持 本教程适用于 Windows 11 正式版和预览版 ...

  6. 小米6无人直播详细教程+工具包

    最新2021版小米6刷无人直播更新包 链接:https://pan.baidu.com/s/1QTqJnAQpOb4HAsD28PkrKA 提取码:2021 百度网盘下载到电脑解压有教程工具

  7. 安卓USB开发教程 三 USB Accessory

    USB Accessory(配件模式) USB 配件模式允许用户连接专为 Android 设备设计的 USB 主机硬件.配件必须遵守 Android Accessory Development Kit ...

  8. vue - element <upload> 组件批量上传文档,可携带其他表单数据项一同与文件 “手动提交“ 服务器(类似百度文库系统批量上传前端界面与逻辑)超详细教程示例源码,提供界面与逻辑完整源码

    效果图 本示例使用的是 element 组件库,其实什么组件库都行(逻辑是一样),只要你是 vue.js 项目就能使用本教程. 本文实现了 vue + element 使用 upload 组件批量上传 ...

  9. 远程控制详细教程,同时支持手机控制

    ​"我需要一些帮助,目前我因为休假旅游去了,需要临时远程办公.我工作的电脑运行的是Windows 10系统,我如何操作才能远程控制公司的电脑进行远程办公?我之前没用过远程控制相关的工具,什么 ...

最新文章

  1. python 学习笔记8 (模块)
  2. 国内国外虚拟主机的对比
  3. 【GAN优化】小批量判别器如何解决模式崩溃问题
  4. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16
  5. express中response.js 提供的sendFile方法的调试
  6. c语言中fr,关于frwite()函数的一个问题,弄了好久就是不行,求解啊!
  7. 如何映射本地虚拟机或远程服务器磁盘到本地
  8. java.util.concurrent.locks.Lock文档说明
  9. shebang_Shebang来Java了吗?
  10. 180页PPT,讲解人工智能技术与产业发展
  11. button的onclick函数一直刷新
  12. Struts2 转换器
  13. 面向对象编程已死,OOP 永存!
  14. vrrp协议原理与应用
  15. nmcli管理网络 RHEL8和CentOS8怎么重启网络
  16. 信号检测与判决的五大准则
  17. AE duik插件运用-人物行走动画
  18. hdu5285-wyh2000 and pupil-(染色法二分图判定)
  19. 内涵社区APP,一款集内涵段子,百思不得其姐,煎蛋于一身的搞笑社区
  20. 下厨房(istringstream的使用)----网易2017内推笔试编程题合集

热门文章

  1. 改注册表让win7/win8中的控制面板项的名字随心所欲
  2. 开源之夏 2022 重磅来袭,欢迎报名 Casbin社区项目
  3. html5 横向溢出隐藏,溢出:隐藏的HTML5视频
  4. 忘记手机密码怎么用计算机解开,手机忘记密码怎么办?教你三种方法帮你搞定!...
  5. 谷歌翻译服务退出中国大陆,使用SwitchyOmega仍需要全文翻译,恢复访问的方法
  6. Centos6安装SGE以及集群配置
  7. 【推免】笔试+机试+面试 准备
  8. 关于大数据,需要你读懂的10个小故事
  9. 企业数字化转型:聊聊数据思维!
  10. 只有程序员才能看懂的16张高端漫画