1. ホーム
  2. android

[解決済み] xmlの記述でdrawableを回転させることは可能ですか?

2022-10-13 06:40:37

質問

私は、再利用可能なリソース (ボタンは常に同じですが、ミラーリングまたは回転されているため) を使用して、アプリを作成しています。私は同じリソースを使用したいので、元のものとまったく同じであるが回転した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°に回転させた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>

どのように解決するのですか?

私は を回転させる を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 の最終的な回転状態ですが、アニメーションを使用しない場合は何でもかまいません。

アニメーションとして読み込む必要がないので、アニメーションのためのリソースを割り当てるとは思えません。drawableとしては、初期状態としてレンダリングされるので drawable リソースフォルダに配置する必要があります。 アニメーションとして使用するには、これを anim リソースフォルダに置き、このようにアニメーションを開始することができます(あくまで例です)。

Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation);
rotation.setRepeatCount(Animation.INFINITE);
myView.startAnimation(rotation);