Можно ли повернуть 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>
The
fromDegrees
важно.в основном это анимация поворота, определенная в XML. С
fromDegrees
вы определяете начальное повернутое состояние. ЭлементtoDegrees
окончательное повернут государственного выигрышного в анимационной последовательности, но может быть все что угодно, если вы не хотите использовать анимации.Я не думаю, что он выделяет ресурсы для анимации, поскольку он не должен быть загружен как анимация. В качестве выигрышного он визуализируется как его начальное состояние и должен быть помещен в
drawable
папку ресурсов. Чтобы использовать его в качестве анимации вы должны поместить его вanim
папка ресурсов и может запустить анимацию следующим образом (только пример):Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation); rotation.setRepeatCount(Animation.INFINITE); myView.startAnimation(rotation);
если используются векторные чертежи, в сочетании с 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>