У меня есть несколько 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();
}
});
Совершенная !!! Спасибо! Я попробую. –
Я обновил свой ответ, вы видите, что я делаю неправильно с решением unoldandroid относительно того, почему я не получаю события кликов? –
NineOldAndroids просто предоставляет унифицированный API. К сожалению, он страдает теми же ограничениями, что и при использовании собственной анимации вида. Если анимация перемещает что-то на экране, и вы хотите, чтобы она оставалась кликабельной, вам нужно будет физически перемещать объект после завершения анимации с помощью 'LayoutParams'. Это отстой, но это все, что у нас есть. –