可绘制适合 <bitmap> 宽度,同时保持纵横比

drawable fit <bitmap> width to the view while keeping aspect ratio

假设我有一张横长的图片,"grass"。现在,我想将它用作视图的背景图像,但我想将它停靠在底部。在网上搜索后,我发现我需要将图像包装为可绘制的图像:

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/grass"
    android:gravity="bottom|left" />

问题是图像向右裁剪。所以我试过 bottom|left|right 但是纵横比没有保持。我可以使图像水平对齐,但通过自动垂直缩放来保持纵横比吗?或者这对可绘制对象来说是不可能的吗?

仅使用 XML 无法实现此目的。如果您不想以编程方式绘制位图,可以将 ImageView 包装在 RelativeLayout 中并设置 ImageView 的 scaleType 属性:

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:src="@drawable/grass"
        android:scaleType="fitXY" />

</RelativeLayout>

您搜索的是 centerInside ScaleType 。请从 ImageView 中删除 ScaleType 并试试这个:

 public static synchronized Bitmap centerInside(Bitmap bitmap,int width,int height){
    if(bitmap.getWidth() == bitmap.getHeight()){
        Log.i("crop","already matched");
        return Bitmap.createScaledBitmap(bitmap, width, height, true);
    }
    //int size = width > height ? width : height;

    float scale = ImageUtils.calculateImageSampleSize(bitmap.getWidth(), bitmap.getHeight(),width,height);
    width = (int) ((float)bitmap.getWidth() / scale);
    height = (int) ((float)bitmap.getHeight() / scale);
    bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);

    if (bitmap.getWidth() >= bitmap.getHeight()){

        bitmap = Bitmap.createBitmap(
                bitmap,
                bitmap.getWidth()/2 - bitmap.getHeight()/2,
                0,
                bitmap.getHeight(),
                bitmap.getHeight()
        );

    }else{

        bitmap = Bitmap.createBitmap(
                bitmap,
                0,
                bitmap.getHeight()/2 - bitmap.getWidth()/2,
                bitmap.getWidth(),
                bitmap.getWidth()
        );
    }
    return bitmap;
}

如果我理解您的要求,您的图像需要垂直拉伸并在水平范围内。

我可以建议的一个很好的解决方案是从您的可绘制对象中创建一个 9 块图像并定义图像可以拉伸的区域。 您可以使用 this 教程作为参考。