Подтвердить что ты не робот

Выровнять верхнюю часть изображения поверх 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.

4b9b3361

Ответ 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>