Наконец-то найдено подходящее решение, которое масштабируется для разных версий Android / ROM / стилей.
Основная проблема заключается в том, что фон рисования самого EditText имеет прозрачное заполнение:
ТакжеЯ заметил, что это прозрачное заполнение варьируется много между различными версиями / ПЗУ / стилями 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;
}
И он работает как шарм!