将背景图像设置为视图会拉伸我的视图

时间:2011-11-20 15:44:30

标签: android view background

我为视图创建了一个背景图像位图,现在视图被拉伸到背景图像的大小....

这是正常的吗?

<?xml version="1.0" encoding="utf-8"?>
    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/green"
        android:tileMode="repeat"/>

这是我如何将它应用到我的视图

v.setBackgroundResource(R.drawable.backgroundgreen);
例如

......

如果图像高度为500像素 并且视图的高度为200px(将wrap_content设置为height) 将图像设置为背景后,我的视图高度为500px ......

7 个答案:

答案 0 :(得分:35)

我遇到了同样的问题。

如果背景图片的大小大于视图的大小,则视图的大小将更改为与图像的大小相匹配。

解决方案


  1. 将视图放在相对布局中。
  2. 删除背景图片。
  3. 在相对布局内的视图之前添加ImageView
  4. 将ImageView的src设置为背景图像

    <RelativeLayout
        .
        .
        . >
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/yourViewId"
            android:layout_alignRight="@+id/yourViewId"
            android:layout_alignTop="@+id/yourViewId"
            android:layout_alignBottom="@+id/yourViewId"
            android:adjustViewBounds="true" 
            //this will allow the image to resize with same proportions
            android:src="@drawable/yourDrawable" />
    
        <YourView
            android:id="@+id/yourViewId"
            .
            ..
            ... />
    
      </RelativeLayout>
    

  5. 这一切都可以在代码中完成。

答案 1 :(得分:28)

据我所知,您遇到的问题不是问题,而是使用Android设计布局的方式。

这意味着您可以使用3个默认常量值设置高度和宽度:

<强> FILL_PARENT
View请求的高度或宽度的特殊值。 FILL_PARENT表示View希望与其父级一样大,减去父级的填充(如果有的话)。从API级别8开始,不推荐使用此值,并将其替换为MATCH_PARENT

<强> MATCH_PARENT
View请求的高度或宽度的特殊值。 MATCH_PARENT表示视图希望与其父级一样大,减去父级的填充(如果有的话)。在API Level 8中引入。

<强> WRAP_CONTENT
View请求的高度或宽度的特殊值。 WRAP_CONTENT表示View想要足够大以适应其内部内容,并考虑自己的填充。

现在,当您将View的高度/宽度设置为WRAP_CONTENT时,您允许视图采用足以显示以查看内容的大小。背景图像也是View的内容,因此您将显示与图像一样大的视图。这不是问题,就是它的表现方式。

好的,但是在你的情况下这对你来说是一个问题,因为你有一个展示的背景,并且不应该为此展开观看。我可以提出几点建议:

  1. 首先也非常明显:制作尺寸正确的图片并将其保存在不同的drawable folders

  2. 指定不使用constants的视图大小,但在DP中。如果有必要,请为不同大小制作不同的布局XML文件,并将其保存在layout folders中。

  3. 您可以使用非常有用的设计布局layout weight

答案 2 :(得分:3)

我建议创建一个包装器布局并将背景图像放在那里。我正在那样使用它并非常适合。 见下面的例子

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/settingstab_scroll"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scrollbars="vertical"
    android:background="@drawable/wareninja_wallpaper_img"
    >
<!-- your layouts and components goes here -->
</ScrollView>


...
Social Coding @ AspiroTV

答案 3 :(得分:1)

这对我有用。

< ?xml version="1.0" encoding="utf-8"?>
 < LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:id="@+id/LinearLayoutTest">    

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prueba);


    ((LinearLayout)findViewById(R.id.LinearLayoutTest)).setBackgroundResource(R.drawable.greenrepeat);
}

在您的代码中,什么是v?它有params to fill_parent?

答案 4 :(得分:1)

原因很简单。你必须看到View :: getSuggestedMinimumWidth / Height方法。

protected int getSuggestedMinimumWidth() {
    return (mBackground == null) ? mMinWidth : max(mMinWidth, mBackground.getMinimumWidth());
}

protected int getSuggestedMinimumHeight() {
    return (mBackground == null) ? mMinHeight : max(mMinHeight, mBackground.getMinimumHeight());
}

看到这一点,你可能知道为什么背景会使视图更大,特别是为什么要为它分配一个BitmapDrawable。

,简单的解决方案是包装Drawable(例如BitmapDrawable),然后为getMinimumHeight()和getMinimumWidth()返回0,最好覆盖getIntrinsicHeight()和getIntrinsicWidth()以返回-1。

support-v7有一个DrawableWrapper,可以在必要时将调用委托给另一个drawable。你可以扩展那个并覆盖上面谈到的方法。

如果你不使用support-v7(WoW!你真棒),将该课程复制到你的项目也没关系。

https://android.googlesource.com/platform/frameworks/support/+/1949ae9aeaadf52ad7bd7bb74ca5419c67ea7f65/v7/appcompat/src/android/support/v7/internal/widget/DrawableWrapper.java

答案 5 :(得分:0)

请勿使用android:tileMode="repeat"。您的绿色可绘画是否比您的视图更大或更小?可以添加更多细节吗?

答案 6 :(得分:0)

在我的案例中完美运行的一个好解决方案是扩展View并覆盖onMeasure()

以下是要执行的步骤:

  1. 创建一个自己的类并扩展您要使用的View,此处为 例如,我将使用Button
  2. 覆盖方法onMeasure()并在底部插入代码。这将在第一个度量完成后设置后台资源。对于第二个测量事件,它将使用已经测量的参数。
  3. 扩展Button的自定义视图的示例代码(将按钮更改为您要扩展的视图)

    public class MyButton extends Button {
    
        boolean backGroundSet = false;
    
        public MyButton(Context context) {
            super(context);
        }
    
        public MyButton(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);          
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    
            if(backGroundSet) {
                setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight());
                return;
            }
    
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    
            backGroundSet = true;
            setBackgroundResource(R.drawable.button_back_selector);
    
        }
    }
    

    此处唯一要更改的是您要扩展的视图类型,以及onMeasure()方法中要用于视图的背景资源。

    之后,只需在布局xml中使用此视图或以编程方式添加它。