前言
最近接到需求要求两行字幕滚动显示,由于公司是做实时语音字幕的,字幕滚动也尤其重要,刚开始忽略了焦点问题,使用Textview 的 scrollTo()方法去滚动字幕,做好之后发现当中英文字幕条都出现时(也就是屏幕上有两个字幕条时)只有一个实现了滚动,而且使用遥控控制字幕条上下移动的功能也失效。这果断判断是焦点问题,那么怎么让一个字幕条可以滚动又不占用焦点呢,只有自定义view了。
实现思路
- 获取到要显示的文本的高度,我们的字幕是显示两行,这里就以两行为例了
- 获取到全部文本展示的话view的高度
- 当要展示的文本大于两行,使用两行的高度减去全部的高度
- 使用canvas.translate(x, y)
如图
实线部分为正在现在区域,虚线为将要显示的区域
绘制时将y向上移动一行的高度就可以实现了,是不是很简单
主要代码
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// canvas.drawText(text, 0, 400, 0, getRight(), paintText);
StaticLayout staticLayout = StaticLayout.Builder.obtain(text, 0, text.length(), paintText, getRight()-getLeft()).build();
canvas.save();
// DynamicLayout.Builder.obtain(base, paintText,getRight());
int textHeight = staticLayout.getHeight();
if (staticLayout.getLineCount() > 2) {
int twoLineHeight = staticLayout.getLineTop(2);
canvas.translate( 0, twoLineHeight - textHeight-offset);
} else {
canvas.translate( 0, offset);
}
staticLayout.draw(canvas);
}
offset
注意 : 在实际使用中发现,当字幕全是英文时,顶部会有一部分没有完全遮住,所以移动时要减去一定的偏移量,这里也可以通过设置行间距来解决
结尾
写这么长时间代码第一次发博客,我也是很垃圾了,不过以后会继续努力的,有什么不对的可以指出,大家相互学习共同进步