または、TranslateAnimation後に絵がチラつく問題。(ここまでタイトル。)
どもです。
Androidでアプリ開発実習中です。
TranslateAnimationでビューグループを動かす。
終了後は、setX、setYで位置を再登録。
これで一応、アニメーションは動いてくれていたのですが、
なんか、終了後から再登録の間、一瞬だけビューグループの場所がおかしくなります。
アニメーション終了後に、終了後の位置に戻るsetFillAfter()を入力してみると、
なんでや!!( ゚Д゚)
たぶん、一瞬チラついていたのもこの瞬間移動後の地点。
この後もう一度アニメーションを動かすと、開始地点はアニメーション終了地点(正解の地点)。
何らかの理由で、表示の上だけで位置情報が狂っている…。
これの解決に随分と悩まされたのですが、
一撃必殺で解決してくれた神サイトがあったので、記録しておこうと思った次第です。
琴線探査【AndroidのTranslateAnimationのクセはひどいね 】
こちらのサイト様によると、
どうやらTranslateAnimationは対象の位置情報を変更しない。
見かけだけ動かすものだそうで。
幸運なことに、僕のプログラムは予め移動後座標を計算で取得し、再登録するロジックが既に組んである。
必要なのはたったひとつの追記だったわけだ。
アニメーション終了時に空のアニメーションをセットしなおす
// アニメーションリスナの登録
アニメーション用変数.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
//アニメーション開始時の処理(仕様上省略不可)
}
@Override
public void onAnimationRepeat(Animation animation) {
//アニメーション繰り返し時の処理(仕様上省略不可)
}
@Override
public void onAnimationEnd(Animation animation) {
//アニメーション終了時
対象.setX(終了後のX地点);
対象.setY(終了後のY地点);
対象.setAnimation(null);
}
}
);
.setAnimation(null)
このたったひとつのコード。
アニメーション終了時に、空のアニメーションをセットすることで、
アニメーション終了時のチラつき又は謎の瞬間移動を抑えられるようです。
参考サイト様の方では、アニメ開始前に、
target.layout(0, 0, target.getWidth(), target.getHeight());
を入れていないと2回目以降の開始時がチラつくとありましたが、
僕の方ではそのような現象は確認できませんでした。
代わりになるロジックをどこかで組んでいたのかもしれません。
プログラムを見ながらで良いと思いますが、不安なら入れておいた方がよいと思われます。