将背景图像设置为视图可以延伸我的视图

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

这是正常的吗?

<?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像素,视图的高度为200像素(将wrap_content设置为高度),则将图像设置为背景后,我的视图的高度将变为500像素…

Solutions Collecting From Web of "将背景图像设置为视图可以延伸我的视图"

据我所知,你面临的问题不是一个问题,这是如何使用Androiddevise布局的方式。

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

FILL_PARENT
View请求的高度或宽度的特殊值。 FILL_PARENT意味着视图要和父视图一样大,如果有的话减去父视图的填充。 此值MATCH_PARENT API级别8开始弃用,并由MATCH_PARENT取代。

MATCH_PARENT
View请求的高度或宽度的特殊值。 MATCH_PARENT意味着视图要和父视图一样大,如果有的话,减去父视图的填充。 在API级别8引入。

包装内容
View请求的高度或宽度的特殊值。 WRAP_CONTENT意味着View需要足够大以适应其内部内容,并考虑到自己的填充。

现在,当您将View的高度/宽度设置为WRAP_CONTENT ,您将允许视图占用足以显示视图内容的大小。 背景图像也是View的内容,因此您将查看与图像一样大的尺寸。 这不是一个问题,这是如何显示。

好的,但在你的情况下,这对你来说是一个问题,因为你有一个背景来展示和观察不应该被拉伸。 我可以build议几种方法:

  1. 首先,非常明显:制作正确大小的图像,并将其保存在不同的可绘制文件夹中 。

  2. 指定视图的大小不使用常量 ,但在DP中 。 如果有必要,为不同的尺寸制作不同的布局XML文件,并保存在布局文件夹中 。

  3. 你可以使用一个非常有用的东西来devise布局是布局的重量 。

我也面临同样的问题。

如果背景图像的尺寸大于视图的尺寸,视图的尺寸将会改变以匹配图像的尺寸。


  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> 

这一切都可以用代码来完成。

我build议创build一个包装布局,并把背景图像放在那里。 我用这种方式,很适合。 看下面的例子

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


社交编码@ AspiroTV

它为我工作。

 < ?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? 它有参数fill_parent?

原因很简单。 你必须看到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。

简单的解决scheme是包装该Drawable(例如BitmapDrawable),然后返回0 getMinimumHeight()和getMinimumWidth(),并更好地覆盖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

不要使用android:tileMode="repeat" 。 你的绿色可拉大或小于你的看法? 可以添加更多的细节?

在我的情况下,完美的解决scheme是扩展View并重写onMeasure()

这是要做的步骤:

  1. 创build一个自己的类,并扩展您想要使用的View ,在这里例如,我将使用Button
  2. 重写onMeasure()方法并在底部插入代码。 这将在第一个措施完成后设置背景资源。 对于第二个测量事件,它将使用已经测量的参数。

扩展Button的自定义视图的示例代码(将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); } } 

这里唯一需要改变的是你想要扩展的视图的types,在onMeasure()方法中你想要用于视图的背景资源。

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