我为视图创建了一个背景图像位图,现在视图被拉伸到背景图像的大小....
这是正常的吗?
<?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 ......
答案 0 :(得分:35)
我遇到了同样的问题。
如果背景图片的大小大于视图的大小,则视图的大小将更改为与图像的大小相匹配。
的解决方案强> 的
将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>
这一切都可以在代码中完成。
答案 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
的内容,因此您将显示与图像一样大的视图。这不是问题,就是它的表现方式。
好的,但是在你的情况下这对你来说是一个问题,因为你有一个展示的背景,并且不应该为此展开观看。我可以提出几点建议:
首先也非常明显:制作尺寸正确的图片并将其保存在不同的drawable folders。
指定不使用constants的视图大小,但在DP中。如果有必要,请为不同大小制作不同的布局XML文件,并将其保存在layout folders中。
您可以使用非常有用的设计布局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>
答案 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!你真棒),将该课程复制到你的项目也没关系。
答案 5 :(得分:0)
请勿使用android:tileMode="repeat"
。您的绿色可绘画是否比您的视图更大或更小?可以添加更多细节吗?
答案 6 :(得分:0)
在我的案例中完美运行的一个好解决方案是扩展View
并覆盖onMeasure()
。
以下是要执行的步骤:
View
,此处为
例如,我将使用Button
。onMeasure()
并在底部插入代码。这将在第一个度量完成后设置后台资源。对于第二个测量事件,它将使用已经测量的参数。扩展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中使用此视图或以编程方式添加它。