Fronteira para uma visualização de imagem no Android?


337

Como posso definir uma borda para um ImageViewe alterar sua cor no Android?


11
Eu tenho uma resposta para mudar a cor de um ImageView, a esperança pode ajudar.
ruidge

Respostas:


566

Defino o xml abaixo como plano de fundo do Image View como Drawable. Funciona.

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

E depois adicione android:background="@drawable/yourXmlFileName"ao seuImageView


112
E em seguida, adicione android:background="@drawable/yourXmlFileName"aImageView
Mithun Sreedharan

10
A borda funciona tanto à esquerda quanto à direita, mas para cima e para baixo ela preenche o pai até o topo.
Maurice

3
Oh, bom, é isso que eu também quero. Lembre-se de definir o preenchimento para o seu ImageView.
Emeraldhieu

5
@Maurice Você pode definir cropToPadding como true.
MikkoP

4
não esqueça cropToPadding set = "true"
Landry

164

A seguir está o código que eu costumava ter borda preta. Observe que eu não usei arquivo xml extra para borda.

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

29
sim .. parece uma borda. Porém, quando você usa uma imagem desenhável com fundo transparente, ela não mostra a imagem corretamente. mostra a cor preta onde quer que você tenha o transparente. Portanto, sua resposta não é a melhor abordagem.
Praveen

19
sim! mas você tem uma borda sem criar outro arquivo xml.
User609239

7
Isso não funciona quando você redimensiona a imagem usando android:scaleType="centerCrop".
Silox 23/02

8
isso é ruim porque cria overdraw desnecessário
Jay Soyer

11
@Silox para scaleType="centerCrop", certifique-se de também adicionarcropToPadding="true"
Adam Johns

24

Este é um post antigo que eu conheço, mas achei que isso poderia ajudar alguém por aí.

Se você deseja simular uma borda translúcida que não se sobrepõe à cor "sólida" da forma, use-a no seu xml. Observe que eu não uso a tag "stroke" aqui, pois parece sempre se sobrepor à forma desenhada.

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

Também gosto disso, mas se você tornar as bordas externas muito pequenas, os cantos ficarão em branco. Funciona bem com qualquer coisa 2dp e acima.
John Stack

A vantagem desse método é que ele permite cantos arredondados. Se você não deseja que a borda da resposta anterior se sobreponha, adicione preenchimento à tag ImageView. A desvantagem deste método é que a borda sangrará na área da imagem se estiver usando um fundo translúcido. Por isso, escolhi o método anterior porque gosto mais do fundo translúcido do que dos cantos arredondados.
Leo Landau

24

ImageView no arquivo 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" />

salve o código abaixo com o nome de border_image.xmle ele deve estar na pasta drawable

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

se você quiser dar um canto arredondado à borda da imagem, poderá alterar uma linha no arquivo border.xml

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

2
apenas uma observação: se a imagem for configurada dinamicamente, a borda precisará ser configurada novamente no código, caso contrário, a imagem estará sobre a borda.
Rob85

4

Criar borda

Crie um arquivo xml (por exemplo, "frame_image_view.xml") com o seguinte conteúdo na sua pasta drawable:

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

Substitua @dimen/borderThicknesse@color/borderColor com o que quiser ou adicione dimen / cor correspondente.

Adicione o Drawable como plano de fundo ao seu 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" />

Você precisa usar android:cropToPadding="true", caso contrário, o preenchimento definido não terá efeito. Como alternativa, use android:padding="@dimen/borderThickness"o ImageView para obter o mesmo. Se a borda enquadrar o pai em vez do ImageView, tente usar android:adjustViewBounds="true".

Alterar cor da borda

A maneira mais fácil de alterar a cor da borda no código é usar o atributo tintBackgound.

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

ou

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

Não se esqueça de definir o seu newColor.


3

Adicione um Drawable em segundo plano como 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>

Atualize o plano de fundo do ImageView em 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" />
...

Exclua o preenchimento do ImageView se desejar que o src desenhe sobre o plano de fundo.


3

Isso foi usado acima, mas não mencionado exclusivamente.

setCropToPadding(boolean);

Se verdadeiro , a imagem será cortada para caber dentro do preenchimento.

Isso fará com que a ImageViewfonte caiba dentro do preenchimento adicionado ao plano de fundo.

Via XML, isso pode ser feito da seguinte maneira:

android:cropToPadding="true"

2

você deve criar um background.xml em res / drawable este código

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

Para quem está pesquisando borda e forma personalizadas do ImageView. Você pode usar o android-shape-imageview

imagem

Basta adicionar compile 'com.github.siyamed:android-shape-imageview:0.9.+@aar'ao seubuild.gradle .

E use em seu layout.

<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

Eu quase desisti disso.

Esta é minha condição usando o deslize para carregar a imagem, consulte o problema detalhado do deslize aqui sobre transformações de cantos arredondados e aqui

Eu também tenho os mesmos atributos para o meu ImageView, pois todos respondem aqui 1 , aqui 2 e aqui 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"

Mas ainda sem sucesso.

Depois de pesquisar por algum tempo, o uso de foregroundatributos desta resposta SO fornece um resultadoandroid:foreground="@drawable/all_round_border_white"

infelizmente, isso me deu o canto da borda "nada legal", como na imagem abaixo:

insira a descrição da imagem aqui


0

Achei muito mais fácil fazer isso:

1) Edite o quadro para incluir o conteúdo (com a ferramenta 9patch).

2) Coloque o ImageViewinterior a Linearlayoute defina o plano de fundo ou a cor do quadro que você deseja como plano de fundo do Linearlayout. Conforme você define o quadro para ter o conteúdo dentro dele, você ImageViewestará dentro do quadro (exatamente onde você definiu o conteúdo com a ferramenta 9patch).


0

A seguir, é minha solução mais simples para esse longo problema.

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

Na resposta a seguir eu expliquei bem o suficiente, por favor, dê uma olhada nisso também!

Espero que isso seja útil para alguém por aí!


0

No mesmo xml que usei a seguir:

    <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

Primeiro, adicione a cor de fundo que você deseja como a cor da borda e, em seguida, insira a descrição da imagem aqui

altere o cropToPadding para true e depois adicione o preenchimento.

Então você terá sua borda para o seu imageView.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.