Estou criando um aplicativo, com recursos que podem ser reaproveitados (porque os botões são sempre os mesmos, mas espelhados ou girados). Eu quero usar o mesmo recurso, então não preciso adicionar mais 3 recursos que são exatamente como o original, mas rotacionados. Mas também não quero misturar o código com coisas que podem ser declaradas no XML ou fazer transformações com uma matriz que custará tempo de processamento.
Eu tenho um botão de dois estados declarado em um 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>
e quero reutilizar o drawable porque será o mesmo, mas girado 90º e 45º e atribuo ao botão como um drawable.
<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" />
Eu sei que posso girar com um RotateDrawable
ou com umMatrix
mas como já expliquei, não gosto dessa abordagem.
É possível fazer isso diretamente no XML ou qual você acha que será a melhor maneira de fazer isso? Colocar todos os recursos menos girados, girá-los no código?
--- EDITAR --- A resposta de @dmaxi funciona muito bem, veja como combiná-la com uma lista de itens :)
<?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>
fonte
Respostas:
Eu poderia girar em XML:
O
fromDegrees
é importante.Basicamente, esta é uma animação de rotação definida em XML. Com
fromDegrees
você define o estado inicial de rotação. otoDegrees
é o estado girado final do drawable na sequência de animação, mas pode ser qualquer coisa se você não quiser usar animação.Não acho que aloca recursos para animação, pois não precisa ser carregado como animação. Como drawable, ele é renderizado em seu estado inicial e deve ser colocado na
drawable
pasta de recursos. Para usá-lo como uma animação, você deve colocá-lo naanim
pasta de recursos e pode iniciar a animação assim (apenas um exemplo):fonte
Eu poderia girar a seta esquerda para a direita em XML como:
Imagem anexada para referência.
fonte
Se drawables baseados em vetor forem usados, em conjunto com uma ImageView , uma lista de estilos e estados de cores, seu botão pode ser refatorado da seguinte maneira:
Observação: drawables vetoriais são significativamente menores do que imagens, portanto, definições extras e explícitas não geram muita sobrecarga e tornam o código claro e explícito (embora eu tenha lido que a modificação manual de ativos vetoriais deve ser evitada, prefiro lidar com a sobrecarga de atualizar alguns arquivos do que ter transformações em um):
Observação: o Android Studio é uma ótima fonte de ativos vetoriais.
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 (ic_play_arrow_black_24dp.xml modificado)
fonte
rotationGroup
atributo, ele gira o vetor muito bemSe você quiser
rotation
Drawable emxml
arquivo, em seguida, simples addandroid:rotation="180"
noImageView
fonte