具有正确宽高比和边框的Android图片

Leo*_*rak 5 android

我希望有一个固定大小的盒子120x180 dp,其中包含一个正确宽高比的图片和周围画的边框.

XML:

<android.support.constraint.ConstraintLayout
android:layout_width="120dp"
android:layout_height="180dp"
app:layout_gravity="center">

<ImageView
    android:id="@+id/picture"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@drawable/game_border"
    app:srcCompat="@drawable/pic_lion"
    android:scaleType="centerInside" />
Run Code Online (Sandbox Code Playgroud)

Game_border布局:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
    <shape android:shape="rectangle" >
        <solid android:color="#55111111" />
        <padding
            android:bottom="4dp"
            android:left="4dp"
            android:right="4dp"
            android:top="4dp" />

        <corners android:radius="6dp" />
    </shape>
</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)

scaleType设置工作正常,因为它填充完整的瓷砖内部和背景不被覆盖.但为了证明不正确的宽高比我增加了上限.见下图.我尝试了剩余的值,但是他们要么在边框上画画,要么不填充完整的内部部分.

如何使用具有正确纵横比的图片部分边框的图块?图片可以剪切.我认为这种技术被称为中心作物.我在毕加索图书馆找到了它.

在此输入图像描述

FitXY变形图片:

不好的方面

在保留纵横比的同时裁剪图片时手绘图片.对不起,它看起来很难看,但赏金很快结束了.

在此输入图像描述

比约恩的回答:

在此输入图像描述

拉胡尔答案没有底边

在此输入图像描述

Rah*_*var 5

<ImageView
android:id="@id/img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="fitCenter" />
Run Code Online (Sandbox Code Playgroud)

scaleType ="fitCenter"(省略时默认)

  • 将使其与父级允许的一样宽,并根据需要保持纵横比的上/下缩放.

    scaleType = "centerInside"

  • 如果src的固有宽度小于父宽度,则会使图像水平居中

  • f src的固有宽度大于父宽度将使其宽度与父级允许的宽度和缩小比例保持宽高比.

如果您使用android:srcImageView.setImage*.key是android:adjustViewBounds并不重要

或者 使用CardView也可以为imageView制作圆角.

 <android.support.v7.widget.CardView 
    android:layout_width="120dp"
    android:layout_height="180dp"
    android:layout_gravity="center"
    android:layout_marginLeft="6dp"
    android:layout_marginRight="6dp"
    android:layout_marginTop="6dp"
    app:cardCornerRadius="@dimen/_5dp"
    app:cardBackgroundColor="#D3D3D3"
    app:cardPreventCornerOverlap="false"
    card_view:cardPreventCornerOverlap="false">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="3dp"
        android:background="@drawable/image"
        android:scaleType="fitXY" />

</android.support.v7.widget.CardView>
Run Code Online (Sandbox Code Playgroud)


Bjö*_*hel 1

使用简单的 Framelayout 作为背景,使用 centerCrop 作为 ImageView:

<FrameLayout
    android:layout_width="120dp"
    android:layout_height="180dp"
    android:background="@drawable/background_with_rounded_corners"
    android:padding="4dp">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"/>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

并将填充移动到 FrameLayout 中,因此对于背景资源文件,您只需要颜色和角:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#55111111" />
            <corners android:radius="6dp" />
        </shape>
    </item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)