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

102

Я создаю приложение с ресурсами, которые можно использовать повторно (потому что кнопки всегда одинаковы, но зеркально отражены или повернуты). Я хочу использовать тот же ресурс, поэтому мне не нужно добавлять еще 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>
Тупица
источник
4
Не нужно извиняться, твой английский - это нормально. И добро пожаловать в ТАК!
PeeHaa 03
рассмотрите ту же проблему в этом потоке stackoverflow.com/questions/14727426/… любое предложение было бы отличным!
sukarno 07
Использование векторных чертежей значительно упрощает работу (ответ ниже).
samis

Ответы:

136

Я мог вращать в 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);
dmaxi
источник
1
Спасибо, отлично! Я объединил это с элементом, и это именно то, что мне нужно, я хочу опубликовать код, я не знаю, лучше ли отредактировать ваш ответ или мой вопрос ... А для зеркального отображения изображения мне нужно играть с поворотом х и у?
Goofyahead
Что ж, я рад, что смог помочь, отредактируйте ответ, если хотите. pivotX и pivotY определяют центральную точку вращения. Для зеркального отображения я понятия не имею, потому что этот XML может определять только двумерное вращение.
dmaxi 04
1
@dmaxi Это вращение чертежа с помощью анимации вращения, не так ли? Разве это не было бы несколько неэффективно?
starkej2
Я сделал это, но от 0 до 360 градусов, потому что я хочу полное вращение, проблема в маленьких экранах, которые деформируются, есть подсказка?
firetrap
1
В Android M была ошибка, влияющая на этот точный поворотный чертеж, он полностью исчезает, поэтому, если вы выберете это решение, оно будет сломано в M. Было исправлено для N.
androidguy
35

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

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

введите описание изображения здесь

amko0l
источник
Я делаю это, но не могу установить фон для макета?
Mateen Chaudhry
18

Если используются векторные чертежи, в сочетании с 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>
саамы
источник
3
Хороший ответ для rotationGroupатрибута, он очень хорошо вращает вектор
blueware
0

Если вы хотите rotationвытяжку в xmlфайл , то просто оном android:rotation="180"вImageView

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_dropdown"
    android:rotation="180"/>
Динеш
источник