Tworzę aplikację z zasobami, które można ponownie wykorzystać (ponieważ przyciski są zawsze takie same, ale lustrzane lub obrócone). Chcę użyć tego samego zasobu, więc nie muszę dodawać 3 dodatkowych zasobów, które są dokładnie takie same, jak oryginalne, ale są obracane. Ale nie chcę też mieszać kodu z rzeczami, które można zadeklarować w XML lub dokonywać transformacji za pomocą macierzy, która będzie kosztować czas przetwarzania.
Mam przycisk z dwoma stanami zadeklarowany w XML.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/and_card_details_button_down_left_onclick" /> <!-- pressed -->
<item android:drawable="@drawable/and_card_details_button_down_left" /> <!-- default -->
</selector>
i chcę ponownie wykorzystać element do rysowania, ponieważ będzie taki sam, ale obrócony o 90º i 45º i przypisuję przycisk jako element do rysowania.
<Button android:id="@+id/Details_Buttons_Top_Left_Button"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/details_menu_large_button" />
Wiem, że mogę to obrócić za pomocą a RotateDrawable
lub a, Matrix
ale jak już wyjaśniłem, nie podoba mi się to podejście.
Czy można to osiągnąć bezpośrednio w XML lub jak myślisz, jaki będzie najlepszy sposób na zrobienie tego? Umieścić wszystkie zasoby oprócz rotacji, obrócić je w kodzie?
--- EDYTUJ --- Odpowiedź @dmaxi działa świetnie, tak można ją połączyć z listą pozycji :)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<rotate
android:fromDegrees="90"
android:toDegrees="90"
android:pivotX="50%"
android:pivotY="50%"
android:drawable="@drawable/and_card_details_button_up_onclick"/>
</item>
<item>
<rotate
android:fromDegrees="90"
android:toDegrees="90"
android:pivotX="50%"
android:pivotY="50%"
android:drawable="@drawable/and_card_details_button_up_onclick"/>
</item>
</selector>
źródło
Odpowiedzi:
Mógłbym obracać w XML:
To
fromDegrees
jest ważne.Zasadniczo jest to animacja obracania zdefiniowana w XML. Wraz z
fromDegrees
określeniem początkowego stanu obróconego. JesttoDegrees
to ostatni obrócony stan elementu do rysowania w sekwencji animacji, ale może to być wszystko, jeśli nie chcesz używać animacji.Nie sądzę, aby przydzielał zasoby do animacji, ponieważ nie musi być ładowany jako animacja. Jako plik do rysowania jest renderowany w stanie początkowym i powinien zostać umieszczony w
drawable
folderze zasobów. Aby użyć go jako animacji, należy umieścić go wanim
folderze zasobów i rozpocząć animację w ten sposób (tylko przykład):źródło
Mogę obrócić strzałkę w lewo w prawo w XML jako:
Załączony obraz w celach informacyjnych.
źródło
Jeśli używane są rysunki oparte na wektorach, w połączeniu z ImageView , listą stylów i stanów kolorów, przycisk można refaktoryzować w następujący sposób:
Uwaga: rysunki wektorowe są znacznie mniejsze niż obrazy, więc dodatkowe, wyraźne definicje nie powodują dużego narzutu i stanowią jasny, wyraźny kod (chociaż czytałem, że należy unikać ręcznego modyfikowania zasobów wektorowych, wolałbym zajmować się obciążenie związane z aktualizacją kilku plików niż posiadanie transformacji w jednym):
Uwaga: Android Studio to świetne źródło zasobów wektorowych.
res \ values \ styles.xml
res \ color \ button_csl.xml
details_menu_large_button.xml
Details_Buttons_Top_Left_Button
and_card_details_button_down_left.xml (ic_play_arrow_black_24dp.xml)
and_card_details_button_down_left_onclick.xml (zmodyfikowano ic_play_arrow_black_24dp.xml)
źródło
rotationGroup
Jeśli chcesz
rotation
rozciągliwej wxml
pliku wtedy prosty dodatekandroid:rotation="180"
wImageView
źródło