Можно ли повернуть рисование в описании XML? - PullRequest
92 голосов
/ 03 января 2012

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

и я хочу повторно использовать чертеж, потому что он будет таким же, но повернутым на 90º и 45º, и я назначаю кнопку как чертеж.

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

120 голосов
/ 03 января 2012

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

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

Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation);
rotation.setRepeatCount(Animation.INFINITE);
myView.startAnimation(rotation);
27 голосов
/ 28 сентября 2015

Я мог повернуть стрелку влево вправо в 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

11 голосов
/ 31 августа 2018

Если используются векторные графические объекты в сочетании со списком 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)

1036-футовые * 1036-футовые
<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>
* 1036xml (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>
...