0

myViewに現在の位置からdeltaX、deltaYピクセルを移動させたい。しかし、それは私が望むより2倍長く動きます。これは、onAnimationEndのsetLayoutParamsが原因で発生します。それがなければ、myViewの実際の位置は変更されません。myViewの実際の位置を変更して、通常どおりにアニメーション化するにはどうすればよいですか?

class MyLayout extends RelativeLayout {
    Animation animation;
    MyView myView;

    animation = new TranslateAnimation(0, deltaX, 0, deltaY);
    animation.setDuration(100);
    animation.setFillAfter(true);
    myView.startAnimation(animation);           
}

class MyView extends ImageView {
    protected void onAnimationEnd() {
        super.onAnimationEnd();
        LayoutParams params = (LayoutParams)getLayoutParams();
        params.leftMargin += deltaX;
        params.topMargin += deltaY;
        setLayoutParams(params);
    }
}   
4

1 に答える 1

0

現在行っているようにビューの目的の変換を 2 回行うことを避けたい場合は、アニメーションの「setFillAfter」フラグを false に設定する必要があります。ドキュメントにあるように、「setFillAfter が true に設定されている場合、アニメーションの変換はアニメーションの終了後に適用されます。」

一方、「setFillAfter」フラグを true のままにしておくと、ビューは目的の位置に変換され、onAnimationEnd メソッドで LayoutParams を変更する必要はありません。そのため、何かが変換をブロックしている可能性があります。ビューが含まれているレイアウトに関する詳細情報を提供できれば、ほとんどの場合役に立ちます。

もう 1 つのことは、レイアウト パラメータのマージンを設定してビューを移動することは、完全に最良のアイデアではないということです。ハックのように考えてください。むしろ、ビューの位置を直接設定するか、親ビューでウェイトを操作してみてください。そうすれば、複数の異なる画面で同じ効果が得られます。

于 2012-08-18T16:06:14.427 に答える