是否可以在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'1

在此线程stackoverflow.com/questions/14727426/上查找相同的问题……任何建议都将是很棒的!
sukarno

基于矢量的可绘制对象大大简化了事情(下面的答案)。
samis

Answers:


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 2012年

好吧,很高兴能为您提供帮助,如果您愿意,可以编辑答案。枢轴X和枢轴Y定义旋转的中心点。对于镜像,我不知道,因为此XML只能定义2D旋转。
dmaxi 2012年

1
@dmaxi这是通过旋转动画旋转可绘制对象,不是吗?那会不会效率低下?
starkej2 2014年

我做了这个,但是从0到360度,因为我想要完整旋转,问题出在小屏幕上,它旋转变形了,有什么线索吗?
firetrap

1
Android M中存在一个影响此精确旋转可绘制对象的错误,它会完全消失,因此,如果您选择此解决方案,则它将在M中被破坏。固定为
N。– androidguy

34

我可以将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

如果将基于矢量的可绘制对象与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"/>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.