如何在保持宽高比的同时在App Widget中填充ImageView?

时间:2014-01-04 11:09:14

标签: java android android-imageview android-image android-appwidget

我有一个包含ImageView的简单小部件。我想从网络上获取图片并在ImageView中显示,同时保持宽高比。

这是小部件的布局定义:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ImageView
        android:id="@+id/quality_image"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/widget_icon"
        android:layout_marginBottom="@dimen/widget_spacing"
        android:scaleType="fitXY" />

</LinearLayout>

..这是有问题的图片:

enter image description here

我希望图片始终符合ImageView的高度。这一点很简单。如果ImageView的宽度小于图像的宽度,我不介意只要保持纵横比就会水平裁剪图像。我已将窗口小部件的最大大小设置为永远不会超过图像的大小,因此我们不必担心ImageView的高度超过图像时的情况。

我非常迷失于此,并开始想知道这是否可能,因为似乎没有办法访问小部件维度。有时最琐碎的事情让你陷入困境。

1 个答案:

答案 0 :(得分:1)

假设这个问题的一部分是在给定其占据的单元格数量的情况下最大化窗口小部件的高度(根据LinearLayout中的fill_parent,并且给定您可以裁剪宽度)。我将忽略问题的裁剪部分,并提供一个保持指定宽高比的示例。

我发现在AppWidget上保持最大高度的宽高比的最好方法是创建一个固定宽高比的XML Drawable,将其缩小到小部件的最大高度,然后绑定两侧的ImageView使用RelativeLayout。例如:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget_layout"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent" >

    <ImageView
        android:id="@+id/aspectratio"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:adjustViewBounds="true"
        android:src="@drawable/frame_aspect"
        android:scaleType="fitCenter" >
    </ImageView>

    <ImageView
        android:id="@+id/quality_image"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_alignLeft=”@id/aspectratio”
        android:layout_alignRight=”@id/aspectratio”
        android:layout_alignTop=”@id/aspectratio”
        android:layout_alignBottom=”@id/aspectratio”
        android:scaleType="fitCenter" >
</RelativeLayout>

这是drawable(frame_aspect.xml)的布局,用于指定宽高比。注意 - 重要的是这个形状比你的小部件更大。内置的scaleType可以很好地缩小,但不是很好的扩展。

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape = "rectangle">

    <size 
        android:width="1000px"
        android:height="500px"/>
</shape>

现在您有一个小部件,其质量标准缩放到给定宽高比的最大高度,您可以在ImageView上使用scaleType来确定最佳裁剪是什么。