問(wèn)題描述
我正在努力尋找一種在 Android 上對(duì)齊 EditText
和 ImageView
正確 的方法.我不斷得到這個(gè)結(jié)果:
I'm trying hard to find a way of aligning an EditText
and an ImageView
properly on Android. I keep getting this result:
XML 部分非常簡(jiǎn)單:
The XML part is quite simple:
<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 with alignTop/alignBottom):
I've also tried many of the suggestions below, including PravinCG's (RelativeLayout with 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>
但結(jié)果完全一樣.
我嘗試過(guò)使用 EditText 的背景填充、固有高度,但無(wú)濟(jì)于事.
I've tried playing with the EditText's background padding, intrinsic height, but to no avail.
EditText的背景drawable在Android版本/ROM之間是不同的,我想支持它們.
The EditText's background drawable is different among Android versions/ROMs, and I want to support them all.
如何在任何 android 版本(和樣式)上使這種對(duì)齊像素完美?
How can I make this alignment pixel perfect on any android version (and style)?
推薦答案
終于找到了適合不同Android版本/ROM/樣式的解決方案.
Finally found a suitable solution that scales across different Android versions/ROMs/styles.
主要問(wèn)題是 EditText 的背景可繪制對(duì)象本身具有透明填充:
The main problem is that the EditText's background drawable itself has transparent padding:
另外,我注意到這種透明填充在不同的 Android 版本/ROM/樣式之間變化很大(例如,股票 ICS 根本沒(méi)有透明填充).
Also, I've noticed this transparent padding varies a lot between different Android versions/ROMs/styles (stock ICS, for instance, has no transparent padding at all).
總而言之,我的原始代碼正確地將我的 ImageView 與我的 EditText 對(duì)齊.但是,我真正想要的是將 ImageView 與 EditText 背景的 visible 部分對(duì)齊.
In a mid-way conclusion, my original code properly alignes my ImageView with my EditText. However, what I really want is to align my ImageView with the visible part of the EditText's background.
為了實(shí)現(xiàn)這一點(diǎn),我掃描了從 EditText 的背景可繪制對(duì)象創(chuàng)建的位圖.我從上到下和自下而上掃描它以找到完全透明線的數(shù)量,并將這些值用作我的 ImageView 的頂部/底部填充.在我的 N1 上,所有這些都持續(xù)不到 5 毫秒.代碼如下:
To achieve this, I scan a Bitmap I create from my EditText's background drawable. I scan it top-bottom and bottom-up to find the amount of fully transparent lines and use those values as top/bottom padding for my ImageView. All this consistently takes less than 5ms on my N1. Here's the code:
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;
}
它就像一個(gè)魅力!
這篇關(guān)于將 ImageView 與 EditText 水平對(duì)齊的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!