ASとか

開発系の記事が多めです。タイトルのASはActionScriptの略です。

アニメーションさせているViewのVisibilityが操作できない

はじめに

ImageViewをアニメーションさせておき、イベントで表示非表示を切り替えようと思ったらできなかった。

初期設定
// アニメーション設定
TranslateAnimation translate = new TranslateAnimation(0, 5, 0, 0);
translate.setDuration(3000);
translate.setInterpolator(new CycleInterpolator(10));
translate.setRepeatCount(Animation.INFINITE);

((ImageView) findViewById(R.id.imageView1)).startAnimation(translate);
各イベント
private void start() {
    ((ImageView) findViewById(R.id.imageView1)).setVisibility(View.VISIBLE);
}

private void stop() {
    ((ImageView) findViewById(R.id.imageView1)).setVisibility(View.GONE);
}

とりあえず

RepeatCountを0に設定したAnimationオブジェクトを設定し直したら消せました。

各イベント書き直し
private void start() {
    TranslateAnimation translate = new TranslateAnimation(0, 5, 0, 0);
    translate.setDuration(3000);
    translate.setInterpolator(new CycleInterpolator(10));
    translate.setRepeatCount(Animation.INFINITE);
    ((ImageView) findViewById(R.id.imageView1)).startAnimation(translate);
    ((ImageView) findViewById(R.id.imageView1)).setVisibility(View.VISIBLE);
}

private void stop() {
    TranslateAnimation translate = new TranslateAnimation(0, 0, 0, 0);
    translate.setDuration(0);
    translate.setInterpolator(new CycleInterpolator(0));
    translate.setRepeatCount(0);
    ((ImageView) findViewById(R.id.imageView1)).startAnimation(translate);
    ((ImageView) findViewById(R.id.imageView1)).setVisibility(View.GONE);
}

しかしここで問題が

startAnimation(Animation animation)を呼び出した際にVisibilityも切り替わるらしく、上記のままstop()を繰り返し呼ぶと一瞬表示されてしまう。なのでこの場合は"既にRepeatCountが0のAnimationオブジェクトが設定されていれば何もしない"という判定を入れるべき

stop()書き直し

public void stop() {
    Animation animation = ((ImageView) findViewById(R.id.imageView1)).getAnimation();
    if (null != animation && 0 != animation.getRepeatCount()) {
        TranslateAnimation translate = new TranslateAnimation(0, 0, 0, 0);
        translate.setDuration(0);
        translate.setInterpolator(new CycleInterpolator(0));
        translate.setRepeatCount(0);
        ((ImageView) findViewById(R.id.imageView1)).startAnimation(translate);
    }
    ((ImageView) findViewById(R.id.imageView1)).setVisibility(View.GONE);
}

本当は

Animationクラスのcancel()とかで何とかしたかったけど私にはできませんでした。とりあえず急ぎなのでこんなもので