2012-03-07 9 views
3

私はAndroidのいくつかのpngシーケンスを持っています。画面の上端から下端までのxとyの姿勢変換をアニメーションする必要があります。アニメーションが実行されている間、私はクリックイベントを受け取るオブジェクトが必要です。Androidでインタラクティブなアニメーション(翻訳)をする方法

あなたは(クリックイベントの半ばアニメーションを取得しないように、オブジェクトの表示は、実際のオブジェクトとは異なる場所にあるので、私は、これは3.0以前のAndroidバージョンでは本当によく動作しません理解していますあなたがオブジェクトをクリックしていないので、ディスプレイ上でのみ必要です)。

私はこのような何かをやっている、とアニメーションが正常に見えるが、私はクリックハンドラーに取得することはありません:

Animation animation = new TranslateAnimation(0, 20,0, 300); 
animation.setDuration(1000); 
ticket.startAnimation(animation); 

ticket.startAnimation(animation); 

ticket.setOnClickListener(new OnClickListener() { 
    public void onClick(View view) { 
      //I don't get into this click event during animation 
     view.setVisibility(View.GONE); 
    } 
}); 

3.0前のデバイスのためのインタラクティブなアニメーションをサポートするための回避策は何ですか?背景のスレッドを使ってオブジェクトのxとyの位置をアニメートするカスタムアニメーションクラスがありますか?

--update --- NineOldAndroidのソリューションを使用してみましたが、アニメーションはうまく見えますが、アニメーション中にonclickイベントが表示されません。ここに私の更新されたコードです。だから、これはICS上でうまく動作しますが、2.3ではなく何か間違っていますか?またはフードのレイアウトマージンを実際に変更していないNineOldWorldのソリューションですか?

ImageView ticket = new ImageView(myActivity); 
      ticket.setImageResource(R.drawable.ticket); 
      ticket.setVisibility(View.INVISIBLE); 
      ticketHolder.addView(ticket); 
      ValueAnimator animation = ObjectAnimator.ofFloat(ticket, "y", 
        -200f, ticketHolder.getHeight()); 
      animation.setDuration(3000); 
      animation.start(); 
      animation.setStartDelay(i*1000); 
      animationsMap.put(animation, ticket); 

      ticket.setOnClickListener(new OnClickListener() { 
       public void onClick(View view) { 
        view.setVisibility(View.GONE); 
       } 
      }); 

      animation.addListener(new AnimatorListenerAdapter() { 
       public void onAnimationEnd(Animator animation) { 
//     tickets.remove(((ObjectAnimator)animation).getTarget()); 
        ImageView t = (ImageView) ((ObjectAnimator) animation).getTarget(); 
        t.setVisibility(View.GONE); 
        animationsMap.remove(animation); 
        if(animationsMap.size() == 0){ 
         ticketsAnimating = false; 
         scrim.setVisibility(View.VISIBLE); 
        } 

       } 
       @Override 
       public void onAnimationStart(Animator animation){ 
        ImageView t = (ImageView) ((ObjectAnimator) animation).getTarget(); 
        t.setVisibility(View.VISIBLE); 
       } 
      }); 

- 更新#2 --- 私はまた、パスアニメーションを試してみましたが、アニメーションの間に、そして、私はボタンのクリックイベントが届かないの後。誰でも私が間違っていることを知っている?

mButton = (Button) findViewById(R.id.delete_me); 
mButtonProxy = AnimatorProxy.wrap(mButton); 

// Set up the path we're animating along 
AnimatorPath path = new AnimatorPath(); 
path.moveTo(0, 0); 
path.lineTo(0, 300); 
path.curveTo(100, 0, 300, 900, 400, 500); 

// Set up the animation 
final ObjectAnimator anim = ObjectAnimator.ofObject(this, "buttonLoc", 
     new PathEvaluator(), path.getPoints().toArray()); 
anim.setDuration(10000); 

mButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d("united", "button clicked"); 
     anim.start(); 
    } 
}); 

答えて

4

そうだね、問題は、事前ハニカム、あなたのアニメーションビューの唯一の視覚的な側面が発生していることです。

これは、「ビジュアル」アニメーションに加えて、アニメーション表示のフレーム/ LayoutParamsも設定/アニメーションする必要があることを意味します。前ハニカムデバイスの場合

、私はあなたが適切にビューのLayoutParamsを設定するために使用できるアニメーションを聴くためのhttp://nineoldandroids.com/は非常に便利見つけるが、他の例もありますが、そのようSO上でこの1のように:https://stackoverflow.com/a/3952933/429047

+0

パーフェクト!本当にありがとう!私は試してみるつもりです。 –

+0

私の答えが更新されました。なぜクリックイベントが発生していないのかについて、notoldandroidの解決策が間違っているのが分かりますか? –

+13

NineOldAndroidsは、統一されたAPIを提供するだけです。残念ながら、ネイティブビューアニメーションを使用していたときと同じ制限があります。アニメーションが画面上で何かを動かし、それをクリック可能なままにしたい場合、アニメーションが完了すると、そのオブジェクトを 'LayoutParams'を使って物理的に移動する必要があります。それは吸うが、それは私たちが持っているすべてです。 –

1

これは私がやったことです。かなりうまくいきます。

MyTranslateAnimation animation = new MyTranslateAnimation(ticket, 10, 100, -500, ticketHolder.getHeight()); 

そして、ここに私のクラスである:

public class MyTranslateAnimation extends Animation { 
     private float fromXDelta; 
     private float fromYDelta; 
     private float toXDelta; 
     private float toYDelta; 
     private View view; 

     public MyTranslateAnimation(View view, float fromXDelta, 
       float toXDelta, float fromYDelta, float toYDelta) { 
      this.view = view; 
      this.fromXDelta = fromXDelta; 
      this.toXDelta = toXDelta; 
      this.fromYDelta = fromYDelta; 
      this.toYDelta = toYDelta; 
     } 

     @Override 
     protected void applyTransformation(float interpolatedTime, 
       Transformation t) { 
      Log.d("united", "time " + interpolatedTime); 
      float newX = (toXDelta - fromXDelta) * interpolatedTime; 
      float newY = (toYDelta - fromYDelta) * interpolatedTime; 
      LayoutParams p = (LayoutParams) view.getLayoutParams(); 
      p.leftMargin = (int) newX; 
      p.topMargin = (int) newY; 
      if (interpolatedTime > 0.0 && view.getVisibility() == View.GONE) { 
       view.setVisibility(View.VISIBLE); 
      } 
      view.requestLayout(); 
     } 
    } 
関連する問題