对齐ImageView的有水平的EditText水平、ImageView、EditText

2023-09-12 21:25:59 作者:总有一天,你会渐渐活出写满答案的人生。今日小编为小姐姐们设计

我努力的寻找调整的方法的的EditText 的ImageView 正确在Android上。我不断收到这样的结果:

I'm trying hard to find a way of aligning an EditText and an ImageView properly on Android. I keep getting this result:

XML的部分是相当简单:

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的使用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>

但结果是完全一样的。

But the result is exactly the same.

我试过用的EditText的背景填充,固有的高玩,但都无济于事。

I've tried playing with the EditText's background padding, intrinsic height, but to no avail.

本的EditText的背景绘制的是Android版本/ ROM的在不同的,我想支持他们。

The EditText's background drawable is different among Android versions/ROMs, and I want to support them all.

我怎样才能让这对准像素完美在任何Android版本(和风格)?

How can I make this alignment pixel perfect on any android version (and style)?

推荐答案

终于找到一个合适的解决方案,在不同的Andr​​oid版本/ ROM的/样式缩放。

Finally found a suitable solution that scales across different Android versions/ROMs/styles.

的主要问题是,EditText上的背景可拉伸本身具有透明填充:

The main problem is that the EditText's background drawable itself has transparent padding:

另外,我发现这个透明边框不同的很多不同的Andr​​oid版本/ ROM的/样式(ICS的股票,例如,没有透明填充的话)。

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).

在一个中途的结论,我原来的code正确alignes我的ImageView与我的EditText。不过,我真正想要的是使我的ImageView与可见的的的EditText的背景的一部分。

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.

要做到这一点,我扫描的位图我从我的EditText的背景绘制创建。我扫描,上下和自下而上找到完全透明线的数量和使用这些值作为顶部/底部填充我的ImageView的。所有这一切始终只需要不到我的N1为5ms。这里的code:

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;
}

和它的工作原理就像一个魅力!

And it works like a charm!