Intereting Posts
Как использовать Android aaptOptions? Получить последний загруженный URL-адрес веб-обозревателя без использования webView.goBack () в Android Android JobScheduler слишком часто работает при использовании setPeriodic () Данные по нисходящей линии связи Android через Wi-Fi и данные по восходящей линии связи через мобильную сеть Мобильные направления движения в Интернете из текущего местоположения Строка действий отображается неправильно при возврате из режима погружения Android сохранить изображение в папку res / drawable Пример использования переднего плана Jenkins & Android эмулятор: эмулятор не запускался; сдаваться Кнопка раунда в Android Зеленые изображения при выполнении кодировки JPEG из YUV_420_888 с использованием новой камеры Android2 api Android-предоставление альтернативных ресурсов не работает? «Предупреждение: не размещайте классы контекста Android в статических полях; Это утечка памяти (а также прерывает Instant Run) " Отображение на заблокированном экране Android Как реализовать HTTP-сервер на android

Выравнивание ImageView с помощью EditText по горизонтали

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

Введите описание изображения здесь

Часть 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 отличается от версий Android / ROM, и я хочу поддержать их всех.

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

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

Основная проблема заключается в том, что сам редактор EditText имеет прозрачное дополнение: Введите описание изображения здесь

Кроме того, я заметил, что это прозрачное дополнение сильно варьируется между различными версиями Android / ROM / стилями (например, у акций 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; } 

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

оно работает!

Вам нужно использовать RelativeLayout с android:align_bottom и android:align_Top . Однако я не пишу код.

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

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

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

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

 android:background="@drawable/myBackground" 

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

Удалить свойства editText и ImageView android: gravity = "center" и установить свойство гравитации linearlayout в center_vertically.

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

 android:layout_marginBottom="-2dp" android:layout_marginTop="2dp"