可绘制的<bitmap>宽度适合视图,同时保持宽高比

时间:2018-07-21 01:47:38

标签: android android-drawable

比方说,我有一个水平长的图像,“草”。现在,我想将其用作视图的背景图像,但我想将其停靠在底部。在网上搜索后,我发现需要将图像包装为可绘制的图像,例如:

<?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,但是没有保持宽高比。我可以使图像水平放置,但可以通过自动垂直缩放来保持宽高比吗?还是可绘制对象无法做到这一点?

3 个答案:

答案 0 :(得分:0)

您不能仅使用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>

答案 1 :(得分:0)

您要搜索的是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;
}

答案 2 :(得分:0)

如果我理解您的要求正确,则您的图像需要垂直拉伸并且水平限制。

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