Этот пример поможет вам, использовать место под картинкой, которое обычно остается пустым.
Начиная с api 8 (Android 2.2) появился новый интерфейс LeadingMarginSpan2, который позволяет создавать отступ текста для N первых строк. На картинке создан отступ в 50 пикселей для 3 первых строк.
Итак, приступим.
1. Разметка.
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<TextView
android:textSize="18.0sp"
android:id="@+id/message_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/text" />
<ImageView
android:src="@drawable/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/icon" />
</RelativeLayout>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<TextView
android:textSize="18.0sp"
android:id="@+id/message_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/text" />
<ImageView
android:src="@drawable/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/icon" />
</RelativeLayout>
2. Реализация класса LeadingMarginSpan2.
class MyLeadingMarginSpan2 implements LeadingMarginSpan.LeadingMarginSpan2 {
private int margin;
private int lines;
MyLeadingMarginSpan2(int lines, int margin) {
this.margin = margin;
this.lines = lines;
}
/* Возвращает значение, на которе должен быть добавлен отступ */
@Override
public int getLeadingMargin(boolean first) {
if (first) {
/*
* Данный отступ будет применен к количеству строк
* возвращаемых getLeadingMarginLineCount()
*/
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) {}
/*
* Возвращает количество строк, к которым должен быть
* применен отступ возвращаемый методом getLeadingMargin(true)
* Замечание:
* Отступ применяется только к N строкам первого параграфа.
*/
@Override
public int getLeadingMarginLineCount() {
return lines;
}
};
private int margin;
private int lines;
MyLeadingMarginSpan2(int lines, int margin) {
this.margin = margin;
this.lines = lines;
}
/* Возвращает значение, на которе должен быть добавлен отступ */
@Override
public int getLeadingMargin(boolean first) {
if (first) {
/*
* Данный отступ будет применен к количеству строк
* возвращаемых getLeadingMarginLineCount()
*/
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) {}
/*
* Возвращает количество строк, к которым должен быть
* применен отступ возвращаемый методом getLeadingMargin(true)
* Замечание:
* Отступ применяется только к N строкам первого параграфа.
*/
@Override
public int getLeadingMarginLineCount() {
return lines;
}
};
3. В OnCreate, создаем объект SpannableString и применяем новый стиль.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String text = getString(R.string.text);
// Получаем иконку и ее ширину
Drawable dIcon = getResources().getDrawable(R.drawable.icon);
int leftMargin = dIcon.getIntrinsicWidth() + 10;
// Устанавливаем иконку в R.id.icon
ImageView icon = (ImageView) findViewById(R.id.icon);
icon.setBackgroundDrawable(dIcon);
SpannableString ss = new SpannableString(text);
// Выставляем отступ для первых трех строк абазца
ss.setSpan(new MyLeadingMarginSpan2(3, leftMargin), 0, ss.length(), 0);
TextView messageView = (TextView) findViewById(R.id.message_view);
messageView.setText(ss);
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String text = getString(R.string.text);
// Получаем иконку и ее ширину
Drawable dIcon = getResources().getDrawable(R.drawable.icon);
int leftMargin = dIcon.getIntrinsicWidth() + 10;
// Устанавливаем иконку в R.id.icon
ImageView icon = (ImageView) findViewById(R.id.icon);
icon.setBackgroundDrawable(dIcon);
SpannableString ss = new SpannableString(text);
// Выставляем отступ для первых трех строк абазца
ss.setSpan(new MyLeadingMarginSpan2(3, leftMargin), 0, ss.length(), 0);
TextView messageView = (TextView) findViewById(R.id.message_view);
messageView.setText(ss);
}
Исходный код: MyLeadingMarginSpan2.zip
is it possible to make the imageview look like float right?
March 30, 2012 @ 07:07
|Thanks a lot for sharing this code. Worked perfectly
July 26, 2012 @ 15:05
|