Выровнять ImageView с EditText по горизонтали - PullRequest
4 голосов
/ 21 февраля 2012

Я очень стараюсь найти способ выравнивания EditText и ImageView правильно на Android.Я продолжаю получать этот результат:

enter image description here

XML-часть довольно проста:

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:scaleType="centerInside"
        android:src="@drawable/android"
        android:visibility="gone" />

    <EditText
        android:id="@+id/edittext"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:singleLine="true" />

</LinearLayout>

Я также попробовал многие из приведенных ниже предложений, в том числе PravinCG(RelativeLayout с alignTop / alignBottom):

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/edittext"
        android:layout_alignTop="@+id/edittext"
        android:scaleType="centerInside"
        android:src="@drawable/android"
        android:visibility="visible" />

    <EditText
        android:id="@+id/edittext"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/image"
        android:hint="@string/username"
        android:singleLine="true" />

</RelativeLayout>

Но результат точно такой же.

Я пытался поиграть с отступом фона EditText, собственной высотой, но безрезультатно.

Фон рисования EditText отличается в версиях / ROM для Android, и я хочу поддерживать их все.

Как сделать это выравнивание идеальным на любой версии для Android(и стиль)?

Ответы [ 7 ]

8 голосов
/ 22 февраля 2012

Наконец-то найдено подходящее решение, которое масштабируется для разных версий Android / ROM / стилей.

Основная проблема заключается в том, что фон рисования самого EditText имеет прозрачное заполнение: enter image description here

ТакжеЯ заметил, что это прозрачное заполнение варьируется много между различными версиями / ПЗУ / стилями Android (например, в стандартном ICS вообще нет прозрачного заполнения).

ПосерединеВ заключение, мой оригинальный код правильно выравнивает мой ImageView с моим EditText.Тем не менее, я действительно хочу выровнять свой ImageView с видимой частью фона EditText.

Чтобы добиться этого, я сканирую растровое изображение, которое я создаю из фона моего EditText.Я сканирую его сверху вниз и снизу вверх, чтобы найти количество полностью прозрачных линий и использую эти значения в качестве верхнего / нижнего отступа для моего ImageView.Все это последовательно занимает менее 5 мс на моем N1.Вот код:

if(editor.getBackground() != null) {
    int width = editor.getWidth();
    int height = editor.getHeight();
    Drawable backgroundDrawable = editor.getBackground().getCurrent();

    // Paint the editor's background in our bitmap
    Bitmap tempBitmap =  Bitmap.createBitmap(width, height, Config.ARGB_4444);
    backgroundDrawable.draw(new Canvas(tempBitmap));

    // Get the amount of transparent lines at the top and bottom of the bitmap to use as padding
    int topPadding = countTransparentHorizontalLines(0, height, tempBitmap);
    int bottomPadding = countTransparentHorizontalLines(height-1, -1, tempBitmap);

    // Discard the calculated padding if it means hiding the image
    if(topPadding + bottomPadding > height) {
        topPadding = 0;
        bottomPadding = 0;
    }

    tempBitmap.recycle();

    // Apply the padding
    image.setPadding(0, topPadding, 0, bottomPadding);
}

private int countTransparentHorizontalLines(int fromHeight, int toHeight, Bitmap bitmap) {
    int transparentHorizontalLines = 0;
    int width = bitmap.getWidth();
    int currentPixels[] = new int[width];
    boolean fullyTransparentLine = true;

    boolean heightRising = (fromHeight < toHeight);
    int inc =  heightRising ? 1 : -1;

    for(int height = fromHeight; heightRising ? (height < toHeight) : (toHeight < height); height+=inc) {
        bitmap.getPixels(currentPixels, 0, width, 0, height, width, 1);

        for(int currentPixel : currentPixels) {
            if(currentPixel != Color.TRANSPARENT && Color.alpha(currentPixel) != 255) {
                fullyTransparentLine = false;
                break;
            }
        }

        if(fullyTransparentLine)
            transparentHorizontalLines++;
        else
            break;
    }

    return transparentHorizontalLines;
}

И он работает как шарм!

it works!

1 голос
/ 18 июня 2012

Чтобы избавиться от отступов в EditText, просто используйте пользовательское изображение в качестве фона ... достаточно прямоугольника с некоторой тенью ... или что угодно ... и назначьте фон для EditText, используя

android:background="@drawable/myBackground"
1 голос
/ 21 февраля 2012

Вы пробовали методы setCompoundDrawables() для EditText.

Вы можете попробовать установить собственные границы, используя метод setBounds() на Drawable или метод setCompoundDrawablesWithInstrinsicBounds().

Это должно работать на всех устройствах.

1 голос
/ 21 февраля 2012

Вам необходимо использовать RelativeLayout с атрибутом android:align_bottom и android:align_Top.Я не пишу код, хотя.

0 голосов
/ 28 августа 2013

Я использовал быстрый обходной путь, просто переместив EditText вниз на 2dp, просто добавив следующее к EditText:

android:layout_marginBottom="-2dp"
android:layout_marginTop="2dp"
0 голосов
/ 21 февраля 2012

удалите свойства editText и ImageView android: gravity = "center" и установите для свойства gravity linearlayout значение center_vertical.

0 голосов
/ 21 февраля 2012

использовать android:layout_centerInParent = true для редактирования текста и посмотреть, работает ли он?

...