3

そのため、レイアウトにImageViewがあり、ユーザーが後者をスワイプしたときに、ImageViewを右または左にスライドさせたいと思いました。以下に示すように、TranslateAnimationを使用してImageViewを翻訳しました。

ImageView logoFocus = (ImageView) findViewById(R.id.logoFocus);

Animation animSurprise2Movement = new TranslateAnimation(logoFocus.getLeft(), logoFocus.getLeft()+150, logoFocus.getTop(), logoFocus.getTop());
animSurprise2Movement.setDuration(1000);
animSurprise2Movement.setFillAfter(true);
animSurprise2Movement.setFillEnabled(true);
logoFocus.startAnimation(animSurprise2Movement);

このコードを[右にスワイプ]セクションに配置しました。同じコードですが、[左にスワイプ]セクションにgetLeft()-150を使用しています。初めてスワイプしたときは期待どおりに動作しますが、反対方向にスワイプすると、ImageViewは元の位置に戻るだけでなく、元の位置に戻ってから反対方向にスライドします。

Animationに設定したAnimationListenerのonAnimationEndメソッドに次のものを追加しようとしましたが、無駄でした。

MarginLayoutParams params = (MarginLayoutParams) logoFocus.getLayoutParams();
params.setMargins(logoFocus.getLeft()+150, logoFocus.getTop(), logoFocus.getRight(), logoFocus.getBottom());
logoFocus.setLayoutParams(params);

同じ方法で次のことも試しましたが、どちらも期待どおりに機能しませんでした。

((RelativeLayout.LayoutParams) logoFocus.getLayoutParams()).leftMargin += 150;
logoFocus.requestLayout();

誰か助けてくれませんか?setFillAfter(true)とsetFillEnabled(true)を使用しても、アニメーションの後で位置が変わらないようです。TranslateAnimationを使用する代わりの方法はありますか?

私が得ることができるどんな助けにも感謝します。:)

4

1 に答える 1

14

さて、私はそれを回避しました。現在、ImageViewに実際の位置を変更させる代わりに、ImageViewをアニメーション化するたびに更新するグローバル変数を使用しています。setFillAfter(true)とsetFillEnabled(true)を使用しているので、意図せずに元の位置に戻ることはありません。

private float xCurrentPos, yCurrentPos;
private ImageView logoFocus;

logoFocus = (ImageView) findViewById(R.id.logoFocus); 
xCurrentPos = logoFocus.getLeft(); 
yCurrentPos = logoFocus.getTop(); 

Animation anim= new TranslateAnimation(xCurrentPos, xCurrentPos+150, yCurrentPos, yCurrentPos); 
anim.setDuration(1000); 
anim.setFillAfter(true); 
anim.setFillEnabled(true); 
animSurprise2Movement.setAnimationListener(new AnimationListener() {

    @Override
    public void onAnimationStart(Animation arg0) {}

    @Override
    public void onAnimationRepeat(Animation arg0) {}

    @Override
    public void onAnimationEnd(Animation arg0) {
        xCurrentPos -= 150;
    }
});
logoFocus.startAnimation(anim);

同じ問題が発生している場合は、これがお役に立てば幸いです。私はこのようないくつかの投稿を見ましたが、良い答えはありません。

于 2012-10-21T15:47:04.607 に答える