再利用可能なリソースを使用してアプリを作成しています(ボタンは常に同じですが、ミラーリングまたは回転されているため)。同じリソースを使用したいので、元のリソースとまったく同じですがローテーションされたリソースをさらに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" />
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>
rotate 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);
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が変更されました)
<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>