31

我有一个固定宽度和高度的单元格,让它为 100x100px。在该单元格内,我想显示一个ImageView带有边框的。
我的第一个想法是在 中放一个背景资源ImageView,并添加 1dp 的填充以创建边框效果:

<LinearLayout
        android:layout_width="100dp"
        android:layout_height="100dp" >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/image_border"
        android:padding="1dp"
        android:src="@drawable/test_image" />

</LinearLayout>

显然这应该有效,但它没有,或者至少不像预期的那样。
问题是 ImageView 背景填充了整个 100x100px 单元格的空间,因此,如果图像的宽度小于 100px,则顶部和底部边框会显得更大。

注意黄色边框,我需要它在 ImageView 周围正好 1px:

在此处输入图像描述

任何帮助,想法,任何形式的建议都非常非常感谢。

4

9 回答 9

50

如果你把 padding=1 和背景颜色放在 LinearLayout 中,你会有一个 1px 的黄色边框。

于 2012-09-24T20:23:31.890 回答
32

这对我有用...

<!-- @drawable/image_border -->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <solid android:color="@color/colorPrimary"/>
  <stroke android:width="1dp" android:color="#000000"/>
  <padding android:left="1dp" android:top="1dp" android:right="1dp" android:bottom="1dp"/>
</shape>

<ImageView
  android:layout_width="300dp"
  android:layout_height="300dp"
  android:layout_gravity="center"
  android:padding="1dp"
  android:cropToPadding="true"
  android:scaleType="centerCrop"
  android:background="@drawable/image_border"/>

这是我使用带有边框的 viewpager 和 imageview 得到的结果。

带有边框 1dp 黑色的示例图像视图。

于 2015-05-19T22:24:46.630 回答
9

如果图像大小可变,那么您将始终获得该效果。我想你需要为 ImageView 设置一个固定的大小并给它一个设置的背景颜色 - 从你的示例的外观来看黑色是有道理的。将 imageview 包装在 FrameLayout 或仅具有黄色背景和 1px 填充的视图中。

编辑


我想了想,我的答案感觉不对,所以......

如果您将每个 ImageView 设置为固定大小、填充和边距。然后根据需要设置背景颜色就可以得到你想要的效果。

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


        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:background="#52D017"
            android:padding="1dp"
            android:layout_margin="5dp"
            android:src="@drawable/test1"
            tools:ignore="ContentDescription" />

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="5dp"
            android:background="#52D017"
            android:padding="1dp"
            android:src="@drawable/test2"
            tools:ignore="ContentDescription" />

</LinearLayout>

在屏幕截图中,两个显示的图像的宽度和高度都小于 100 像素。

例子

这不处理具有透明背景的图像,因为(在这种情况下)黄绿色显示出来。您可以通过将每个 ImageView 包装在 FrameLayout 中来解决此问题。使 ImageView 背景变黑并使用所需的填充将 FrameLayout 设置为 WrapContent(我认为)

于 2012-09-24T20:35:05.440 回答
4

你可以使用自定义的imageview,从那里你可以得到边框,这里是代码。您还可以根据需要更改填充宽度和笔划宽度。它在第一行代码下方指定,谢谢

public class FreeCollage extends ImageView {

    private static final int PADDING = 8;
    private static final float STROKE_WIDTH = 5.0f;

    private Paint mBorderPaint;

    public FreeCollage(Context context) {
        this(context, null);
    }

    public FreeCollage(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        setPadding(PADDING, PADDING, PADDING, PADDING);
    }

    public FreeCollage(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initBorderPaint();
    }

    private void initBorderPaint() {
        mBorderPaint = new Paint();
        mBorderPaint.setAntiAlias(true);
        mBorderPaint.setStyle(Paint.Style.STROKE);
        mBorderPaint.setColor(Color.WHITE);
        mBorderPaint.setStrokeWidth(STROKE_WIDTH);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(PADDING, PADDING, getWidth() - PADDING, getHeight() - PADDING, mBorderPaint);
    }
}
于 2015-03-12T09:01:01.567 回答
4

这对我有用:

    <ImageView
        android:id="@+id/dialpad_phone_country_flag"
        android:layout_width="22dp"
        android:layout_height="15dp"
        android:scaleType="fitXY"
        android:background="@color/gen_black"
        android:padding="1px"/>
于 2015-05-20T12:16:57.070 回答
3

只需将属性 adjustViewBounds 添加到 ImageView。

<ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/image_border"
        android:padding="1dp"
        android:adjustViewBounds="true"
        android:src="@drawable/test_image" />

请注意,android:adjustViewBounds="true"仅适用于android:layout_widthandroid:layout_height设置为“wrap_content”。

于 2014-10-17T15:20:09.340 回答
1

只需在 ImageView 布局中添加波纹管

如果 imageview 的 layout_width 和 layout_height 不是 match_parent 而不是使用,

android:adjustViewBounds = "true"

或者

android:adjustViewBounds = "true"
android:scaleType="fitXY"

或者

android:adjustViewBounds = "true"
android:scaleType="centerCrop"
于 2015-08-12T09:50:13.427 回答
0

以下是我在最简单的解决方案中使用的代码片段。

<FrameLayout
    android:layout_width="112dp"
    android:layout_height="112dp"
    android:layout_marginLeft="16dp" <!-- May vary according to your needs -->
    android:layout_marginRight="16dp" <!-- May vary according to your needs -->
    android:layout_centerVertical="true">
    <!-- following imageView acts as the boarder which sitting in the background of our main container ImageView -->
    <ImageView
        android:layout_width="112dp"
        android:layout_height="112dp"
        android:background="#000"/>
    <!-- following imageView holds the image as the container to our image -->
    <!-- layout_margin defines the width of our boarder, here it's 1dp -->
    <ImageView
        android:layout_width="110dp"
        android:layout_height="110dp"
        android:layout_margin="1dp"
        android:id="@+id/itemImageThumbnailImgVw"
        android:src="@drawable/banana"
        android:background="#FFF"/>
</FrameLayout>

如果您需要进一步的解释,请查看以下链接,我已经充分解释了它。

希望这可能对你有帮助!

干杯!

于 2015-06-19T06:46:15.907 回答
0

您必须在您的图像视图中添加比例样式。之后,您的图像将适合。

android:scaleType="fitXY"

于 2016-02-18T10:25:20.027 回答