Чи можна обертати рисунок у описі 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 або, на вашу думку, це буде найкращим способом це зробити? Покладіть усі ресурси, окрім обертових, поверніть їх у код?

--- EDIT --- Відповідь @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
Не потрібно вибачатися за свою англійську, це просто чудово. І ласкаво просимо до SO!
PeeHaa

зверніть увагу на ту саму проблему в цій темі stackoverflow.com/questions/14727426/… будь-яка пропозиція була б чудовою!
sukarno

Набір векторних малюнків значно спрощує питання (відповідь нижче).
Саміс

Відповіді:


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

1
Дякую, що ідеально! Я поєднав це з предметом і його саме тим, що мені потрібно, я хочу опублікувати код, я не знаю, чи краще відредагувати вашу відповідь чи моє запитання ... А для дзеркального відображення зображення мені потрібно грати зі стрижком x & y?
Goofyahead

Ну, я щаслива, що можу допомогти, відредагуйте відповідь, якщо хочете. pivotX і pivotY визначає центральну точку обертання. Для дзеркального відображення я не маю уявлення, оскільки цей XML може визначати лише 2D обертання.
dmaxi

1
@dmaxi Це обертання чертежного за допомогою анімації обертання, чи не так? Це не було б дещо неефективно?
starkej2

Я зробив це, але від 0 до 360 градусів, тому що я хочу повного обертання, проблема в маленьких екранах вона обертається деформованою, будь-яка підказка?
вогнепалка

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>

Додане зображення для довідки.

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


Я роблю це, але я не можу встановити тло, щоб розмістити будь-яку ідею?
Mateen Chaudhry

18

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

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

Примітка: 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>

detalji_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атрибут, він дуже добре обертає вектор
блювер

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"/>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.