XML記述でドローアブルを回転させることは可能ですか?


102

再利用可能なリソースを使用してアプリを作成しています(ボタンは常に同じですが、ミラーリングまたは回転されるため)。同じリソースを使用したいので、元のリソースとまったく同じでローテーションされているリソースを3つ追加する必要はありません。しかし、コードをXMLで宣言できるものと混合したり、処理時間のかかるマトリックスを使って変換したりしたくありません。

XMLで宣言された2つの状態ボタンがあります。

<?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" />

a RotateDrawableまたはaで回転できることは知っています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
英語を謝る必要はありません。そして、SOへようこそ!
PeeHaa

このスレッドで同じ問題を調べてください。stackoverflow.com/ questions / 14727426 / …どんな提案も素晴らしいでしょう!
スカルノ2013

ベクターベースのドローアブルは、問題を大幅に簡素化します(以下の回答)。
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);

1
ありがとうございます。私はそれをアイテムと正確に私が必要とするものと組み合わせました、私はコードを投稿したいのですが、あなたの答えや私の質問を編集する方が良いかわかりません...そして、画像をミラーリングするためにピボットで遊ぶ必要がありますかx&y?
Goofyahead 2012年

ええと、私が助けてくれてうれしいです、あなたが望むなら答えを編集してください。ピボットXおよびピボットYは、回転の中心点を定義します。このXMLは2Dの回転のみを定義できるため、ミラーリングについてはわかりません。
dmaxi

1
@dmaxiこれは、回転アニメーションを介してドローアブルを回転させていますね。それはやや非効率的ではないでしょうか?
starkej2 14年

私はこれを作りましたが、完全な回転が必要なため0から360度までですが、問題は小さな画面で変形して回転することです。
火縄銃

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、2019

18

ベクターベースのドローアブルがImageView、スタイル、およびカラー状態リストとともに使用される場合、ボタンは次のようにリファクタリングできます。

注:ベクター型ドローアブルは画像よりも大幅に小さいため、追加の明示的な定義によってオーバーヘッドが発生することはなく、明確で明示的なコードが作成されます(ただし、ベクターアセットを手動で変更することは避けなければならないことを読みましたが、 1つの変換を行うよりもいくつかのファイルを更新する場合のオーバーヘッド:)

注: 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 modified)

<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"/>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.