2

ビューをアニメーション化して、そのタッチ領域と画像が実際に一緒に動くようにする正しい方法を初心者に説明してもらえますか?!

多くの投稿、質問、チュートリアルを読みましたが、ビューをアニメーション化して新しい位置に残すことができるように、レイアウトを移動するものと画像を移動するものを説明するものはありません。

これは私が取り組んでいる方法の例であり、さまざまな組み合わせを試して成功しませんでした。ビューは親の RelativeLayout にあります。これはタッチ可能なアイコンのメニューであり、クリックして画面からスライドすると xml リソースでアニメーション化され、小さなタブが表示されたままになり、再度クリックするまでそこにとどまる必要があります。

public void RetractTools (View v){      
    final ImageView finalImage1 = (ImageView) findViewById(R.id.paintsView);
    Animation slideout = AnimationUtils.loadAnimation(this, R.anim.slideout_tools);
    slideout.setFillAfter(true);
    slideout.setAnimationListener(new AnimationListener() {
        @Override
        public void onAnimationEnd(Animation animation) {
            finalImage1.setEnabled(true);
            optionMenu.showing = false;
            optionMenu.inMotion = false;
            finalImage1.layout(1258, 668, 1697, 752);
            finalImage1.setRight(1280);
            finalImage1.invalidate();
        }

        @Override
        public void onAnimationRepeat(Animation arg0) {
        }

        @Override
        public void onAnimationStart(Animation arg0) {
            finalImage1.setEnabled(false);
        }
    });

    optionMenu.inMotion = true;
    v.startAnimation(slideout);
 }// End RetractMenu

何をしようとしても、問題が発生します。setFillAfter は、xml ファイルで設定されている場合は何もしません。プログラムで設定すると、画像は正しい場所に残りますが、タッチ コントロールはメニューがあった場所に残ります。私は setLeft と setRight を試しましたが、ビューの位置ではなく、画像のみを移動し、あらゆる種類の異なるレイアウト オプションを試しました。ビューを配置してレンダリングするために必要な基本的なメカニズムを理解していないことは明らかです。:D

ありがとう。

編集:解決策

同様の問題を抱えている人にとっては、これが相対レイアウトで機能することがわかった方法です。指定したサイズの LayoutParams オブジェクトを作成すると、位置を割り当てることができます。例えば。

    final RelativeLayout.LayoutParams position = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);           
    position.leftMargin = 440;

次に、それをビューに割り当てます

    myView.setLayoutParams(position);

要約すると、私が想定したようにビューの座標に直接アクセスするのではなく、ビューの位置へのインターフェイスとして LayoutParams オブジェクトを使用します。

4

1 に答える 1

2

あなたが持っているものは基本的に問題ありませんが、2つの欠陥があります:

  1. を使用していますがsetFillAfter()、これは特に便利ではありません

  2. あなたは電話をかけlayout()ているなどsetRight()、特に効果的ではありません

代わりに、では、ウィジェットを配置する新しい位置を反映するようにのonAnimationEnd()を変更する必要があります。ウィジェットのサイズと位置は、コンテナとネゴシエートするレイアウトルールによって決まります。最初は、これらはレイアウトXMLリソースを介して設定されます。実行時に変更することにより、それらのルールが何であるかを変更します。LayoutParamsViewLayoutParams

それらLayoutParamsが何であるか(LinearLayout.LayoutParams、、RelativeLayout.LayoutParamsなど)、およびそれらに指定する必要のある値は、あなたが何をしているのかわからないため、私たちはあなたに伝えることができません。

于 2012-04-13T13:01:54.383 に答える