在这边文章中,我将会介绍如何去实现一个在Android系统中不常见的布局:文字围绕图片布局。

这个布局并不属于Android模式,但在处理相同的情景下,它是一样的实用。

在你正式使用它到实践项目前,你需对其进行一定的修改,毕竟它只是一个例子代码

以下是例子的布局:

 <ScrollView        android:layout_width="match_parent"        android:layout_height="match_parent">        <RelativeLayout            android:layout_width="match_parent"            android:layout_height="match_parent">            <TextView                android:id="@+id/text"                android:layout_width="match_parent"                android:layout_height="wrap_content"></TextView>            <ImageView                android:id="@+id/icon"                android:src="@drawable/rectangle"                android:layout_width="150dp"                android:layout_height="150dp"></ImageView>        </RelativeLayout>    </ScrollView>

你可以使用 LeadingMarginSpan.LeadingMarginSpan2 来实现我们的布局。

通过实现LeadingMarginSpan.LeadingMarginSpan2 接口,我们可以指定”围绕段落“的行数以及“段落的第一行”和被围绕对象的边距。

class MyLeadingMarginSpan2 implements LeadingMarginSpan.LeadingMarginSpan2 {        private int margin;        private int lines;        MyLeadingMarginSpan2(int lines, int margin) {            this.margin = margin;            this.lines = lines;        }        /**         * Apply the margin         *         * @param first         * @return         */        @Override        public int getLeadingMargin(boolean first) {            if (first) {                return margin;            } else {                return 0;            }        }        @Override        public void drawLeadingMargin(Canvas c, Paint p, int x, int dir,                                      int top, int baseline, int bottom, CharSequence text,                                      int start, int end, boolean first, Layout layout) {}        @Override        public int getLeadingMarginLineCount() {            return lines;        }    };

我们只需要计算文本需要的行数,以及其实际的边距和右边距。

在这里,我们所需的行数=图片的高度,边距=图片的宽度+一点点额外的边距。

public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mTextView = (TextView) findViewById(R.id.text);        mImageView = (ImageView) findViewById(R.id.icon);        final ViewTreeObserver vto = mImageView.getViewTreeObserver();        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {            @Override            public void onGlobalLayout() {                mImageView.getViewTreeObserver().removeOnGlobalLayoutListener(this);                finalHeight = mImageView.getMeasuredHeight();                finalWidth = mImageView.getMeasuredWidth();                makeSpan();            }        });    }}

我的实现简单而原始,用 float textLineHeight = mTextView.getPaint().getTextSize(); 计算文本的行数。读者可以通过添加一些padding,margin 或者你也可以通过类Rect来计算文本的四条边等方式来改善一下代码的效果:

 /**     * This method builds the text layout     */    private void makeSpan() {        /**         * Get the text         */        String plainText=getResources().getString(R.string.text_sample);                int allTextStart = 0;        int allTextEnd = htmlText.length() - 1;        /**         * Calculate the lines number = image height.         * You can improve it... it is just an example         */        int lines;        Rect bounds = new Rect();        mTextView.getPaint().getTextBounds(plainText.substring(0,10), 0, 1, bounds);        //float textLineHeight = mTextView.getPaint().getTextSize();        float fontSpacing=mTextView.getPaint().getFontSpacing();        lines = (int) (finalHeight/fontSpacing);        /**         * Build the layout with LeadingMarginSpan2         */        MyLeadingMarginSpan2 span = new MyLeadingMarginSpan2(lines, finalWidth +10 );        mSpannableString.setSpan(span, allTextStart, allTextEnd,                   Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);        mTextView.setText(mSpannableString);    }



原文: http://gmariotti.blogspot.com/2014/03/snippet-align-textview-around-image.html

本文由zhiweiofli编辑发布,转载请注明出处,谢谢。

更多相关文章

  1. 为什么要学习 Markdown?究竟有什么用?
  2. 模仿微信界面tabhost底部导航——使用继承ActivityGroup方式
  3. 手机浏览器浏览WebApp弹出的键盘遮盖住文本框的解决办法
  4. 多字文本android:ellipsize属性不正常工作的解决办法
  5. Android(安卓)studio设置资源文件背景及背景选择器专题
  6. Android开发实践:布局的平分
  7. (布局)Android(安卓)应用程序窗体显示状态操作(requestWindowFeatur
  8. Android(安卓)中使用EditText 点击全选再次点击取消全选功能
  9. 【边做项目边学Android】知识点:Android控件系列之Toast

随机推荐

  1. RPA 2020.11 all in one 安装
  2. Django-bootstrap3|在Django中快速使用Boo
  3. 高中学历的前端又如何?照样可以年薪30万!
  4. 【工具】历史文章分类汇总-V6 | Python数
  5. 爬虫进阶:反反爬虫技巧
  6. 官方示例(十三):3步70行代码开发GIS点坐标技
  7. 5分钟了解Python语言的简单介绍
  8. 内卷?猝死?企业如何利用数据分析提升人效比
  9. 推荐一种Python安装的方法
  10. 运行你的第一个Python程序