Mam VectorDrawable składa się z 9 prostokątów. Jest to zdefiniowane jako XML w folderze drawables. Mam ten zestaw jako tło dla ImageView, które zadeklarowałem w xml. android:src="@drawable/squares00"
Chciałbym zmienić kolor jednego lub więcej kwadratów programowo w czasie wykonywania. Wiem, że jest sposób, aby to zrobić za pomocą animacji VectorDrawable. Ale zastanawiałem się, czy istnieje prostszy sposób dostępu do mojego vectorDrawable w java, aktualizując jego właściwości (ustawiając jeden lub więcej kolorów wypełnienia dla prostokątów), a następnie aktualizując obraz tła za pomocą zaktualizowanej VectoDrawable. Moim celem jest Android API 21 (lizak)Programowo aktualizować Android wektor Drawable
Odpowiedz
W skrócie:
- Robisz nie mają bezpośredni dostęp do wewnętrznych elementów VectorDrawable.
- AnimatedVectorDrawable ma tylko dostęp do elementów wewnętrznych.
- Skorzystaj z AnimatedVectorDrawable, aby zasymulować to, czego potrzebujesz.
Long:
1. Nie masz dostępu
Patrząc na source code dla VectorDrawable pokaże, że wewnętrzna informacja elementy są przechowywane w wewnętrznej prywatny klasy państwowej VectorDrawableState
. Jedyną metodą na odsłonięcie elementu wewnętrznego jest name , ale niestety jest to pakiet prywatny (domyślnie) - nie możesz go użyć (chyba że używasz refleksji).
2. AnimatedVectorDrawable ma dostęp
getTargetByName
tylko jest tylko używany przez AnimatedVectorDrawable, jak możemy znaleźć przez searching for usages metody.
3. Zastosowanie AnimatedVectorDrawable
Więc teraz, że widzimy, że jest to jedyna dostępna opcja, na przykład, możemy spróbować wykonać następujące czynności, aby zmienić kolor elementu „rect2” od bieli do czerni:
change_color.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="0"
android:propertyName="fillColor"
android:valueFrom="@color/white"
android:valueTo="@color/black"/>
</set>
animation.xml:
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/vectordrawable" >
<target
android:name="rect2"
android:animation="@anim/change_color" />
</animated-vector>
i użyj podejścia opisanego pod numerem here.
Uwaga
Jeśli powyższe nadal nie jest to opcja dla Ciebie, możesz spróbować wykonać następujące czynności:
- skopiować cały VectorDrawable i dostosować go (nie testowane)
- użyć refleksji dla
getTargetByName
, aby uzyskać wewnętrzny element. Najpierw musisz się upewnić, że obiekt jestmutate
.
Widzę prywatną metodę pakowania, o której wspomniałeś w VectorDrawable: 'Obiekt getTargetByName (nazwa ciągu) { return mVectorState.mVPathRenderer.mVGTargetsMap.get (name); } ' Wygląda na to, że mówisz, że jeśli użyję tej metody, to teoretycznie mogę wykonać animację obiektu na tym obiekcie (" cel "), aby zmienić kolor? Co masz na myśli mówiąc, że najpierw muszę "zmutować" obiekt? –
Jeśli użyjesz odbicia dla getTargetByName, będziesz mógł uzyskać element zdefiniowany w XML według nazwy. Jednym z przykładów będzie typ VFullPath - który jest również klasą prywatną. Będziesz musiał manipulować nim, używając ponownie odbicia w polu mFillColor (aby zmienić kolor). Odnośnie mutata, musisz wywołać mutate() na samej szufladzie - która utworzy lokalną kopię stanu wewnętrznego. Zanim to zrobisz, wszystkie te same zestawy danych będą miały te same dane, aby poprawić wydajność. –
Dzięki @Eyal. To ma sens. Nie możemy się doczekać kiedy udostępnią do tego publiczny interfejs API. Mogę na razie spróbować tego hackowania, ale używam teraz podglądu z RapahelJS jako obejścia. Czy pomieszałeś z biblioteką wsparcia, którą opracowują dla VectorDrawable, aby sprawdzić, czy to też będzie działać? https://android.googlesource.com/platform/frameworks/support/+/master/v7/vectordrawable/ –
- 1. Android programowo rozmycie imageview drawable
- 2. "@android: drawable/ic_" vs "@ * android: drawable/ic_"
- 3. Android, jak zmienić rozmiar (skalę) wektor ikona xml programowo
- 4. Android: Circular Drawable
- 5. android Drawable - getConstantState.newDrawable() vs mutate()
- 6. Android: Gdzie znaleźć RadioButton Drawable?
- 7. android 9 patch drawable xml
- 8. Jeszcze inny: Lista Android Holo Drawable Icons?
- 9. Android AppCompat 23.1.0 Tint Compound Drawable
- 10. Android - otwarty zasób z @drawable String
- 11. Serializing a Drawable object on Android
- 12. Jak utworzyć Drawable from byte []? (Android)
- 13. Jak programowo ustawić właściwość ImageButton aplikacji: srcCompat = "@ drawable/pic"?
- 14. SVG Konwersja wektor do Android kanału alfa wielu natężeniach png
- 15. Zmiana ImageView programowo Android
- 16. Android: Jak programowo ustawić drawablePadding?
- 17. Plik res/drawable/abc_ic_ab_back_material.xml z drawable resource ID # 0x7f020016
- 18. Android studio nie może aktualizować z ostrzeżeniem
- 19. Button.setBackground (Drawable background) throws NoSuchMethodError
- 20. jak wymienić/zmienić przycisk obrazu programowo Android
- 21. Android Programowo ustawiający tekst przycisku
- 22. Jak programowo aktualizować parametry zapytania w routerze reagowania?
- 23. Nie można programowo aktualizować funkcji InfluenceScore w profilach społecznościowych.
- 24. ustawienie android: textColor za pomocą rysowania programowo?
- 25. Widok systemu Android layout_width - jak zmienić programowo?
- 26. o android Drawable getBounds return Rect (0, 0 - 0, 0)
- 27. Jak przekonwertować LayerDrawable na Drawable w systemie Android?
- 28. android- Jak ustawić 2 xml drawable dla LinearLayout
- 29. Android FileNotFoundException res/drawable-hdpi/scrollbar_handle_vertical.9.png
- 30. Statelist drawable android: state_enabled nie działa w xml
czy masz ans? – Shreeshesh
Musisz użyć wielu rysunków lub mieć możliwość animowania pojedynczego losowania. Dlaczego nie chcesz korzystać z AnimatedVectorDrawable? –
opublikuj niestandardowe wyciągnięcia. to nam pomoże. –