Граница для представления изображения в Android?

Как установить границу для ImageView и изменить ее цвет в Android?


person Praveen    schedule 16.07.2010    source источник
comment
У меня есть ответ для изменения цвета ImageView, надеюсь, может помочь.   -  person ruidge    schedule 18.12.2013


Ответы (17)


Я установил указанный ниже xml в качестве фона представления изображения как Drawable. Оно работает.

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF" />
    <stroke android:width="1dp" android:color="#000000" />
    <padding android:left="1dp" android:top="1dp" android:right="1dp"
        android:bottom="1dp" />
</shape>

А затем добавьте android:background="@drawable/yourXmlFileName" в свой ImageView

person Praveen    schedule 16.07.2010
comment
А затем добавьте android:background="@drawable/yourXmlFileName" к ImageView - person Mithun Sreedharan; 07.04.2011
comment
Мой макет в действии выглядит следующим образом ‹LinearLayout android: layout_width = fill_parent android: layout_height = fill_parent› ‹ImageView android: id = @ + id / picture android: layout_width = fill_parent android: layout_height = fill_parent android: layout_gravity = center /› ‹ / LinearLayout ›Граница заполняет весь фон там, где изображение не закрывает, в данном случае это белый цвет. Есть ли способ обернуть imageView рамкой в ​​1 dp, но все еще используя этот метод? - person Maurice; 22.07.2011
comment
Я не могу вас правильно понять. Если вы не хотите отображать белый фон, измените цвет <solid> на прозрачный или что-то еще, как хотите. - person Praveen; 22.07.2011
comment
Граница работает как слева, так и справа, но сверху и снизу заполняет родительский элемент сверху. - person Maurice; 22.07.2011
comment
вы имеете в виду, что у вас не получается граница сверху и снизу? это? - person Praveen; 22.07.2011
comment
для начала нам нужно знать, какое место вы покрываете рамкой. Пожалуйста, измените цвет <stroke> на красный (# FF0000). тогда вы получите некоторое представление. - person Praveen; 22.07.2011
comment
О, хорошо, я тоже этого хочу. Не забудьте установить отступ для вашего ImageView. - person emeraldhieu; 15.08.2012
comment
большое спасибо! у меня это сработало! Я добавил только отступы, потому что у моего изображения не было верхней и нижней строк .. отступы решили это. Благодарность!! - person nurnachman; 21.11.2012
comment
Думаю, практичнее просто использовать красную (# ffff0000) обводку. - person nipponese; 15.03.2013
comment
можем ли мы изменить границу в java файле? - person Rohit; 14.06.2013
comment
@Maurice Вы можете установить для параметра cropToPadding значение true. - person MikkoP; 07.08.2013
comment
Для «А затем добавить android:background="@drawable/yourXmlFileName" в ImageView.» ПРИМЕЧАНИЕ: минус .xml. И не используйте '-' в имени файла (как правило, с ресурсами). (Мне потребовалось несколько перекомпиляций, чтобы выяснить это.) - person Sz.; 18.01.2014
comment
Для прозрачных изображений это дает фон, а не границу. - person Jasper; 25.01.2015
comment
Мне потребовалось некоторое время, чтобы понять это, но в коде: setBackground (getResources (). GetDrawable (R.drawable.your_xml_here)); - person TekiusFanatikus; 08.02.2015
comment
@praveen, как можно менять цвет границы каждый раз, когда мне нужно изменить атрибут штриха в xml? - person Ajay Pandya; 07.04.2015
comment
не забывайте, что параметр cropToPadding = true - person landry; 05.06.2015
comment
В другом ответе вы отмечаете, что он рисует черный фон, что не предназначено. Ваш ответ рисует белый фон, что тоже не предназначено. Вы должны изменить #FFFFFF на @android:color/transparent или #00000000. - person ; 28.01.2017
comment
Добавьте отступ, чтобы увидеть эффект ¡ - person Terranology; 21.09.2018

Ниже приведен код, который у меня был с черной рамкой. Обратите внимание, что я не использовал дополнительный XML-файл для границы.

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/red_minus_icon"
    android:background="#000000"
    android:padding="1dp"/>
person user609239    schedule 19.05.2011
comment
ага .. это похоже на бордюр. Но когда вы используете рисованное изображение с прозрачным фоном, оно не будет правильно отображать ваше изображение с рамкой. он показывает черный цвет везде, где у вас есть прозрачный. Так что ваш ответ - не лучший подход. - person Praveen; 19.05.2011
comment
Ага! но у вас есть граница без создания другого XML-файла. - person user609239; 08.06.2011
comment
Это не работает, когда вы изменяете размер изображения с помощью android:scaleType="centerCrop". - person Silox; 24.02.2013
comment
это плохо, потому что создает ненужную перерисовку - person Jay Soyer; 20.04.2013
comment
@Silox для scaleType="centerCrop", обязательно добавьте cropToPadding="true" - person Adam Johns; 28.04.2016
comment
Я также использую scaleType="centerCrop" с cropToPadding="true", но в редких случаях все еще не показывает закругленный угол - person mochadwi; 20.01.2020
comment
+1 Что касается этого подхода, вы также можете нарисовать рамку вокруг изображения без прямых краев. просто установите такое же изображение в качестве фона. @Praveen: Вы пробовали установить android: backgroundTint? Установив это, вы даже можете использовать прозрачные фоновые изображения. - person Thomas Gramer; 05.02.2021

ImageView в файле xml

<ImageView
            android:id="@+id/myImage"
            android:layout_width="100dp"
            android:layout_height="100dp"

            android:padding="1dp"
            android:scaleType="centerCrop"
            android:cropToPadding="true"
            android:background="@drawable/border_image"

            android:src="@drawable/ic_launcher" />

сохраните код ниже с именем border_image.xml, и он должен быть в папке с возможностью переноса

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <gradient
        android:angle="270"
        android:endColor="#ffffff"
        android:startColor="#ffffff" />

    <corners android:radius="0dp" />

    <stroke
        android:width="0.7dp"
        android:color="#b4b4b4" />
</shape>

если вы хотите придать закругленный угол границе изображения, вы можете изменить строку в файле border.xml

<corners android:radius="4dp" />
person Ashish Saini    schedule 11.07.2014
comment
просто примечание об этом, если изображение устанавливается динамически, тогда граница должна быть снова установлена ​​в коде, иначе изображение выходит за границу. - person Rob85; 20.10.2016
comment
Я не заметил никаких странностей, когда использовал `ImageView.setImageBitmap (photoBmp) ' - person Someone Somewhere; 07.07.2020

Это старый пост, который я знаю, но я подумал, что это может кому-то помочь.

Если вы хотите смоделировать полупрозрачную границу, которая не перекрывает «сплошной» цвет фигуры, используйте это в своем xml. Обратите внимание, что я вообще не использую тег «обводка», поскольку кажется, что он всегда перекрывает фактическую нарисованную фигуру.

  <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item>
        <shape android:shape="rectangle" >
            <solid android:color="#55111111" />

            <padding
                android:bottom="10dp"
                android:left="10dp"
                android:right="10dp"
                android:top="10dp" />

            <corners android:radius="5dp" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle" >
            <padding
                android:bottom="5dp"
                android:left="5dp"
                android:right="5dp"
                android:top="5dp" />

            <solid android:color="#ff252525" />
        </shape>
    </item>
</layer-list>
person mdupls    schedule 12.04.2012
comment
Мне это тоже нравится, но если вы сделаете внешние края слишком маленькими, углы останутся пустыми. Он хорошо работает с любыми 2dp и выше. - person John Stack; 18.09.2012
comment
Преимущество этого метода в том, что он позволяет закруглять углы. Если вы не хотите, чтобы граница из предыдущего ответа перекрывалась, добавьте отступ к тегу ImageView. Недостатком этого метода является то, что при использовании полупрозрачного фона граница будет растекаться в область изображения. Поэтому я выбрал предыдущий метод, потому что мне больше нравится полупрозрачный фон, чем закругленные углы. - person Leo Landau; 12.09.2013

Создать границу

Создайте XML-файл (например, "frame_image_view.xml") со следующим содержимым в вашей папке для рисования:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke
        android:width="@dimen/borderThickness"
        android:color="@color/borderColor" />
    <padding
        android:bottom="@dimen/borderThickness"
        android:left="@dimen/borderThickness"
        android:right="@dimen/borderThickness"
        android:top="@dimen/borderThickness" />
    <corners android:radius="1dp" /> <!-- remove line to get sharp corners -->
</shape>

Замените @dimen/borderThickness и @color/borderColor на все, что хотите, или добавьте соответствующий размер / цвет.

Добавьте Drawable в качестве фона в ImageView:

<ImageView
        android:id="@+id/my_image_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/frame_image_view"
        android:cropToPadding="true"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter" />

Вы должны использовать android:cropToPadding="true", иначе заданное заполнение не действует. В качестве альтернативы используйте android:padding="@dimen/borderThickness" в ImageView, чтобы добиться того же. Если рамка обрамляет родительский элемент вместо вашего ImageView, попробуйте использовать android:adjustViewBounds="true".

Изменить цвет границы

Самый простой способ изменить цвет границы в коде - использовать атрибут tintBackgound.

ImageView img = findViewById(R.id.my_image_view);
img.setBackgroundTintList(ColorStateList.valueOf(Color.RED); // changes border color to red

or

ImageView img = findViewById(R.id.my_image_view);
img.setBackgroundTintList(getColorStateList(R.color.newColor));

Не забудьте определить свой newColor.

person SuperSmartWorld    schedule 08.08.2019
comment
обводка выглядит хорошо, однако между рамкой и изображением есть прозрачный зазор (сверху и снизу). - person Someone Somewhere; 07.07.2020

Добавьте фон Drawable, например res / drawables / background.xml:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <solid android:color="@android:color/white" />
  <stroke android:width="1dp" android:color="@android:color/black" />
</shape>

Обновите фон ImageView в res / layout / foo.xml:

...
<ImageView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:padding="1dp"
  android:background="@drawable/background"
  android:src="@drawable/bar" />
...

Исключите заполнение ImageView, если вы хотите, чтобы src отображался поверх фона.

person Stephen Niedzielski    schedule 06.07.2016

Это использовалось выше, но не упомянуто исключительно.

setCropToPadding(boolean);

Если true, изображение будет обрезано по размеру отступа.

Это заставит ImageView источник вписаться в дополнение, добавленное к его фону.

Через XML это можно сделать, как показано ниже:

android:cropToPadding="true"
person Atul O Holic    schedule 12.08.2015

вы должны создать background.xml в res / drawable этого кода

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<corners android:radius="6dp" />
<stroke
    android:width="6dp"
    android:color="@android:color/white" />
<padding
    android:bottom="6dp"
    android:left="6dp"
    android:right="6dp"
    android:top="6dp" />
</shape>
person Cabezas    schedule 09.06.2015

Для тех, кто ищет пользовательские границы и форму ImageView. Вы можете использовать android-shape-imageview

image

Просто добавьте compile 'com.github.siyamed:android-shape-imageview:0.9.+@aar' в свой build.gradle.

И используйте в своем макете.

<com.github.siyamed.shapeimageview.BubbleImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/neo"
    app:siArrowPosition="right"
    app:siSquare="true"/>
person Khemraj Sharma    schedule 11.07.2018

Сначала добавьте цвет фона, который вы хотите использовать в качестве цвета границы, затем  введите описание изображения здесь

измените значение параметра cropToPadding на true и после этого добавьте отступы.

Тогда у вас будет граница для вашего imageView.

person Achintha Isuru    schedule 03.08.2019

Я почти разочаровался в этом.

Это мое состояние при использовании скольжения для загрузки изображения, см. подробную информацию о скругленном угле здесь. преобразования и здесь

У меня такие же атрибуты для моего ImageView, для всех ответьте здесь 1, здесь 2 и здесь 3

android:cropToPadding="true"
android:adjustViewBounds="true"
android:scaleType="fitCenter"`
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/path_to_rounded_drawable"

Но все равно безуспешно.

После некоторого исследования использование атрибутов foreground из этого SO-ответа здесь дает результат android:foreground="@drawable/all_round_border_white"

к сожалению, это дает мне "неприятный" угол границы, как на изображении ниже:

введите здесь описание изображения

person mochadwi    schedule 20.01.2020

Просто добавьте этот код в свой ImageView:

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <solid
        android:color="@color/white"/>

    <size
        android:width="20dp"
        android:height="20dp"/>
    <stroke
        android:width="4dp" android:color="@android:color/black"/>
    <padding android:left="1dp" android:top="1dp" android:right="1dp"
        android:bottom="1dp" />
</shape>
person Jamil Hasnine Tamim    schedule 04.09.2020

Мне стало намного проще сделать это:

1) Отредактируйте фрейм, чтобы внутри было содержимое (с помощью инструмента 9patch).

2) Поместите ImageView внутрь Linearlayout и установите желаемый фон рамки или цвет в качестве фона для Linearlayout. Когда вы устанавливаете во фрейме содержимое внутри себя, ваш ImageView будет внутри фрейма (именно там, где вы устанавливаете контент с помощью инструмента 9patch).

person noloman    schedule 25.06.2012

Ниже приводится мое самое простое решение этой долгой проблемы.

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

В следующем ответе я объяснил это достаточно хорошо, пожалуйста, взгляните и на это!

Я надеюсь, что это будет полезно для кого-то еще!

person Randika Vishman    schedule 19.06.2015

В том же xml я использовал следующее:

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#ffffff" <!-- border color -->
        android:padding="3dp"> <!-- border width -->

        <ImageView
            android:layout_width="160dp"
            android:layout_height="120dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:scaleType="centerCrop" />
    </RelativeLayout>
person porquero    schedule 09.02.2016

Граница с отступом

Добавьте к фигуре следующий код:

<gradient
    android:angle="135"
    android:endColor="#FF444444"
    android:centerColor="#FFAAAAAA"
    android:startColor="#FFFFFFFF"/>

ét voila, у вас есть (более или менее) отступ границы, с источником света, установленным в левом верхнем углу. Поиграйте с размером растрового изображения (в отношении размера изображения я использовал изображение 200dp x 200dp и растровое изображение 196dp x 196dp в примере с радиусом 14dp для углов) и отступы, чтобы получить лучший результат. Переключите конечный и начальный цвета для эффекта скошенной кромки.

Вот полный код формы, которую вы видите на изображении (сохраните его в res / drawable, например, border_shape.xml):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:angle="135"
        android:endColor="#FF444444"
        android:centerColor="#FFAAAAAA"
        android:startColor="#FFFFFFFF"/>
    <padding
        android:top="2dp"
        android:left="2dp"
        android:right="2dp"
        android:bottom="2dp"/>
    <corners
        android:radius="30dp"/>
</shape>

И назовите это в вашем изображении следующим образом:

android:scaleType="center"    
android:background="@drawable/border_shape"
android:cropToPadding="true"
android:adjustViewBounds="true"

А вот код растрового изображения с закругленными углами:

Bitmap getRoundedRectBitmap(Bitmap bitmap, float radius) {
    Paint paint = new Paint();
    PorterDuffXfermode pdmode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
    Bitmap bm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bm);
    Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    RectF rectF = new RectF(rect);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(0xff424242);
    canvas.drawRoundRect(rectF, radius, radius, paint);
    paint.setXfermode(pdmode);
    canvas.drawBitmap(bitmap, rect, rect, paint);
    return bm;
}
person Danny E.K. van der Kolk    schedule 26.12.2020

Вы можете использовать патч 9 в Android Studio для создания границ!

Я искал решение, но не нашел, поэтому пропустил эту часть.

Затем я обратился к изображениям ресурсов Firebase в Google и случайно обнаружил, что они используют 9patch.

9патч в действии

Вот ссылка: https://developer.android.com/studio/write/draw9patch

Вам просто нужно перетащить туда, где есть края.

Это как граница границы в Unity.

person DEEz    schedule 23.07.2020