我正在尝试将照片设置为Activity
. 我希望背景是全屏图像(无边框)。
因为我希望图像在不拉伸/挤压的情况下填充整个活动的背景(即 X 和 Y 的不成比例缩放)并且我不介意是否必须裁剪照片,所以我使用RelativeLayout
带有ImageView
(with android:scaleType="centerCrop"
) 和我的布局的其余部分由 aScrollView
及其子项组成。
<!-- Tried this with a FrameLayout as well... -->
<RelativeLayout>
<!-- Background -->
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"/>
<!-- Form -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView>
<LinearLayout>
...
<EditText/>
</LinearLayout>
</ScrollView>
</LinearLayout>
</RelativeLayout>
问题是布局的其余部分有一些EditText
视图,当软键盘出现时,ImageView 会重新调整大小。无论软键盘是否可见,我都希望背景保持不变。
我在 SO 上看到了很多关于 ImageViews 被重新调整大小的问题,但(imo)没有令人满意的答案。它们中的大多数只包括设置android:windowSoftInputMode="adjustPan"
- 这并不总是实用的,特别是如果您希望用户能够在活动中滚动 - 或者使用getWindow().setBackgroundDrawable()
不裁剪图像。
我已经设法将 ImageView 子类化并覆盖它onMeasure()
(在此处查看我的答案:ImageView resized when keyboard open),以便它可以根据标志强制固定高度和宽度 - 等于设备的屏幕尺寸,但我是想知道是否有更好的方法来实现我想要的结果。
所以,总而言之,我的问题是:如何将 Activity 的背景设置为全屏照片
使用 scale type = "centerCrop",使照片均匀缩放(保持其纵横比),因此两个尺寸(宽度和高度)将等于或大于视图的相应尺寸;
弹出软键盘时不会调整大小;
回答:
我最终遵循了@pskink的建议并进行了分类BitmapDrawable
(请参阅下面的答案)。我必须进行一些调整以确保BackgroundBitmapDrawable
始终以填充屏幕的方式缩放和裁剪。
这是我的最后一堂课,改编自他的回答:
public class BackgroundBitmapDrawable extends BitmapDrawable {
private Matrix mMatrix = new Matrix();
private int moldHeight;
boolean simpleMapping = false;
public BackgroundBitmapDrawable(Resources res, Bitmap bitmap) {
super(res, bitmap);
}
@Override
protected void onBoundsChange(Rect bounds) {
if (bounds.height() > moldHeight) {
moldHeight = bounds.height();
Bitmap b = getBitmap();
RectF src = new RectF(0, 0, b.getWidth(), b.getHeight());
RectF dst;
if (simpleMapping) {
dst = new RectF(bounds);
mMatrix.setRectToRect(src, dst, ScaleToFit.CENTER);
} else {
// Full Screen Image -> Always scale and center-crop in order to fill the screen
float dwidth = src.width();
float dheight = src.height();
float vwidth = bounds.width();
float vheight = bounds.height();
float scale;
float dx = 0, dy = 0;
if (dwidth * vheight > vwidth * dheight) {
scale = (float) vheight / (float) dheight;
dx = (vwidth - dwidth * scale) * 0.5f;
} else {
scale = (float) vwidth / (float) dwidth;
dy = (vheight - dheight * scale) * 0.5f;
}
mMatrix.setScale(scale, scale);
mMatrix.postTranslate(dx, dy);
}
}
}
@Override
public void draw(Canvas canvas) {
canvas.drawColor(0xaa00ff00);
canvas.drawBitmap(getBitmap(), mMatrix, null);
}
}
然后只需创建一个BackgroundBitmapDrawable
并将其设置为根视图的背景即可。