Можно ли повернуть 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 75

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>

The fromDegrees важно.

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

Я не думаю, что он выделяет ресурсы для анимации, поскольку он не должен быть загружен как анимация. В качестве выигрышного он визуализируется как его начальное состояние и должен быть помещен в 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>