tak .. wygląda jak granica. Ale jeśli użyjesz rysowalnego obrazu z przezroczystym tłem, nie będzie on poprawnie wyświetlał obrazu z ramką. pokazuje czarny kolor, gdziekolwiek masz przezroczysty. Twoja odpowiedź nie jest najlepszym podejściem.
Praveen,
19
Tak! ale masz ramkę bez tworzenia kolejnego pliku xml.
user609239,
7
Nie działa to przy zmianie rozmiaru obrazu za pomocą android:scaleType="centerCrop".
Silox
8
jest to złe, ponieważ powoduje niepotrzebne przekroczenie
Jay Soyer,
1
@Silox dla scaleType="centerCrop", pamiętaj również o dodaniucropToPadding="true"
Adam Johns
24
To stary post, który znam, ale pomyślałem, że to może pomóc komuś tam.
Jeśli chcesz zasymulować półprzezroczystą ramkę, która nie zachodzi na „jednolity” kolor kształtu, użyj tego w swoim pliku xml. Zauważ, że w ogóle nie używam tagu „stroke”, ponieważ wydaje się, że zawsze nakłada się na faktycznie narysowany kształt.
Też mi się podoba, ale jeśli sprawisz, że zewnętrzne krawędzie będą zbyt małe, rogi będą puste. Działa dobrze z czymkolwiek 2dp i wyższym.
John Stack
Zaletą tej metody jest to, że pozwala ona na zaokrąglone rogi. Jeśli nie chcesz, aby ramka z poprzedniej odpowiedzi nakładała się, dodaj dopełnienie do znacznika ImageView. Wadą tej metody jest to, że obramowanie będzie krwawić do obszaru obrazu, jeśli zostanie użyte półprzezroczyste tło. Wybrałem więc poprzednią metodę, ponieważ bardziej podoba mi się półprzezroczyste tło niż zaokrąglone rogi.
uwaga na ten temat: jeśli obraz jest ustawiany dynamicznie, wówczas należy ponownie ustawić ramkę w kodzie, w przeciwnym razie obraz jest ponad ramką.
Rob85,
4
Utwórz granicę
Utwórz plik xml (np. „Frame_image_view.xml”) z następującą zawartością w folderze do rysowania:
<?xml version="1.0" encoding="utf-8"?><shapexmlns:android="http://schemas.android.com/apk/res/android"><strokeandroid:width="@dimen/borderThickness"android:color="@color/borderColor"/><paddingandroid:bottom="@dimen/borderThickness"android:left="@dimen/borderThickness"android:right="@dimen/borderThickness"android:top="@dimen/borderThickness"/><cornersandroid:radius="1dp"/><!-- remove line to get sharp corners --></shape>
Zastąp @dimen/borderThicknessi @color/borderColorcokolwiek chcesz lub dodaj odpowiedni dimen / kolor.
Musisz użyć android:cropToPadding="true", w przeciwnym razie zdefiniowane wypełnienie nie przyniesie żadnego efektu. Alternatywnie użyj android:padding="@dimen/borderThickness"w ImageView, aby osiągnąć to samo. Jeśli ramka obramia element nadrzędny zamiast ImageView, spróbuj użyć android:adjustViewBounds="true".
Zmień kolor obramowania
Najłatwiejszym sposobem zmiany koloru obramowania w kodzie jest użycie atrybutu tintBackgound.
ImageView img = findViewById(R.id.my_image_view);
img.setBackgroundTintList(ColorStateList.valueOf(Color.RED);// changes border color to red
1) Edytuj ramkę, aby mieć zawartość w środku (za pomocą narzędzia 9patch).
2) Umieść ImageViewwnętrze a Linearlayouti ustaw żądane tło lub kolor ramki jako tło Linearlayout. Gdy ustawisz ramkę tak, aby zawartość była w sobie, ImageViewbędziesz w jej wnętrzu (dokładnie tam, gdzie ustawiasz zawartość za pomocą narzędzia 9patch).
Poniżej znajduje się moje najprostsze rozwiązanie tego długiego problemu.
<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 --><ImageViewandroid: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 --><ImageViewandroid:layout_width="110dp"android:layout_height="110dp"android:layout_margin="1dp"android:id="@+id/itemImageThumbnailImgVw"android:src="@drawable/banana"android:background="#FFF"/></FrameLayout>
W poniższej odpowiedzi wyjaśniłem to wystarczająco dobrze, spójrz na to też!
Odpowiedzi:
Ustawiłem poniższy xml na tle widoku obrazu jako Drawable. To działa.
A następnie dodaj
android:background="@drawable/yourXmlFileName"
do swojegoImageView
źródło
android:background="@drawable/yourXmlFileName"
doImageView
Poniżej znajduje się kod, który kiedyś miałem czarną ramką. Zauważ, że nie użyłem dodatkowego pliku xml do obramowania.
źródło
android:scaleType="centerCrop"
.scaleType="centerCrop"
, pamiętaj również o dodaniucropToPadding="true"
To stary post, który znam, ale pomyślałem, że to może pomóc komuś tam.
Jeśli chcesz zasymulować półprzezroczystą ramkę, która nie zachodzi na „jednolity” kolor kształtu, użyj tego w swoim pliku xml. Zauważ, że w ogóle nie używam tagu „stroke”, ponieważ wydaje się, że zawsze nakłada się na faktycznie narysowany kształt.
źródło
ImageView
w pliku xmlzapisz poniższy kod z nazwą
border_image.xml
i powinien on znajdować się w folderze do rysowaniajeśli chcesz nadać zaokrąglony róg granicy obrazu, możesz zmienić linię w pliku border.xml
źródło
Utwórz granicę
Utwórz plik xml (np. „Frame_image_view.xml”) z następującą zawartością w folderze do rysowania:
Zastąp
@dimen/borderThickness
i@color/borderColor
cokolwiek chcesz lub dodaj odpowiedni dimen / kolor.Dodaj Drawable jako tło do ImageView:
Musisz użyć
android:cropToPadding="true"
, w przeciwnym razie zdefiniowane wypełnienie nie przyniesie żadnego efektu. Alternatywnie użyjandroid:padding="@dimen/borderThickness"
w ImageView, aby osiągnąć to samo. Jeśli ramka obramia element nadrzędny zamiast ImageView, spróbuj użyćandroid:adjustViewBounds="true"
.Zmień kolor obramowania
Najłatwiejszym sposobem zmiany koloru obramowania w kodzie jest użycie atrybutu tintBackgound.
lub
Nie zapomnij zdefiniować swojego
newColor
.źródło
Dodaj tło do rysowania, takie jak res / drawables / background.xml:
Zaktualizuj tło ImageView w res / layout / foo.xml:
Wyklucz dopełnienie ImageView, jeśli chcesz, aby src rysował nad tłem.
źródło
Zostało to wykorzystane powyżej, ale nie wspomniano wyłącznie.
Jeśli to prawda , obraz zostanie przycięty w celu dopasowania do wypełnienia.
Spowoduje to, że
ImageView
źródło zmieści się w dopełnieniu dodanym do tła.Za pomocą XML można to zrobić, jak poniżej-
źródło
musisz utworzyć background.xml w res / drawable tym kodzie
źródło
Dla tych, którzy szukają niestandardowej ramki i kształtu ImageView. Możesz użyć podglądu obrazu w kształcie androida
Po prostu dodaj
compile 'com.github.siyamed:android-shape-imageview:0.9.+@aar'
do swojegobuild.gradle
.I użyj w swoim układzie.
źródło
Prawie się poddałem.
Jest to mój warunek użycia przesuwania w celu załadowania obrazu, zobacz szczegółowy problem przesuwania tutaj o przekształceniach zaokrąglonego rogu i tutaj
Mam te same atrybuty dla siebie
ImageView
, bo każdy odpowiada tutaj 1 , tutaj 2 i tutaj 3Ale wciąż nie ma sukcesu.
Po dłuższym badaniu, użycie
foreground
atrybutów z tej SO odpowiedzi tutaj daje wynikandroid:foreground="@drawable/all_round_border_white"
niestety daje mi to „nie miły” narożnik jak na poniższym obrazku:
źródło
O wiele łatwiej mi to zrobić:
1) Edytuj ramkę, aby mieć zawartość w środku (za pomocą narzędzia 9patch).
2) Umieść
ImageView
wnętrze aLinearlayout
i ustaw żądane tło lub kolor ramki jako tłoLinearlayout
. Gdy ustawisz ramkę tak, aby zawartość była w sobie,ImageView
będziesz w jej wnętrzu (dokładnie tam, gdzie ustawiasz zawartość za pomocą narzędzia 9patch).źródło
Poniżej znajduje się moje najprostsze rozwiązanie tego długiego problemu.
W poniższej odpowiedzi wyjaśniłem to wystarczająco dobrze, spójrz na to też!
Mam nadzieję, że będzie to pomocne komuś innemu!
źródło
W tym samym pliku XML, którego użyłem dalej:
źródło
Najpierw dodaj żądany kolor tła jako kolor obramowania
zmień cropToPadding na true, a następnie dodaj dopełnienie.
Następnie będziesz mieć obramowanie dla swojego imageView.
źródło