Android – 在ImageView周围设置边框

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

 <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> 

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

注意黄色边框,我需要在ImageView周围精确到1px:

在这里输入图像说明

任何帮助,想法,任何forms的build议都非常感谢。

Solutions Collecting From Web of "Android – 在ImageView周围设置边框"

如果您将填充= 1和背景颜色放在LinearLayout中,则会有1px的黄色边框。

这是为我工作的…

 <!-- @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边框的结果。

示例imageview边框1dp黑色。

如果图像的大小是可变的,那么你总能得到这个效果。 我想你需要为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像素。

例

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

你可以使用自定义的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); } } 

只需将属性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”。

这对我来说是有效的:

  <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"/> 

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

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

 android:adjustViewBounds = "true" 

要么

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

要么

 android:adjustViewBounds = "true" android:scaleType="centerCrop" 

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

 <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> 

如果你想进一步解释,请看下面的链接 ,我已经解释得很好。

希望这可能有助于你在那里的任何人!

干杯!

你必须在你的imageview中添加scaletyle。 之后,你的形象将是适合的。

机器人:scaleType = “fitXY”