web-dev-qa-db-ja.com

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

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

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);
125
dmaxi

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

27
amko0l

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

注:ベクトルのドロアブルは画像よりも大幅に小さいため、余分な明示的な定義はオーバーヘッドをあまり受けず、明確な明示的なコードになります(ただし、ベクトルアセットを手動で変更することは避けるべきだと読みましたが) 、1つのファイルに変換を行うよりも、いくつかのファイルを更新する場合のオーバーヘッドに対処したいです。

注: Android St​​udioはベクターアセットの優れたソースです。

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>
13
samis