Ist es möglich, ein Drawable in der XML-Beschreibung zu drehen?

102

Ich erstelle eine App mit Ressourcen, die wiederverwendet werden können (da Schaltflächen immer gleich sind, aber gespiegelt oder gedreht werden). Ich möchte dieselbe Ressource verwenden, damit ich nicht drei weitere Ressourcen hinzufügen muss, die genau dem Original entsprechen, aber gedreht sind. Ich möchte den Code aber auch nicht mit Dingen mischen, die im XML deklariert werden können, oder Transformationen mit einer Matrix durchführen, die Verarbeitungszeit kostet.

Ich habe eine Schaltfläche mit zwei Status in einem XML deklariert.

<?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>

und ich möchte das Zeichenelement wiederverwenden, da es das gleiche ist, aber um 90 ° und 45 ° gedreht wird, und ich ordne den Knopf als Zeichenelement zu.

<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" />

Ich weiß, dass ich es mit einem RotateDrawableoder mit einem drehen kann, Matrixaber wie ich bereits erklärt habe, mag ich diesen Ansatz nicht.

Ist es möglich, dies direkt im XML zu erreichen, oder was ist Ihrer Meinung nach der beste Weg, dies zu tun? Alle Ressourcen außer gedreht setzen, im Code drehen?

--- BEARBEITEN --- Die Antwort von @dmaxi funktioniert hervorragend, so kombiniert man sie mit einer Artikelliste :)

<?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>
Goofyahead
quelle
4
Sie müssen sich nicht für Ihr Englisch entschuldigen, das ist in Ordnung. Und willkommen bei SO!
PeeHaa
Schauen Sie sich das gleiche Problem in diesem Thread an. stackoverflow.com/questions/14727426/… Jeder Vorschlag wäre großartig!
Sukarno
Vektorbasierte Drawables vereinfachen die Sache erheblich (Antwort unten).
Samis

Antworten:

136

Ich könnte in XML drehen :

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android" 
        android:fromDegrees="90"
        android:toDegrees="90"
        android:pivotX="50%"
        android:pivotY="50%"
        android:drawable="@drawable/mainmenu_background">
</rotate>

Das fromDegreesist wichtig.

Grundsätzlich ist dies eine in XML definierte Rotationsanimation. Mit fromDegreesdefinieren Sie den anfänglichen gedrehten Zustand. Das toDegreesist der letzte gedrehten Zustand des ziehbar in der Animationssequenz , sondern kann alles sein , wenn Sie Animation nicht verwenden möchten.

Ich denke nicht, dass es Ressourcen für Animationen zuweist, da es nicht als Animation geladen werden muss. Als Zeichen wird es als Ausgangszustand gerendert und sollte im drawableRessourcenordner abgelegt werden . Um es als Animation zu verwenden, sollten Sie es in einen animRessourcenordner legen und können die Animation wie folgt starten (nur ein Beispiel):

Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation);
rotation.setRepeatCount(Animation.INFINITE);
myView.startAnimation(rotation);
dmaxi
quelle
1
Danke das ist perfekt! Ich habe das mit dem Artikel kombiniert und es ist genau das, was ich brauche. Ich möchte den Code veröffentlichen. Ich weiß nicht, ob es besser ist, Ihre Antwort oder meine Frage zu bearbeiten. Und um das Bild zu spiegeln, muss ich mit Pivot spielen x & y?
Goofyahead
Nun, ich bin froh, dass ich helfen konnte, die Antwort zu bearbeiten, wenn Sie es wünschen. PivotX und PivotY definieren den Mittelpunkt der Drehung. Für die Spiegelung habe ich keine Ahnung, da dieses XML nur die 2D-Rotation definieren kann.
Dmaxi
1
@dmaxi Dies dreht das Drawable über eine Rotationsanimation, nicht wahr? Wäre das nicht etwas ineffizient?
starkej2
Ich habe dies aber von 0 bis 360 Grad gemacht, weil ich eine volle Drehung will. Das Problem ist, dass es sich bei kleinen Bildschirmen deformiert dreht. Gibt es einen Hinweis?
Feuerfalle
1
Es gab einen Fehler in Android M, der sich auf dieses exakte Dreh-Drawable auswirkte. Es verschwindet vollständig. Wenn Sie diese Lösung wählen, wird es in M ​​gebrochen. Wurde für N.
behoben
34

Ich könnte den Pfeil nach links in XML wie folgt drehen:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="180"
    android:toDegrees="0"
    android:drawable="@drawable/left">
</rotate>

Beigefügtes Bild als Referenz.

Geben Sie hier die Bildbeschreibung ein

amko0l
quelle
Ich mache das, aber ich kann den Hintergrund nicht so einstellen, dass er eine Idee hat.
Mateen Chaudhry
18

Wenn vektorbasierte Zeichen in Verbindung mit einer ImageView- , Stil- und Farbstatusliste verwendet werden, kann Ihre Schaltfläche wie folgt umgestaltet werden:

Hinweis: Vektorzeichnungen sind erheblich kleiner als Bilder, daher verursachen zusätzliche explizite Definitionen keinen großen Aufwand und sorgen für klaren, expliziten Code (obwohl ich gelesen habe, dass manuelle Änderungen an Vektor-Assets vermieden werden sollten, würde ich mich lieber damit befassen der Aufwand für die Aktualisierung einiger Dateien als für Transformationen in einer):

Hinweis: Android Studio ist eine großartige Quelle für Vektor-Assets.

res \ values ​​\ styles.xml

<!--ImageView-->
<style name="Details_Buttons_Top_Left_Button">
  <item name="android:layout_width">match_parent</item>
  <item name="android:layout_height">match_parent</item>    
  <item name="android:tint">@color/button_csl</item>    
</style>

res \ color \ button_csl.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">  
  <item android:state_enabled="false" android:color="@color/grey_disabled"/>
  <item android:state_pressed="true" android:color="@color/orange_hilite"/>
  <item android:color="@color/black"/>  
</selector>

details_menu_large_button.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>

Details_Buttons_Top_Left_Button

<ImageView android:id="@+id/Details_Buttons_Top_Left_Button"
           style="@style/Details_Buttons_Top_Left_Button"
           android:src="@drawable/details_menu_large_button" />

and_card_details_button_down_left.xml (ic_play_arrow_black_24dp.xml)

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">  
  <path
        android:fillColor="#FF000000"
        android:pathData="M8,5v14l11,-7z"/>

</vector>

and_card_details_button_down_left_onclick.xml (ic_play_arrow_black_24dp.xml geändert)

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
  <group android:name="rotationGroup"
         android:pivotX="12"
         android:pivotY="12"
         android:rotation="90" >
    <path
          android:fillColor="#FF000000"
          android:pathData="M8,5v14l11,-7z"/>
  </group>
</vector>
Sam ist
quelle
3
rotationGroup
Gute
0

Wenn Sie möchten , rotationin drawable xmlDatei dann einfach add android:rotation="180"inImageView

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_dropdown"
    android:rotation="180"/>
Dinesh
quelle