2012-04-13 5 views
2

誰かがnoobにタッチエリアとイメージが実際に一緒に動くようにビューをアニメートする正しい方法を説明できますか?ビューを正しく移動する方法は?

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

これは私が協力している方法の1つで、さまざまな組み合わせを試してみると成功しません。ビューは親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

ありがとうございます。

EDIT:ソリューション

同様の問題を持つ人のために、これは私が相対的なレイアウトで作業することが分かってきた方法です。指定したサイズのLayoutParamsオブジェクトを作成し、その位置を割り当てることができます。例えば。

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

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

myView.setLayoutParams(position); 

にそれを割り当てます。

答えて

2

何を持っていることは2つの欠陥で、基本的には大丈夫です:

  1. あなたはsetFillAfter()を使用している、特に有用ではありませんあなたはlayout()setRight()特にないものを、呼び出している

  2. 有効

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

とは何か(LinearLayout.LayoutParams,など)とそれらに指定する必要がある値は、わからないため、わからないことがあります。

+0

ありがとうございました。私は.Layout()がレイアウトパラメータを直接変更したと思った?setFillAfterとsetRightの行を削除して同じコードを使用すると、アニメーションの終わりを除いて、何も描画されていない1つのフレームグリッチがあります。 固定値表示用の値です。私のTF101で私が使っているプラ​​イベートアプリだから、ハードコーディングされた値の使用は気にしない。 ;) –

+0

また、setFillAfter()を保持し、.Layout()を削除すると、アニメーションは私の望むものとまったく同じですが、ビューのタッチレイアウトは残っています。 –

+0

@TickledPink: ".Layout()がレイアウトパラメータを直接変更したと思いますか?"レイアウトに基づいたルールに置き換えられます。そのため、 'LayoutParams'を調整する必要があります。 – CommonsWare

関連する問題