Выровнять верхнюю часть изображения поверх TextView
Я хочу создать макет, который выравнивает вершину изображения в верхней части TextView следующим образом:
--------- Text text text text text text text
| Image | text text text text text text text
--------- text text text text text text text
text text text text text text text
text text text text text.
Я попытался сделать это, установив android:drawableLeft
в мое изображение, но это центрирует изображение по вертикали:
Text text text text text text text
--------- text text text text text text text
| Image | text text text text text text text
--------- text text text text text text text
text text text text text.
Возможно ли это с помощью только TextView или мне нужно создать RelativeLayout, содержащий TextView и ImageView?
Вот XML-макет для моего TextView, который дает неправильный макет:
<TextView
android:gravity="top"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/image"
android:drawablePadding="8dp"
android:text="@string/text" />
Атрибут android:gravity="top"
влияет только на текст, а не на drawable.
Ответы
Ответ 1
Вы можете выровнять составную часть Drawable с вершиной (или снизу), создав пользовательский Drawable, который обертывает ваш Drawable, а затем манипулирует чертежом вашего пользовательского Drawable, переопределяя метод onDraw(Canvas)
.
Пример, приведенный ниже, является самым простым примером. Это выравнивает изображение вверху, но вы также можете сделать его выровненным в нижней, левой или правой части TextView, выполнив требуемую логику в методе onDraw(Canvas)
. Возможно, вы также захотите создать резервную копию в onDraw(Canvas)
, чтобы сделать пиксель реализации проекта идеальным.
Использование образца:
GravityCompoundDrawable gravityDrawable = new GravityCompoundDrawable(innerDrawable);
// NOTE: next 2 lines are important!
innerDrawable.setBounds(0, 0, innerDrawable.getIntrinsicWidth(), innerDrawable.getIntrinsicHeight());
gravityDrawable.setBounds(0, 0, innerDrawable.getIntrinsicWidth(), innerDrawable.getIntrinsicHeight());
mTextView.setCompoundDrawables(gravityDrawable, null, null, null);
Пример кода:
public class GravityCompoundDrawable extends Drawable {
// inner Drawable
private final Drawable mDrawable;
public GravityCompoundDrawable(Drawable drawable) {
mDrawable = drawable;
}
@Override
public int getIntrinsicWidth() {
return mDrawable.getIntrinsicWidth();
}
@Override
public int getIntrinsicHeight() {
return mDrawable.getIntrinsicHeight();
}
@Override
public void draw(Canvas canvas) {
int halfCanvas= canvas.getHeight() / 2;
int halfDrawable = mDrawable.getIntrinsicHeight() / 2;
// align to top
canvas.save();
canvas.translate(0, -halfCanvas + halfDrawable);
mDrawable.draw(canvas);
canvas.restore();
}
}
Ответ 2
Попробуйте использовать RelativeLayout......
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:src="@drawable/ic_launcher" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/imageView1"
android:text="@string/text" />
</RelativeLayout>
Ответ 3
Я думаю, есть более простой и быстрый способ, чем 3 взгляда. Вам нужно подготовить правильный 9patch для значка, а затем использовать FrameLayout. Даже возможно иметь только одиночный EditText
/TextView
с использованием того же самого, что и для фона. Более подробная информация приведена в этом ответе.
Ответ 4
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:src="@drawable/ic_launcher" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/imageView1"
android:text="@string/text" />
</RelativeLayout>
Это сделало бы это.
Ответ 5
Используйте layout_alignTop
. С его помощью вы можете выровнять верхнюю часть представления в верхней части другого представления
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/text" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/textView1"
android:layout_toLeftOf="@id/textView1"
android:src="@drawable/ic_launcher" />
</RelativeLayout>