【翻译】 Android上实现文字围绕图片的布局
在这边文章中,我将会介绍如何去实现一个在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); }
本文由zhiweiofli编辑发布,转载请注明出处,谢谢。
相关推荐
相对布局只要是要有参照物,即谁在谁下方,谁在谁左边,和谁左对齐,等等。然后再添加一个按钮使其在textView的下方以及在立即更新按钮的左边。android:text="发现新的版本,您想现在更新吗?