Android Studio中如何为布局设置指定尺寸的背景图片?
解决Activity背景图片拉伸且作为标题样式的方案
针对你遇到的背景图片拉伸,又要作为标题式背景(固定尺寸)且允许其他视图叠加的需求,我给你几个实用的实现思路:
方案一:使用LayerDrawable定义分层背景
你可以创建一个layer-list类型的Drawable,把你的背景图片放在指定位置,剩下的区域用纯色或者透明填充,这样图片就不会被拉伸了。
- 在
res/drawable目录下新建title_background.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 底层:填充整个Activity的背景(可以设为你需要的颜色,比如白色) --> <item> <color android:color="#FFFFFF" /> </item> <!-- 上层:标题区域的背景图片,指定固定高度和位置 --> <item android:drawable="@drawable/background" android:height="120dp" <!-- 你想要的标题栏高度 --> android:gravity="top"> <!-- 把图片固定在顶部 --> </item> </layer-list>
- 然后在Activity的布局文件里,给根布局设置这个背景:
android:background="@drawable/title_background"
这样图片只会占据顶部指定高度的区域,不会被拉伸,其他视图可以直接放在根布局里,自然就叠加在背景之上了。
方案二:使用RelativeLayout/ConstraintLayout嵌套布局
如果需要更灵活的控制,比如标题背景的宽度、位置微调,可以用布局嵌套的方式:
- 根布局用
ConstraintLayout或者RelativeLayout,先添加一个View作为标题背景,设置它的固定尺寸和背景图片,然后把其他内容放在这个View的下方或者覆盖在上面:
<?xml version="1.0" encoding="utf-8"?> <ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 标题背景View,固定高度,不拉伸图片 --> <View android:id="@+id/title_bg" android:layout_width="match_parent" android:layout_height="120dp" android:background="@drawable/background" android:scaleType="centerCrop" <!-- 或者center、fitStart等,根据需求选 --> app:layout_constraintTop_toTopOf="parent"/> <!-- 其他视图,比如文本、按钮等,放在标题背景下方或者覆盖上面 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World" android:textSize="20sp" app:layout_constraintTop_toTopOf="@id/title_bg" app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="20dp"/> </ConstraintLayout>
这里给View设置scaleType可以控制图片的显示方式,比如center是保持原图大小居中显示,centerCrop是裁剪图片填满View但不拉伸,根据你的需求选择就行。
方案三:自定义Drawable控制图片显示
如果以上两种方案都满足不了,你可以自定义一个Drawable,重写onDraw方法,手动绘制图片到指定区域:
public class TitleBackgroundDrawable extends Drawable { private Bitmap mBitmap; private int mTitleHeight; public TitleBackgroundDrawable(Bitmap bitmap, int titleHeight) { mBitmap = bitmap; mTitleHeight = titleHeight; } @Override public void draw(@NonNull Canvas canvas) { // 绘制标题区域的图片 canvas.drawBitmap(mBitmap, null, new Rect(0, 0, getBounds().width(), mTitleHeight), null); // 绘制下方的填充色(比如白色) Paint paint = new Paint(); paint.setColor(Color.WHITE); canvas.drawRect(0, mTitleHeight, getBounds().width(), getBounds().height(), paint); } @Override public void setAlpha(int alpha) {} @Override public void setColorFilter(@Nullable ColorFilter colorFilter) {} @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } }
然后在Activity里设置这个Drawable:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background); TitleBackgroundDrawable drawable = new TitleBackgroundDrawable(bitmap, getResources().getDimensionPixelSize(R.dimen.title_height)); getWindow().getDecorView().setBackground(drawable);
这种方式自由度最高,但需要写一点Java代码。
以上几种方案都不需要用ImageView,而且能保证其他视图正常显示在背景之上,你可以根据自己的需求选择最合适的一种~
内容的提问来源于stack exchange,提问作者BeginnerProgrammer
相关产品推荐
相关产品推荐

