Можно ли повернуть drawable в описании xml?

Я создаю приложение с ресурсами, которые можно использовать повторно (потому что кнопки всегда одинаковы, но зеркально или повернуты). Я хочу использовать тот же ресурс, поэтому мне не нужно добавлять еще 3 ресурса, которые точно такие же, как оригинал, но повернуты. Но я также не хочу смешивать код с вещами, которые могут быть объявлены в XML или сделать преобразования с матрицей, которая будет стоить времени обработки.

у меня есть кнопка с двумя состояниями, объявленная в 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>

и я хочу повторно использовать drawable, потому что он будет таким же, но повернут на 90º и 45º, и я назначаю кнопку как 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" />

Я знаю, что я могу повернуть его с RotateDrawable или Matrix но, как я уже объяснил, мне не нравится такой подход.

можно ли достичь этого непосредственно на XML или что вы думаете, что это будет лучший способ сделать это? Поместите все ресурсы, но повернутые, повернуть их в коде?

--- редактировать --- Ответ @dmaxi отлично работает, это как объединить его со списком элементов:)

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

3 ответов


Я могу поворот в 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>

на fromDegrees важно.

в основном это анимация поворота, определенная в XML. С fromDegrees вы определяете начальное состояние поворота. The toDegrees является конечным повернутым состоянием drawable в последовательности анимации, но может быть что угодно, если вы не хотите использовать анимацию.

Я не думаю, что он выделяет ресурсы для анимации, поскольку его не нужно загружать как анимацию. В качестве выигрышного он отображается как начальное состояние и должен быть помещен в drawable папку ресурсов. Чтобы использовать его в качестве анимации вы должны поместить его в anim папка ресурсов и может запустить анимацию следующим образом (просто пример):

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

Я мог бы повернуть стрелку влево вправо в XML как:

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

прикрепленное изображение для справки.

enter image description here


если используются векторные чертежи, в сочетании с ImageView, стиль и список состояния цвета, ваша кнопка может быть изменена следующим образом:

Примечание: векторные чертежи значительно меньше, чем изображения, поэтому дополнительные, явные определения не несут больших накладных расходов и делают четкий, явный код (хотя я читал, что ручное изменение векторных активов следует избегать, я бы предпочел иметь дело с накладными расходами на обновление нескольких файлов, чем имея преобразования на одном):

Примечание: Android Studio является отличным источником для векторных активов.

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 изменен)

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