Межі для перегляду зображення в Android?


Відповіді:


566

Я встановив нижче xml на фон перегляду зображень як графічний. Це працює.

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


112
А потім додайте android:background="@drawable/yourXmlFileName"доImageView
Мітхун Средхаран

10
Кордон працює як ліворуч, так і праворуч, але для верху і знизу він заповнює батьківську верхівку.
Моріс

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

5
@Maurice Ви можете встановити cropToPadding на true.
MikkoP

4
не забудьте встановити cropToPadding = "справжній"
Landry

164

Далі йде код, який у мене раніше було чорною облямівкою. Зауважте, що я не використовував додатковий XML-файл для межі.

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/red_minus_icon"
    android:background="#000000"
    android:padding="1dp"/>

29
так .. це схоже на кордон. Але якщо ви використовуєте малювальне зображення з прозорим фоном, воно не відображатиметься належним чином для вашого зображення. він показує чорний колір, де б ви не мали прозорого. Тож ваша відповідь - не найкращий підхід.
Praveen

19
Так! але у вас є межа без створення іншого XML-файлу.
user609239

7
Це не працює, коли ви змінюєте розмір зображення за допомогою android:scaleType="centerCrop".
Силокс

8
це погано, оскільки це створює непотрібне перевищення
Джей Сойер

1
@Silox for scaleType="centerCrop", обов’язково додайтеcropToPadding="true"
Адам Джонс

24

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

Якщо ви хочете імітувати напівпрозору облямівку, яка не перекриває "твердий" колір форми, використовуйте це у вашому 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>

Мені це теж подобається, але якщо ви робите зовнішні краї занадто маленькими, кути порожні. Він добре працює з чим-небудь 2dp і вище.
Джон Стек

Перевага цього методу полягає в тому, що він дозволяє закруглювати кути. Якщо ви не хочете, щоб межа з попередньої відповіді перекривалась, додайте прокладку до тегу ImageView. Недолік цього методу полягає в тому, що рамка буде витікати в область зображення, якщо використовується напівпрозорий фон. Тому я вибираю попередній метод, тому що мені подобається напівпрозорий фон краще, ніж закруглені кути.
Лео Ландау

24

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

2
лише зауваження щодо цього, якщо зображення задається динамічно, тоді кордон потрібно встановити знову в коді іншого, якщо зображення перебуває за межами.
Rob85

4

Створення кордону

Створіть 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будь-що, що хочете, або додайте відповідні габарити / кольори.

Додайте графічний малюнок як фон у свій 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

або

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

Не забудьте визначити своє newColor.


3

Додайте фон Dravable, як 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 малював над фоном.


3

Це було використано вище, але не згадано виключно.

setCropToPadding(boolean);

Якщо це правда , зображення буде обрізане, щоб вписатись у його підкладку.

Це зробить ImageViewджерело, щоб поміститися в додаток до підкладки, що додається до його фону.

Через XML це можна зробити, як нижче-

android:cropToPadding="true"

2

Ви повинні створити background.xml в Res / Draading цього коду

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

2

Для тих, хто шукає власні межі та форму ImageView. Ви можете використовувати android-shape-imageview

зображення

Просто додайте 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"/>

1

Я майже з цього приводу відмовився.

Це мій стан використання глієда для завантаження зображень, дивіться тут детальну проблему про глісе про перетворення округлих кутів та тут

У мене також однакові атрибути для моїх 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атрибути з цієї відповіді на ТА тут даєте результатandroid:foreground="@drawable/all_round_border_white"

на жаль, це дає мені "не приємний" куточок кордону, як зображено нижче:

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


0

Мені було набагато простіше це зробити:

1) Відредагуйте кадр, щоб вміст містився всередині (за допомогою інструмента 9patch).

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


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>

У наступній відповіді я пояснив це досить добре, будь ласка, подивіться і на це!

Я сподіваюся, що це буде корисно для когось іншого там!


0

У тому ж 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>

0

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

змініть cropToPadding на true і після цього додайте padding.

Тоді у вас буде межа для вашого imageView.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.