it-swarm.com.de

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

Ich erstelle eine App mit Ressourcen, die wiederverwendet werden können (weil Schaltflächen immer gleich sind, aber gespiegelt oder gedreht werden). Ich möchte dieselbe Ressource verwenden, damit ich keine weiteren 3 Ressourcen hinzufügen muss, die genau wie das Original sind, aber gedreht wurden. Ich möchte den Code aber auch nicht mit Dingen mischen, die im XML deklariert werden können, oder Transformationen mit einer Matrix vornehmen, die Verarbeitungszeit kosten.

Ich habe eine Zwei-Status-Schaltfläche 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 den Drawable wiederverwenden, da er derselbe ist, aber um 90º und 45º gedreht wird, und ich ordne den Button als Drawable 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 RotateDrawable oder mit einem Matrix drehen kann, aber wie ich bereits erklärt habe, mag ich diesen Ansatz nicht .

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

--- BEARBEITEN --- Die Antwort von @dmaxi funktioniert sehr gut. So kombinieren Sie 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>
96
Goofyahead

Ich könnte drehen in XML:

<?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 fromDegrees ist wichtig.

Grundsätzlich ist dies eine in XML definierte Rotationsanimation. Mit fromDegrees definieren Sie den anfänglichen gedrehten Zustand. Das toDegrees ist der endgültige gedrehte Zustand des Zeichnens in der Animationssequenz, kann aber alles sein, wenn Sie keine Animation verwenden möchten.

Ich denke nicht, dass es Ressourcen für Animation zuweist, da es nicht als Animation geladen werden muss. Als Zeichenprogramm wird es im Ausgangszustand gerendert und sollte im Ressourcenordner drawable abgelegt werden. Um es als Animation zu verwenden, sollten Sie es in den Ressourcenordner anim legen und die Animation wie folgt starten (nur ein Beispiel):

Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation);
rotation.setRepeatCount(Animation.INFINITE);
myView.startAnimation(rotation);
125
dmaxi

Ich könnte den linken Pfeil in XML nach rechts drehen als:

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

enter image description here

27
amko0l

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

Hinweis: Vektorzeichen sind bedeutend kleiner als Bilder, sodass zusätzliche, explizite Definitionen nicht viel Aufwand verursachen und einen klaren, expliziten Code ergeben (obwohl ich gelesen habe, dass das Ändern von Vektorelementen von Hand vermieden werden sollte Ich würde mich lieber mit dem Overhead beschäftigen, ein paar Dateien zu aktualisieren, als Transformationen auf einer zu haben:

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>
13
samis