Android Icon Animatorを使う上で気をつけるポイント


# 概要
先日Googleの[Roman Nurik](http://roman.nurik.net/)さんによって[Android Icon Animator](http://j.mp/iconanimator)という、AnimatedVectorDrawableとAnimatedVectorDrawableCompatで使えるリソースファイルをWebブラウザ上で作成できるオーサリングツールが作られました。

機能は十分に揃っているのですぐにでも利用可能なのですが、使う上でいくつか気をつけないといけないポイントがあるので今回はそれらを紹介します。

![Screen Shot 2016-10-21 at 17.48.14.png](https://qiita-image-store.s3.amazonaws.com/0/40539/d18c5f5d-1e46-af39-6c78-67d7c73698d6.png "Screen Shot 2016-10-21 at 17.48.14.png")

# 気をつけるポイント
## こまめにSaveを行う
現状のAndroid Icon Animatorには自動保存機能などは存在しないため、こまめに画面の左側にある __File__ の __Save__ を選択して、ローカルに __.iconanim__ ファイルをバックアップしておくことをオススメします。
このファイルを __File__ の __Open__ で開くことでプロジェクトを復旧することができるので、Webブラウザが急に固まったときの惨事を軽減することができます。
私もアニメーションのチェックをしている際に過負荷で固まってしまったことがあり、Saveをしていなかったことでヒドく落ち込みました。

## API Level 22以下をサポートしている場合はpathDataのアニメーションは使わない
手元で確認したところpathDataのアニメーションはAPI Level 22以下では動かないことがわかりました。
そのため、API Level 22以下をサポートしているアプリはpathDataを変更するアニメーションは使わない方が良さそうです。作りたいアニメーションが他の要素を使うことで実現可能であればそちらを使って対応するようにしましょう。

## API Level 22以下で1つの要素に複数の異なるアニメーションを設定する場合には注意
API Level 22以下の場合、1つの要素に複数の異なるアニメーションを設定すると、2つ目以降のアニメーションが上手く動作しないことがわかりました。例えば、要素のサイズを変えるために __scaleX__ と __scaleY__ を同時に使用する場合がそれに当たります。
この問題に遭遇した場合は作成したリソースファイルを直接触って __target__ を分けることで解決できます。

#### 修正前
```
<target android:name="effect_layout">
    <aapt:attr name="android:animation">
        <set xmlns:android="http://schemas.android.com/apk/res/android">
            <objectAnimator
                android:name="effect_layout"
                android:duration="330"
                android:interpolator="@android:anim/decelerate_interpolator"
                android:propertyName="scaleX"
                android:startOffset="60"
                android:valueFrom="1"
                android:valueTo="1.333"
                android:valueType="floatType" />
            <objectAnimator
                android:name="effect_layout"
                android:duration="330"
                android:interpolator="@android:anim/decelerate_interpolator"
                android:propertyName="scaleY"
                android:startOffset="60"
                android:valueFrom="1"
                android:valueTo="1.333"
                android:valueType="floatType" />
        </set>
    </aapt:attr>
</target>
```

#### 修正後
```
<target android:name="effect_layout">
    <aapt:attr name="android:animation">
        <objectAnimator
            android:name="effect_layout"
            android:duration="330"
            android:interpolator="@android:anim/decelerate_interpolator"
            android:propertyName="scaleX"
            android:startOffset="60"
            android:valueFrom="1"
            android:valueTo="1.333"
            android:valueType="floatType" />
    </aapt:attr>
</target>
<target android:name="effect_layout">
    <aapt:attr name="android:animation">
        <objectAnimator
            android:name="effect_layout"
            android:duration="330"
            android:interpolator="@android:anim/decelerate_interpolator"
            android:propertyName="scaleY"
            android:startOffset="60"
            android:valueFrom="1"
            android:valueTo="1.333"
            android:valueType="floatType" />
    </aapt:attr>
</target>
```

また __scaleX__ を連続して行うなどの同一アニメーションを複数実行する場合には、作成したリソースファイルを直接使用して問題ないことを確認しています。

# 最後に
今後Android Icon AnimatorやSupport Libraryのアップデートで改善されるものもあると思いますが、現状のAndroid Icon Animatorは気をつけて使わないといけない点があるので注意して使ってください。
API Level 22以下の端末と、API Level 23以上の端末でアニメーションに違いがないか念入りにチェックすることをオススメします。