1

我需要通过调用 myView.setBackgroundDrawable(BitmapDrawable bdb) 来动态设置布局的背景,但是我想裁剪图像而不是在布局中拉伸它,有没有办法做到这一点?

我试图创建如下可绘制对象来设置重力,但挑战是我无法将 android:src 硬编码为静态可绘制对象,因为图像源必须是动态的。

<bitmap android:src="@drawable/background" android:gravity="center" />

任何建议将不胜感激!

4

3 回答 3

1

我相信android:gravity您正在寻找的属性是clip_verticaland clip_horizontal,但只是一个建议。这些属性的行为方式可能与您认为的不同。您不能使用它们在两个方向上剪切图像,只能使用一个方向。以下代码:

<bitmap
    android:src="@drawable/background"
    android:gravity="clip_vertical|clip_horizontal" />

不允许在两个方向上裁剪图像......它实际上适合视图内的图像,就好像您没有设置任何一个一样。设置剪辑参数本质上是设置该方向以适合视图,而另一个方向被裁剪掉,这也可能令人困惑。几个例子:

<!-- Force fit top/bottom, crop left/right with image centered -->
<bitmap
    android:src="@drawable/background"
    android:gravity="clip_vertical" />

<!-- Force fit top/bottom, align image left and crop right edge -->
<bitmap
    android:src="@drawable/background"
    android:gravity="left|clip_vertical" />

<!-- Force fit left/right, crop top/bottom with image centered -->
<bitmap
    android:src="@drawable/background"
    android:gravity="clip_horizontal" />

<!-- Force fit left/right, align top and crop bottom egde -->
<bitmap
    android:src="@drawable/background"
    android:gravity="top|clip_horizontal" />

请注意,这些设置允许裁剪大于视图的图像,但如果图像小于视图,其内容仍将被拉伸以适应。为了控制图像在<bitmap>标签中小于视图时的行为方式,请查看tileMode. 注意tileModegravity不能一起使用;gravity如果两者都包含,将被忽略。

如果除此之外您还需要对图像的缩放方式进行更多动态控制,并且您不想使用ImageView,您还可以将生成的 Drawable 包装在 a 中ScaleDrawable,并根据测量的视图在 Java 代码中配置 x/y 缩放百分比尺寸。

于 2013-05-14T03:47:14.880 回答
0

你想使用ImageView.ScaleType.CENTER_CROP

于 2013-05-13T22:27:47.200 回答
0
    if (srcBmp.getWidth() >= srcBmp.getHeight()){

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

}else{

  dstBmp = Bitmap.createBitmap(
     srcBmp,
     0, 
     srcBmp.getHeight()/2 - srcBmp.getWidth()/2,
     srcBmp.getWidth(),
     srcBmp.getWidth() 
     );
}
于 2013-05-14T12:55:24.733 回答