近期产品提出,需要gif图紧贴textview最后一个字的末端展示,因为之前没有集成相应的控件只能自己搞出一个比较土的方法:
使用textview.getLayout()获取textview的了layout,并通过textview.length()获取整体文字的字数,通过getLineForOffset能拿到指定文字的所在行数(单位为int型:layout.getLineForOffset(index)),然后getLineBounds得到这一行的外包矩形(如需手动绘制下划线也可通过此方法获取下划线位置),int Bottom = bound.bottom就可以获取实际上y轴的坐标, layout.getSecondaryHorizontal(index)可以获取字符右边x坐标,这样x,y坐标就有了setLayoutParams就能使图片紧跟最后一个字了。
但是经测试,如果直接settext之后直接调用上述方法gif图并不会处于文字末端,因为textview还未绘制完成,此时 layout.getSecondaryHorizontal(index)会有数组越界的问题,应在settext之后使用textview.post中实现上述方法,post方法会在后才进行measure,layout和draw流程中执行Looper.loop()进入循环,等待消息去驱动它继续执行下去(实际上是主线程Runnable在等待而不是post这里不讨论)
示例:
private void getTextViewBottomY(final TextView tv, final int index) {
tv.post(new Runnable() {
@Override
public void run() {
Layout layout = tv.getLayout();
Rect bound = new Rect();
int line = layout.getLineForOffset(index);
layout.getLineBounds(line, bound);
int yAxisBottom = bound.bottom;//字符底部y坐标
float xAxisRight = layout.getSecondaryHorizontal(index);//字符右边x坐标
setGifCoordinates((int) xAxisRight, yAxisBottom);
}
});
}
private void setGifinates(int x, int y) {
LayoutParams gifViewParams = new LayoutParams(getDimen(R.dimen.dimen_23dp),
getDimen(R.dimen.dimen_25dp));
gifViewParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
gifViewParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
gifViewParams.leftMargin = x + getDimen(R.dimen.dimen_17dp);
gifViewParams.topMargin = y+ getDimen(R.dimen.dimen_2dp);
mGifView.setLayoutParams(gifViewParams);
}
此方法最好在实在没有其他解决方法时候使用,最好的方法是直接使用自定义的textview来解决此问题