2012-03-07 1 views
3

У меня есть несколько png-последовательностей в Android, что мне нужно анимацию их перевода x и y postion сверху вниз. Пока происходит анимация, мне нужны объекты для получения событий щелчка.Как сделать интерактивную анимацию (перевод) с помощью Android

Я понимаю, что это не очень хорошо работает в версии для Android до 3.0, так как дисплей объекта находится в другом месте, чем фактический объект, поэтому вы не получаете середину анимации кликов (которая это то, что мне нужно), так как вы не нажимаете на объект, только на дисплее.

я делаю что-то вроде этого, и анимация выглядит хорошо, но я никогда не попасть в обработчик щелчка:

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); 
       } 
      }); 

- Update # 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

Вы правы, проблема в том, что pre-Honeycomb, только визуальный аспект вашего анимационного вида.

Это означает, что помимо «визуальной» анимации вам также необходимо установить/анимировать рамку/LayoutParams анимированного представления.

Для предварительного Honeycomb устройств, я нахожу http://nineoldandroids.com/ очень полезно для прослушивания анимации, который вы можете использовать для установки LayoutParams по мнению надлежащим образом, но есть и другие примеры, такие, как этот на SO: https://stackoverflow.com/a/3952933/429047

+0

Совершенная !!! Спасибо! Я попробую. –

+0

Я обновил свой ответ, вы видите, что я делаю неправильно с решением unoldandroid относительно того, почему я не получаю события кликов? –

+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(); 
     } 
    } 
Смежные вопросы