Różnica między app: srcCompat i android: src w układzie XML Androida


142

Za każdym razem, gdy tworzę ImageView z ikoną dodaną przy użyciu zasobów Vector w Android Studio, pojawia się błąd w linii app:srcCompat="@drawable/ic_play"

Kiedy zmieniam app:srcCompatz android:src, błąd zniknął, ale ikona wygląda na pikselową.

Jaka jest główna różnica między

app:srcCompat="@drawable/ic_play"

i

android:src="@drawable/ic_play"

Odpowiedzi:


145

aplikacja: srcCompat

to najbardziej niezawodna metoda integracji elementów rysunkowych wektorowych z aplikacją. Drawables wektorowe pozwalają zastąpić wiele zasobów PNG pojedynczą grafiką wektorową zdefiniowaną w XML. Chociaż wcześniej ograniczone do Lollipopa i nowszych urządzeń

Uwaga

Począwszy od biblioteki obsługi systemu Android 23.3.0 , elementy rysunkowe wektorów wsparcia można ładować tylko za pośrednictwem app:srcCompat.

musisz dodać vectorDrawables.useSupportLibrary = true do swojego build.gradlepliku

    // Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }  

android: src

Ustawia rysowalny jako zawartość tego ImageView, który będzie wyświetlany w oryginalnym rozmiarze. Brak automatycznego skalowania.


2
błąd z app: srcCompact zniknął po dodaniu vectorDrawables.useSupportLibrary = true w module aplikacji Gradle
— Zayid Mohammed

3
Czy app: srcCompat będzie kolidować ze starszymi wersjami Androida? Mówiąc dokładniej, Api 19 jest najstarszą wersją, o której mówię.
— Niejednoznaczny

Wow może wreszcie pozbyć się ikon bitmapowych.
— Meow Cat 2012,

Link do posta Google Plus jest już martwy
— Vadim Kotov

Dodałem powyżej build.gradle, ale nadal nie działa, jakieś pomysły?
— David Callanan

21

Jeśli używasz android:src="@drawable/some_vector"bez vectorDrawables.useSupportLibrary = truew pliku build.gradle, a Twoja aplikacja ma obrazy wektorowe (wektory wektorowe), to podczas budowania pliku apk wtyczka Android Gradle generuje wiele plików * .png dla różnych ekranów (hdpi, xhdpi ...) z każdy z twoich wektorów do rysowania (tylko dla API = <19). Wynik - większy rozmiar apk .

Podczas używania app:srcCompat="@drawable/some_vector"z vectorDrawables.useSupportLibrary = truesystemem Android używa plików wektorowych do rysowania bez generowania *.pngplików.

Możesz to sprawdzić za pomocą narzędzia do analizowania aplikacji Android Studio. Po prostu zbuduj apk zi bez vectorDrawables.useSupportLibrary = true.

Myślę, że to główna różnica.


Jeśli więc masz właściwość useSupportLibrary ustawioną na wartość true, dlaczego potrzebujesz specjalnej składni zamiast android: src =? Jeśli używasz android: src = z włączoną funkcją useSupportLibrary, czy unikniesz rozprzestrzeniania się plików PNG?
— Oscar

9

Posługiwać się:

app:srcCompat="@drawable/backImage"

Atrybut srcCompat jest faktycznie zdefiniowany w bibliotece AppCompat. Ważne: w tym celu musisz dodać odpowiednią przestrzeń nazw.

xmlns:app="http://schemas.android.com/apk/res-auto"

Uwaga

To, co otrzymujesz, wydaje się być zwykłym błędem, który można zignorować. Próbowałem i otrzymałem ten sam błąd, ale działa poprawnie.

Możesz użyć, tools:ignore="MissingPrefix"aby tymczasowo uniknąć wyświetlania tego błędu.

Mam nadzieję, że to pomoże.


6

Używając AppCompatwith ImageView(lub podklas, takich jak ImageButtoni FloatingActionButton), będziesz mógł używać nowego app:srcCompatatrybutu do odwoływania się do obiektów wektorowych w starszych wersjach platformy (a także do innych dostępnych do rysowania android:src) .

android.support.v7.appcompat.R.attr.srcCompat :

srcCompat

Ustawia do rysowania jako zawartość tego ImageView. Umożliwia korzystanie z grafiki wektorowej w przypadku uruchamiania na starszych wersjach platformy.

Może to być odniesienie do innego zasobu w postaci "@[+][package:]type/name"lub atrybutu motywu w formularzu "?[package:]type/name".


Nie zapomnij dodać, xmlns:app="http://schemas.android.com/apk/res-auto"kiedy używasz app:srcCompat.


4

Wektory i animowane wektory były obsługiwane tylko w najnowszych wersjach platformy. srcCompat może być używany z biblioteką zgodności, aby działały, ale działa to tylko z niektórymi widokami w bibliotece pomocniczej. Zauważ, że zamiast androida używa się app :. Oznacza to, że nie jest częścią struktury, ale parametr zdefiniowany przez aplikację.


3
app:srcCompat="some_resource" 

odnosi się do tego, że jest to AppCompatActivity src, który znajduje się w bibliotece wsparcia podczas

android:src="some_resource"

odnosi się do prostej czynności.


3

Używając AppCompatwith ImageView(lub podklas, takich jak ImageButtoni FloatingActionButton), będziesz mógł użyć nowego app:srcCompatatrybutu do odwoływania się do obiektów wektorowych do rysowania (a także do wszystkich innych dostępnych do rysowania android:src). A jeśli zmieniasz elementy rysunkowe w czasie wykonywania, będziesz mógł użyć tej samej setImageResource()metody co wcześniej (bez zmian).

Używanie AppCompati app:srcCompatjest najbardziej niezawodną metodą integracji rysunków wektorowych z aplikacją. Przekonasz się, że bezpośrednie odwoływanie się do rysunków wektorowych poza programem Lollipopapp:srcCompat nie powiedzie się .


1

Android 5.0 (poziom API 21) i nowszy zapewnia obsługę grafiki wektorowej, więc w celu obsługi rysunków wektorowych w starszych wersjach dodano aplikację: srcCompat

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.