ど素人から毛を生やす。<延>

AndroidでTranslateAnimationしたとき終了後に位置が狂う問題、

java > フロントエンジニア、javaを学ぶ 2016年11月7日(最終更新:6月前)

または、TranslateAnimation後に絵がチラつく問題。(ここまでタイトル。)

 

どもです。
Androidでアプリ開発実習中です。

TranslateAnimationでビューグループを動かす。
終了後は、setX、setYで位置を再登録。

これで一応、アニメーションは動いてくれていたのですが、
なんか、終了後から再登録の間、一瞬だけビューグループの場所がおかしくなります。

アニメーション終了後に、終了後の位置に戻るsetFillAfter()を入力してみると、

h281107

なんでや!!( ゚Д゚)

たぶん、一瞬チラついていたのもこの瞬間移動後の地点。
この後もう一度アニメーションを動かすと、開始地点はアニメーション終了地点(正解の地点)。
何らかの理由で、表示の上だけで位置情報が狂っている…。

これの解決に随分と悩まされたのですが、
一撃必殺で解決してくれた神サイトがあったので、記録しておこうと思った次第です。

 

琴線探査【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回目以降の開始時がチラつくとありましたが、
僕の方ではそのような現象は確認できませんでした。
代わりになるロジックをどこかで組んでいたのかもしれません。
プログラムを見ながらで良いと思いますが、不安なら入れておいた方がよいと思われます。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった  (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)