IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android exoplayer subtitleview 字幕 居中`置顶`置底位置设置方法 -> 正文阅读

[移动开发]Android exoplayer subtitleview 字幕 居中`置顶`置底位置设置方法

解决办法

????????Talk is cheap. Show me the code.

// 在subtitleView.setCues的地方使用newCues就可以啦~
override fun onCues(cues: MutableList<Cue>) {
            super.onCues(cues)

           val newCues = ArrayList<Cue>()
            for (cue in cues) {
                val newCue = cue.buildUpon().apply {
                    setLine(0.5f, Cue.LINE_TYPE_FRACTION)
                    lineAnchor = Cue.ANCHOR_TYPE_MIDDLE
                }.build()

                newCues.add(newCue)
            }
            
            subtitleView.setCues(newCues)
        }

copy上面的代码, 字幕就可以居中啦, 置顶就把0.5改成0, 置底就改成1?over~

下面分析一下上面代码的形成过程, 有兴趣的可以看一哈~

起因????????

????????我们的首席设计师小姐姐说字幕要居中才好看, 虽然不知道咋设置, 但咱不能在漂亮妹子面前丢人鸭!(行, 给爷👴🏻等着~)
????????在成功的google和百度失败之后, 我决定自己分析源码解决. 当然也是为了让我们成为更有效率的 google/百度 程序员, 于是我就把分析经历整理分享出来~

源码分析

????????下面给个源码分析,?基于exoplayer版本 2.14.1

首先看SubtitleView是个什么东西, 如下

public final class SubtitleView extends FrameLayout implements TextOutput {
    ...
}

ok, SubtitleView只是一个ViewGroup, 不做具体的字幕显示, 那谁来显示字幕呢, 当然是他的childView啦, 而childView当然是通过addView引入的, 搜索addView看到, 如下

public SubtitleView(Context context, @Nullable AttributeSet attrs) {
    ...

    CanvasSubtitleOutput canvasSubtitleOutput = new CanvasSubtitleOutput(context, attrs);
    output = canvasSubtitleOutput;
    innerSubtitleView = canvasSubtitleOutput;
    addView(innerSubtitleView);
    ...
  }

可以看到, 在SubtitleView初始化的时候, 添加了一个childView -> CavasSubtitleOutput, 那绘制字幕一定就在这里面啦! 但是CavasSubtitleOutput中没有重写onDraw函数, 而是重写了dispatchDraw,?这个不是本文的重点(其实是我不了解~), 大家可以自行搜索~

然后就是一层一层地调用跟进啦, 最终我们在SubtitlePainter -> setupTextLayout 函数中, 找到如下代码

if (cueLine != Cue.DIMEN_UNSET) {
      if (cueLineType == Cue.LINE_TYPE_FRACTION) {
        int anchorPosition = Math.round(parentHeight * cueLine) + parentTop;
        textTop =
            cueLineAnchor == Cue.ANCHOR_TYPE_END
                ? anchorPosition - textHeight
                : cueLineAnchor == Cue.ANCHOR_TYPE_MIDDLE
                    ? (anchorPosition * 2 - textHeight) / 2
                    : anchorPosition;
      } else {
        // cueLineType == Cue.LINE_TYPE_NUMBER
        int firstLineHeight = textLayout.getLineBottom(0) - textLayout.getLineTop(0);
        if (cueLine >= 0) {
          textTop = Math.round(cueLine * firstLineHeight) + parentTop;
        } else {
          textTop = Math.round((cueLine + 1) * firstLineHeight) + parentBottom - textHeight;
        }
      }
...
}

重点就是textTop了, 他的值就是y轴上字幕的实际摆放位置啦,? 代码中有稍显复杂的三目表达式, 认真看一下就能理解了(其实我还是觉得用if更清晰些), 所以我们就可以对cueLine和cuelineAnchor赋值进行字幕的位置更改了.

那么赋值是在哪里呢, 又经过了一段时间的认真查看, 我们知道了Cue的构造函数时私有的, 只能通过builder来创建对象, 所以最终就有了上面的解决办法啦~

? ? ? 另外就是 cueLineType == Cue.LINE_TYPE_NUMBER 的类型, 这个看起来是根据第一行字幕的高度来定位位置的, 大家可以根据需求来自己定制~

总结

? ? ? ? 总体来说分析起来还是挺简单的, 只要了解view的一些原理就容易很多了.?

????????楼主是第一次分析源码, 如果文章中有错误的地方, 请各位大佬指点. 以防误导前来学习的同学~

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-23 15:51:56  更:2021-12-23 15:54:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:36:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码