2019-12-30 根据文字尾端设置图片位置

近期产品提出,需要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来解决此问题

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容