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

时间:2016-12-31 16:31:06

标签: 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" />

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>

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

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

enter image description here

FitXY变形图片:

Bad aspect

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

enter image description here

Bjorn的回答:

enter image description here

Rahul回答没有底部边框

enter image description here

6 个答案:

答案 0 :(得分:5)

<ImageView
android:id="@id/img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="fitCenter" />

scaleType =&#34; fitCenter&#34; (省略时默认)

  • 将使其与父级允许的范围一样宽,并根据需要按比例缩放或保持宽高比。

    scaleType =&#34; centerInside&#34;

  • 如果src的固有宽度小于父宽度 将水平居中图像

  • f src的固有宽度大于父宽度 将使其与父级允许的范围一样宽,并使其缩小保持宽高比。

如果您使用android:srcImageView.setImage*,则无关紧要 机器人: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>

答案 1 :(得分:2)

圆角ImageView可能是一项痛苦的任务。您可以使用支持圆角和边框的库。例如

https://github.com/vinc3m1/RoundedImageView

如果您了解它的功能,那么您可以轻松创建自己的ImageView。诀窍是使用路径覆盖ImageView的onDraw方法和剪辑。您可以找到一些与此主题相关的文章。

答案 2 :(得分:2)

您可以使用两个单独的ImageView:一个用于帧,另一个用于图片。这样你就可以使用ScaleType&#34; centerCrop&#34;在图片ImageView上,结果图片将始终保持所需的宽高比,并在其周围有边框。

只需确保设置两个ImageView上的约束,以便两个ImageView都跨越父级。

代码:

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="120dp"
android:layout_height="180dp">

<ImageView
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:srcCompat="@drawable/game_border"
    android:id="@+id/frame"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"/>

<ImageView
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:srcCompat="@drawable/lion"
    android:id="@+id/picture"
    android:scaleType="centerCrop"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    android:layout_marginTop="4dp"
    android:layout_marginStart="4dp"
    android:layout_marginLeft="4dp"
    android:layout_marginEnd="4dp"
    android:layout_marginRight="4dp"
    android:layout_marginBottom="4dp" />

结果: Picture_with_border

答案 3 :(得分:1)

由于您已经在使用ConstraintLayout,因此可以使用这个方便的属性app:layout_constraintDimensionRatio来指定宽高比尺寸。这是下图的布局代码。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

  <ImageView
      android:id="@+id/picture"
      android:layout_width="120dp"
      android:layout_height="0dp"
      android:background="@drawable/game_border"
      android:scaleType="centerInside"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintDimensionRatio="h, 2:3"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      app:srcCompat="@drawable/vertical_deploy"
      />

</android.support.constraint.ConstraintLayout>

example

答案 4 :(得分:1)

试试这个:

<LinearLayout
        android:layout_width="120dp"
        android:layout_height="180dp"
        android:background="@drawable/game_border">

        <ImageView
            android:id="@+id/picture"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:srcCompat="@drawable/pic_lion"
            android:scaleType="centerCrop" />

    </LinearLayout>
希望能帮到你!

答案 5 :(得分: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>

并将填充移动到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>