在ImageView周围进行不必要的填充


142

我需要在所有活动/视图中都包含标题图形。具有标题的文件称为header.xml:

<?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="wrap_content"
  android:background="#0000FF" 
  android:padding="0dip">

  <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/header"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="0dip"
    android:layout_marginTop="0dip"
    android:layout_marginBottom="0dip"
    android:padding="0dip"
    android:paddingTop="0dip"
    android:paddingBottom="0dip"
    android:layout_gravity="fill"
    android:background="#00FF00"
    />
</FrameLayout>

注意android:background="#00FF00"(绿色),这只是可视化目的。

我将它们包含在我的视图中,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
  style="@style/white_background">

  <include layout="@layout/header" />
  (...)

因此,当我实际尝试时,结果看起来像左图,而不是它应该看起来像(右):

注意绿色边框

(1)这-橙色-部分是所讨论的图像/ ImageView。
(2)无用的绿色边框。注意:通常,绿色区域是透明的-因为我设置了,所以只有绿色background

注意顶部图像周围的绿色边框;它是ImageView的一部分,我只是想不出它为什么存在或如何摆脱它。它将所有填充和边距设置为0(但省略时结果是相同的)。图片为480x64px jpeg *,我将其放在res / drawable中(drawable-Xdpi尽管不是其中之一)。

(* jpeg,因为似乎我偶然发现了旧的png伽玛问题-最初我通过使绿色边框与图片相同的橙色来解决该问题,并且颜色不匹配。)

我在htc wish / 2.2 / Build 2.33.163.1和仿真器上进行了尝试。我也在#android-dev中向某人描述了问题;她可以重现问题,但也没有任何解释。建立目标是1.6。

update @tehgoose:此代码产生的顶部和底部填充结果完全相同。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
  style="@style/white_background">

  <!-- <include layout="@layout/header" />  -->

  <ImageView
    android:src="@drawable/header"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#00FF00"
    android:layout_weight="0"
    />

  <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="8dip"
    android:layout_weight="1">

    (... rest of the elements)

  </LinearLayout>
</LinearLayout>

负边距和/或填充值也可能起作用- android:layout_margin="-10dp"android:padding="-10dp"
samis

Answers:


442

最后!

<ImageView
  (...)
  android:adjustViewBounds="true" />

adjustViewbounds属性的伎俩:

如果您希望ImageView调整其边界以保留其可绘制对象的纵横比,请将其设置为true。

在这里偶然发现了它。谢谢你的帮助!


7
我有同样的问题,但是此解决方案无效。
马蒂·米勒

4
哇...没有该属性,根据屏幕密度添加了多余的填充,因此仅在某些设备上发生。这让我发疯了,因为在我拥有的所有设备上该图像看起来都很好,然后当我在朋友的设备上尝试该图像时,看起来就像胡扯。谢谢。
DiscDev 2012年

谢谢上帝,我切换了我的第一个尝试解决问题的办法,以找到旧的android系统。我相信这个问题始于某些制造商从android更改内容,然后他们必须放置一个属性才能在下一版本中解决它。
拉塔塔塔塔2015年

可悲的是,这不适用于较低的api,至少api 16和17。
luoser

1
哇,这正是我想要的东西,我挠了几个小时,甚至试图使我的布局无效并将其高度/宽度设置为图像的高度。这种简单的解决方案无需scaleType即可完美运行。
CodyEngel '02

39
android:scaleType="fitXY"

这个对我有用。


3
scaleType="fitXY"但是,它做一些不同的事情:它改变了图像的纵横比,从而导致失真。有时,例如对于抽象背景图像,这可能是可以接受的。
斯蒂夫2014年

1
我使用android:width和android:height来控制宽高比,并且scaleType =“ fitXY”确实为我提供了所需的宽高比,这至少是我的经验。感谢您的输入。
Badr 2014年

它有效,但是图像不清晰,不平衡,被裁剪
1616-4-21

1
不完全一样,但是android:scaleType =“ fitEnd”就像魔术一样工作。
TheLibrarian

我发现的组合android:adjustViewBounds="true",并android:scaleType="fitXY"为我所需要的对齐ImageViews在我的布局。图像只有一个像素或两个像素(在高分辨率显示器上很小)adjustViewBounds。在scaleType调整视图范围之后,添加似乎会强制对图像进行最终缩放,从而迫使图像缩放为新范围的完整大小。
杰夫·洛克哈特

3

它与图像宽高比有关。默认情况下,系统保留图像源的原始宽高比。在大多数情况下,它们与布局或布局中指定的尺寸不完全匹配。因此,

  1. 更改图像的大小以适合指定的布局,或者
  2. 使用android:scaleType以适应图像。例如,您可以指定android:scaleType="fitXY"

3

这些多余的填充是自动生成的,因为android会尝试获取原始的宽高比。请在下面尝试

scaletype = "fitCenter"
android:adjustViewBounds="true"
android:layout_height="wrap_content"

0

也许你可以给予specific height to imageView say 50dp or 40dpadjust image to make green border消失。

例如: android:layout_height="40dp"


设置layout_width =“ 480px”和layout_height =“ 64px”会产生我想要的结果,但是像素不是很实用。老实说,我不明白这是如何转换成dp的。
stefs 2011年

您应该像使用像素一样使用dp。就这些了!显示独立的像素。但是可以。
Udaykiran 2011年

dp / dip表示密度独立像素;据我了解,它涵盖了不同的密度,但(当然)没有不同的屏幕尺寸。我想要的只是将图像缩放到100%的屏幕宽度并保留高度,以便保持比例。
Stefs 2011年

0
android:layout_height="wrap_content"

您需要将其更改为“ fill_parent”

您可能还需要缩放图像,以便以正确的比例填充其中的帧布局。

我不明白为什么您在那里根本不需要框架布局。没有它,您的图像无论如何都将填满整个屏幕。

编辑:是的,抱歉,xml是imageview的高度。


1
唯一要补充的是,他需要将的布局高度设置为ImageView,这在您的回答中不是很明显:)
ernazm 2011年

我没有周围布局也尝试过,什么也没改变。同样,当前图像只是一个占位符-很快就会有其他元素(调整周围的布局)。我不希望图像与屏幕匹配,我希望它位于顶部。
stefs 2011年

仔细检查图像的顶部和底部是否有空白。如果没有,请尝试使用android:scaleType =“”缩放imageview对象。应该有一个适合您要寻找的东西。
NotACleverMan 2011年


-1

您需要在imageview周围提供形状以提供更好的外观。

这是我用过的:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--<gradient android:startColor="#FFFFFF" android:endColor="#969696"

    android:angle="270">
-->
<gradient android:startColor="#FFFFFF" android:endColor="#FFFFFF"

    android:angle="270">
</gradient>
    <stroke android:width="2dp" android:color="@color/graycolor" />
<corners android:radius="2dp" />
<padding android:left="5dp" android:top="5dp" android:right="5dp"
    android:bottom="5dp" />


2
哇!我已经使用过形状(用于制表符背景),但是说实话,我不知道如何在此处应用形状。
Stefs'Apr

@Schnalle:制作两个shapes.xml文件和一个selector.xml。将图像背景用作selector.xml文件。在选择器文件中,为聚焦/选定状态和正常状态提供两种状态。
Zoombie 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.