ImageView.setAlphaがあるよ!

というわけで、今回見つけてきたのはこのページ。

なるほど、ImageView.setAlpha()を使うのね。
って、Drawableに setAlpha()って使えるの??? と、思ったら普通に使えた。
どこをどう経由して setAlpha()できるんだろう??? startAnimation()はできないのに…。


さて、上記ページに書いてある手順はこんな感じ。

  1. HandlerとRunnableのオブジェクトを作成
  2. Handler.postDelayed()を使ってRunnableを登録
  3. Runnable.run()が呼ばれたらアニメーションが始まってからどれだけ時間が経ったかを確認
  4. まだアニメーション中の状態だったら、どれだけ時間が経ったかに合わせて絵を動かす
  5. 自分自身をHandler.postDelayed()を使って呼び出す

今回やりたかったのはフェードアウトだったので絵を動かすのではなくて Drawable.setAlpha()を何回も呼び出すことになる。
で、アルファの値をアニメーションを始めた時からどれだけ時間が経ったかで決める。
コードはこんな感じ。

Handler mHandler;
FadeoutRunnable mFr;
Drawable myDrawable;
long mAnimationTime;
final long FADEOUT_TIMER = 300;
final long FADEOUT_DELAY = 30;

class FadeoutRunnable implements Runnable {
    @Override
    public void run() {
        long time = System.currentTimeMillis();
        long passedTime = time - mAnimationTime;
        if (passedTime<FADEOUT_TIMER) {
            long alphaValue = 255 - (passedTime * 255) / FADEOUT_TIMER;
            myDrawable.setAlpha((int)alphaValue);
            mHandler.postDelayed(mFr, FADEOUT_DELAY);
        }
        else {
            myDrawable.Alpha(0);
        }
    }
}

mAnimationTime = System.currentTimeMillis();
mFadeoutRunnable = new FadeoutRunnable();
mFadeoutRunnable.run();

上のページにも書いてあるけど、postDelayed()は実際に指定した時間後に実行されるわけじゃない。
バイスが忙しい時だと平気でその倍以上の時間が経ってから呼ばれる。
なのでトータル 300msecでフェードアウトするのに 30msec間隔で 11回呼び出される様な感じの上のコードも、実際の自分のコードでは 3回〜4回しか呼ばれない。
でも、それなりにフェードアウトに見えるから良しとしよう!


というわけで、既存のコードの Drawableをフェードアウトさせるのは、たぶん TransitionDrawableを使うのが修正する手間も少なくて一番楽チンだとは思うけど、勢いでやってしまったのでとりあえずのメモでした。