Is it possible to rotate a drawable in the xml description?

我正在创建一个应用程序,资源可以重用(因为按钮总是相同的,但镜像或旋转)。我确实想使用相同的资源,所以我不必再添加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,但正如我已经解释了我不喜欢这种方法。

Is it possible to achieve that directly on the XML or what do you think that will be the best way to do it? Put all resources but rotated, rotate them in the code?

- 编辑 @ 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>
100985 次浏览

我可以用 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);

我可以在 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 value 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 _ row _ 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 _ row _ 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>

如果想在 xml文件中绘制 rotation,那么只需在 ImageView中添加 android:rotation="180"即可

<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_dropdown"
android:rotation="180"/>

程序化的

val image = findViewById(R.id.imageview)
image.rotation = 180f