Вопрос по android-layout, vertical-alignment, drawable, textview, android – Выровнять верх изображения по верху TextView

35

Я хочу создать макет, который выравнивает верх изображения по верху TextView следующим образом:

<code>---------  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.
</code>

Я пытался сделать это, установивandroid:drawableLeft к моему изображению, но это центрирует изображение по вертикали:

<code>           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.
</code>

Это возможно только с TextView или мне нужно создать RelativeLayout, содержащий TextView и ImageView?

Вот макет XML для моего TextView, который дает неправильный макет:

<code><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" />
</code>

android:gravity="top" Атрибут, кажется, влияет только на текст, а не на рисование.

нужно ли вам сверху или слева Shankar Agarwal
@ Клейс Ты нашел ответ на это? Я также сталкиваюсь с подобной проблемой user3265443
Я думаю, что вам нужно использовать относительныйLayout ... amp
как говорит @amp использовать относительное расположение его лучше всего .. MAC
@ user3265443 Используйте собственный Drawable, который оборачивает ваш Drawable. Смотрите мой ответ для примера кода:stackoverflow.com/a/28906636/710990. Reinier

Ваш Ответ

5   ответов
0

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>
1

что есть более простой и быстрый способ, чем иметь 3 просмотра. Вам нужно подготовить правильный 9patch для значка, а затем использовать FrameLayout. Возможно даже иметь толькоsingle EditText / TextView используя тот же Drawable как их фон. Более подробно описано вэтот ответ.

1

<?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>
Смысл CompoundDrawable состоит в том, чтобы минимизировать количество представлений в иерархии представлений. Это решение не отвечает на вопрос, даже если оно будет выглядеть одинаково.
0
<?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>

24

создав собственный Drawable, который оборачивает ваш Drawable, а затем манипулировать чертежом вашего Custom 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();
    }
}
как использовать его для выравнивания текста и оставить нарисованным слева от textview
отличное решение. Это должен быть принятый ответ.
Мне пришлось установить нижние границы gravityDrawable на 0: gravityCompoundDrawable.setBounds (0, 0, originalCompoundDrawable.getIntrinsicWidth (), 0);
Я не понимаю, как это принятый ответ. Он не будет компилироваться, если только вы не переопределите getOpacity (), setAlpha (...) и setColorFilter (...). Какова будет функциональность для этих 3 методов?
работал .. спасибо

Похожие вопросы