3

注意:我最终将此作为一个错误报告给这里的 android 项目:http ://code.google.com/p/android/issues/detail?id=39159请也看看接受的赏金答案,不幸的是,解决方案是使用绝对(即指定'dp'而不是'wrap_content'等)布局来解决问题。

在图像上放置背景时,我遇到了一些非常奇怪的行为。我已经大大简化了这一点,以向您展示这个问题。我正在做的是将图像放置在相对布局中,并使用背景。似乎给 relativelayout 一个填充会导致图像的背景被误绘。Wrap_content 似乎搞砸了。

首先,这是演示问题的代码。请注意,在不使用线性布局的情况下会看到相同的行为,而只是为图像视图提供背景,但这确实更好地说明了问题。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        android:padding="5dp" >
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/black_bg" >
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:adjustViewBounds="true"
                android:src="@drawable/red_rectangle" />
        </LinearLayout>
    </RelativeLayout>
</FrameLayout>

这是 black_bg xml 文件:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FF000000"/>
</shape> 

这是red_rectangle: 红色矩形

请注意,这是一个参考图像,用于演示问题。我的实际图像有细节,所以不能是 .9.png

这是问题的屏幕截图:

渲染错误

您可以看到图像宽度小于线性布局,尽管线性布局的宽度设置为“wrap_content”。如果我将 relativelayout 填充设置为 0dp,这个问题就会消失。

希望这是我在这里提供的一组相当完善的资源,因此人们可以根据需要自行尝试。

作为参考,我使用它来提供图像周围的边框,因此我可以将线性布局(或图像本身)设置为具有填充,在这种情况下问题仍然存在。

编辑:看来我可能需要更多的背景信息,因为答案集中在如何提供这个边界上。这是一个更符合上下文的布局的屏幕截图。我不想首先包括这个,因为它给问题增加了更多的混乱:

截屏

您看到的第一个 5dp 填充是针对整个项目的内容(相对布局)。然后,正如我最初所说的那样,除了您在相对布局中看到的第一个填充之外,“我可以将线性布局(或图像本身)设置为具有填充”。目前,此布局不应显示任何边框。

4

5 回答 5

4

问题似乎在于图像的不同拉伸属性(在图像视图中)和一个设置为背景(在线性布局中)。设置为背景的图像不一定保持纵横比,而图像中的图像倾向于保持纵横比。当您将布局的高度设置为 60 dp 时,图像会缩小并保持纵横比,而两侧会留下黑色条纹。这对我有用:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:padding="5dp" >
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/black_bg" >
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="60dp"
                android:src="@drawable/asd"
                android:scaleType="fitXY"
                 />
        </LinearLayout>
    </RelativeLayout>
</FrameLayout>
于 2012-10-31T09:05:35.513 回答
1

我不知道为什么它在那里显示额外的黑色补丁。您是否尝试过运行该应用程序?UI 编辑器有一些缺陷,尤其是在ImageView..

现在对于图像周围的边框,将背景和填充设置为ImageView自身。不需要LinearLayout。"centerInside"添加带有值的比例类型属性。

 <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:padding="5dp"
      android:layout_centerInParent="true"
      android:adjustViewBounds="true" 
      android:src="@drawable/red_rectangle"
      android:background="#000" 
      android:scaleType="centerInside"/> 
于 2012-10-26T17:23:42.493 回答
1

我相信这是一个很好的错误候选者!

无论如何,我了解您打算通过此布局实现的目标。问题是设置RelativeLayout 的高度。我不会要求你包装内容!简单地说,由于高度设置为 60dp,内边距设置为 5dp,因此更进一步,将 LinearLayout 的高度设置为 50dp,即60-2*5:)

最后,要获得边框,在 LinearLayout 中添加一个 5dp 的填充,并将 ImageView 的高度设置为50dp - 2*5 = 40dp.

这将完美地工作


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        android:padding="5dp" >
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:padding="5dp"
            android:background="@drawable/black_bg" >
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="40dp"
                android:adjustViewBounds="true"
                android:src="@drawable/red_rectangle" />
        </LinearLayout>
    </RelativeLayout>
</FrameLayout>

于 2012-10-29T15:24:22.803 回答
0

“作为参考,我正在使用它来提供图像周围的边框”

添加一个可绘制的“border.xml”

<shape xmlns:android:"http://schemas.android.com/apk/res/android" android:shape:"rectangle">
 <stroke android:width="5dp" android:color="#FF000000" />
 <padding android:left="5dp" android:top="5dp" android:right="5dp" android:bottom="5dp" />
</shape>

将您的 ImageView 背景设置为此可绘制对象。

让我们简化您的布局并将 ImageView 居中:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
        <ImageView 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:layout_centerInParent="true"
                android:adjustViewBounds="true" 
                android:src="@drawable/red_rectangle"
                android:background="@drawable/border" /> 
</RelativeLayout> 
于 2012-09-12T16:59:05.900 回答
0

试试这个 ...........

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        android:padding="5dp" >
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/black_bg"
            **android:padding="5dp"**
            >
            <ImageView
                **android:layout_width="fill_parent"
                android:layout_height="fill_parent"**
                android:adjustViewBounds="true"
                android:src="@drawable/red_rectangle" />
        </LinearLayout>
    </RelativeLayout>
</FrameLayout>

使您的图像视图像这样..

<ImageView 
            android:id="@+id/imageViewMyicon"
            android:layout_width="30dp"
            android:background="@drawable/myiconbackground"
            android:layout_height="30dp"
            android:src="@drawable/myicon"
            android:contentDescription="@string/my_icon"
            />

在您的可绘制 myiconbackground.xml 中

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
       android:shape="rectangle" 
       android:padding="10dp">
    <solid android:color="#0D95BD"/>
        <corners android:radius="5dp"/>
        <padding android:left="2dp" android:right="2dp" android:top="2dp" android:bottom="2dp"/>
</shape>

我检查了这个对我有用,也应该对你有用

于 2012-10-30T10:44:57.257 回答