Đây không phải là giải pháp hiệu quả nhất, nhưng như ai đó đã đề xuất thay vì nền, bạn có thể tạo FrameLayout hoặc RelativeLayout và sử dụng ImageView làm nền giả - các yếu tố khác sẽ được đặt ở trên nó:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent">
<ImageView
android:id="@+id/ivBackground"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:scaleType="fitStart"
android:src="@drawable/menu_icon_exit" />
<Button
android:id="@+id/bSomeButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="61dp"
android:layout_marginTop="122dp"
android:text="Button" />
</RelativeLayout>
Vấn đề với ImageView là chỉ các thang đo có sẵn là: CENTER, CENTER_CROP, CENTER_INSIDE, FIT_CENTER, FIT_END, FIT_START, FIT_XY, MATRIX ( http://etcodehome.blogspot.de/2011/05/android-imag- )
và để "chia tỷ lệ hình nền (giữ tỷ lệ khung hình)" trong một số trường hợp, khi bạn muốn một hình ảnh lấp đầy toàn bộ màn hình (ví dụ hình ảnh nền) và tỷ lệ khung hình của màn hình khác với hình ảnh, scaleType cần thiết là loại của TOP_CROP, vì:
CENTER_CROP căn giữa hình ảnh được chia tỷ lệ thay vì căn chỉnh cạnh trên với cạnh trên của chế độ xem hình ảnh và FIT_START phù hợp với chiều cao màn hình và không lấp đầy chiều rộng. Và như người dùng Anke nhận thấy FIT_XY không giữ tỷ lệ khung hình.
Rất vui khi ai đó đã mở rộng ImageView để hỗ trợ TOP_CROP
public class ImageViewScaleTypeTopCrop extends ImageView {
public ImageViewScaleTypeTopCrop(Context context) {
super(context);
setup();
}
public ImageViewScaleTypeTopCrop(Context context, AttributeSet attrs) {
super(context, attrs);
setup();
}
public ImageViewScaleTypeTopCrop(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setup();
}
private void setup() {
setScaleType(ScaleType.MATRIX);
}
@Override
protected boolean setFrame(int frameLeft, int frameTop, int frameRight, int frameBottom) {
float frameWidth = frameRight - frameLeft;
float frameHeight = frameBottom - frameTop;
if (getDrawable() != null) {
Matrix matrix = getImageMatrix();
float scaleFactor, scaleFactorWidth, scaleFactorHeight;
scaleFactorWidth = (float) frameWidth / (float) getDrawable().getIntrinsicWidth();
scaleFactorHeight = (float) frameHeight / (float) getDrawable().getIntrinsicHeight();
if (scaleFactorHeight > scaleFactorWidth) {
scaleFactor = scaleFactorHeight;
} else {
scaleFactor = scaleFactorWidth;
}
matrix.setScale(scaleFactor, scaleFactor, 0, 0);
setImageMatrix(matrix);
}
return super.setFrame(frameLeft, frameTop, frameRight, frameBottom);
}
}
https://stackoverflow.com/a/14815588/2075875
Bây giờ IMHO sẽ hoàn hảo nếu ai đó viết tùy chỉnh Drawable có tỷ lệ hình ảnh như thế. Sau đó, nó có thể được sử dụng làm tham số nền.
Reflog gợi ý để đặt trước drawable trước khi sử dụng nó. Dưới đây là hướng dẫn cách thực hiện:
Java (Android): Làm thế nào để chia tỷ lệ có thể vẽ mà không cần Bitmap?
Mặc dù nó có nhược điểm, nhưng bản vẽ / bitmap được nâng cấp sẽ sử dụng nhiều RAM hơn, trong khi việc mở rộng khi sử dụng ImageView không cần nhiều bộ nhớ hơn. Ưu điểm có thể là tải bộ xử lý ít hơn.