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"
Zayid Mohammed
źródło

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.

IntelliJ Amiya
źródło
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.

bitvale
źródło
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.

Chandrahasan
źródło
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.

Mir-Ismaili
źródło
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ę.

Gabe Sechan
źródło
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.

Najeeb Idrees
źródło
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ę .

Muhammad Younas
źródło
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

SaravInfern
źródło