42

我创建了一个带有标题图像的活动。此标题图像最初是使用 ImageView 在 Activity 的布局 xml 中创建的,其中 scaleType 设置为 centerCrop。这就是我想要的,它使图像居中,在纵向模式下左右剪切,在横向模式下全部显示。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="30dp"
    android:paddingBottom="6dp"
    android:paddingLeft="6dp"
    android:paddingRight="6dp"
    android:background="#919EAC"
    android:orientation="vertical" >

<ImageView
    android:id="@+id/header_image"
    android:layout_width="match_parent"
    android:layout_height="120dp"
    android:contentDescription="@string/header_description"
    android:scaleType="centerCrop"
    android:src="@drawable/header" />

    .... <other views> ...

我想将其替换为背景可绘制对象,以便我可以使用标题图像空间来显示数据,并且它可以让我在不同的活动中重复相同的布局。

出于这个原因,我创建了一个可在 android:background 属性中引用的可绘制对象:

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
        <item>
            <shape android:shape="rectangle" >
                <solid android:color="#919EAC" />
            </shape>
        </item>
        <item>
            <bitmap 
                android:antialias="true"
                android:gravity="top|center_horizontal"
                android:src="@drawable/header" />
        </item>
    </layer-list>

此可绘制对象定义了布局将定义的彩色背景,并定义了一个标题图像,否则该图像将作为 ImageView 包含在布局中。

但是现在我的图像被缩放了,而我希望它被裁剪。

检查Android文档我尝试了其他重力模式,例如

    android:gravity="top|clip_horizontal"

但它似乎仍然与图像视图显示/缩放不同。

背景可绘制的正确定义是什么?

4

4 回答 4

3

要在代码中居中裁剪位图,请执行以下操作:

public static Bitmap cropCenter(Bitmap bmp) {
    int dimension = Math.min(bmp.getWidth(), bmp.getHeight());
    return ThumbnailUtils.extractThumbnail(bmp, dimension, dimension);
}

我不知道有任何其他方法可以明智地居中裁剪位图 xml。

希望它可以帮助任何人。

我从这篇文章中找到了这个解决方案: Android Crop Center of Bitmap

于 2016-08-18T20:16:44.747 回答
3

我用一个保持底层drawable纵横比的装饰器解决了这个问题:https ://gist.github.com/rudchenkos/e33dc0d6669a61dde9d6548f6c3e0e7e

不幸的是,没有办法从 XML 应用它,所以我在我的启动活动开始时就这样做了:

public class SplashActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final Drawable bg = getResources().getDrawable(R.drawable.screen);
        getWindow().setBackgroundDrawable(new CenterCropDrawable(bg));

        ...
    }
}

这大致相当于android:windowBackground在 Activity 主题中指定可绘制对象

于 2017-07-14T12:55:19.657 回答
0

我不知道如何在背景下做到这一点。您可以尝试其他解决方案:

1)在图像顶部显示内容的最简单解决方案是将它们都放在某种布局中,以便它们重叠。例如,您可以使用具有 ImageView 尺寸的 RelativeLayout,ImageView 在两个尺寸上都是 match_parent,在中心是 TextView。

2) 您可以将 Imageview 保存在不同的布局中,例如 header.xml,并在您需要的任何地方通过include header.xml使用它。

3)如果要在 ImageView 顶部显示的布局在任何地方都相同,那么您可以使用 ImageView 创建一个自定义布局,并说一个 TextView 在中心,并在任何地方使用该布局。然后,您可以在此自定义布局上设置 TextView 字符串。您可以阅读有关自定义布局的更多信息,它们很简单。

于 2016-04-05T07:20:21.340 回答
-6

使用scaleType = "centerCrop"您正在实现您想要的结果,裁剪图像的边缘并显示适合该尺寸的中心部分

对于 ImageView :

ImageView具有仅适用于将其设置为要显示的源的图像的scaleType属性。即好像它是它的来源。TextViewText

甚至您可能已经注意到scaleType 不适用于设置为背景的图像,该背景仅适用于在运行时以 XML 或 XML 作为源提供的图像。

对于布局

Layout可以显示背景图像,但没有为布局提供任何属性可以处理背景图像并根据属性的值对其进行缩放。

所以你应该停止询问ImageViewfrom的功能Layout,因为它没有它。

2 种不同的解决方案来解决您的问题

1)在不同的可绘制文件夹中保留适当的背景标题图像并使用它,这样您就不需要在运行时缩放它,因为您已经为不同的尺寸开发了图像。

2) 您只需要重新设计您的 XML,如下例所示

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

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:background="@drawable/subway"
        android:scaleType="centerCrop" />

    <Button
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
         />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        />
</RelativeLayout> 
于 2013-03-13T10:12:01.080 回答