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

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

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

2016年11月7日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

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

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