我希望有一个固定大小的盒子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内部,而后台未被覆盖。但为了证明不正确的宽高比我增加了上限。见下图。我尝试了剩余的值,但是他们要么在边框上画画,要么不填充完整的内部部分。
如何使用具有正确纵横比的图片部分边框的图块?图片可以剪切。我认为这种技术被称为中心作物。我在毕加索图书馆找到了它。
FitXY变形图片:
在保留纵横比的同时裁剪图片时手绘图片。对不起,它看起来很难看,但赏金很快就结束了。
Bjorn的回答:
Rahul回答没有底部边框
答案 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:src
或ImageView.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" />
答案 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>
答案 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>