可绘制适合 <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 教程作为参考。
假设我有一张横长的图片,"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 教程作为参考。