TransitionDrawable: автоматически обратный переход после завершения

Я хочу добавить новые элементы ListView с хорошим эффектом. Я думал, что это просто и легко, но я наткнулся на проблему:

Я хочу играть в анимацию TransitionDrawable и после ее завершения – перемотать ее. Новый предмет будет нарисован на мгновение, а затем он будет смешаться с остальными.

TransitionDrawable имеет методы воспроизведения анимации вперед и назад, но ни один из них не может использоваться для синхронизации. Я ожидал возможности указать обратный вызов для завершения анимации, например:

TransitionDrawable transition = (TransitionDrawable) view.getBackground(); transition.startTransition(500, new TransitionCompleteListener(){ public void completed() { transition.reverseTransition(500); } }); 

Но ничего подобного не поддерживает класс TransitionDrawable.

Проблема заключается в следующем: как играть в анимацию TransitionDrawable, а когда она заканчивается – сразу же воспроизводите ее назад? У меня была идея использовать Timer класс для задержки выполнения обратной части анимации, но это решение выглядит слишком тяжелым для такой простой вещи.

Или, может быть, я должен использовать что-то другое, что TransitionDrawable? Я бы хотел избежать использования Property Animations, так как я хочу поддерживать более старые устройства (и PA являются avaialble с Honeycomb).

Solutions Collecting From Web of "TransitionDrawable: автоматически обратный переход после завершения"

Я еще не пробовал это сам, но я бы сказал, что то, к чему вы стремитесь, также может быть возможным благодаря старомодной анимации View, анимации, чтобы быть точным. Вместо прямого манипулирования фоном можно сделать вывод (при условии, что это то, что вы сейчас делаете), вы можете создать такой же эффект, изменив альфа-свойство представления, которое имеет те же размеры, что и макет строки. Затем вы можете указать как «нормальную» анимацию, так и ее обратную связь в одном анимационном наборе и начать с задержки, основанной на первом. В качестве альтернативы, Animation предоставляет AnimationListener, с которым вы можете подключиться и получать уведомление, когда заканчивается первая анимация, и затем начинайте ее обратное.

Рассматривая исходный код TransitionDrawable, я также вижу некоторые возможности для расширения текущей реализации с помощью пользовательского интерфейса прослушивателя. Не должно быть слишком сложно реально реализовать шаблон, который вы проиллюстрируете в фрагменте кода в своем вопросе.

Сейчас я немного короткое время, поэтому сделайте мне комментарий, если вам понадобятся более конкретные указатели (например, фрагменты кода). Затем я попытаюсь найти какое-то время в эти выходные, чтобы помочь вам.

Может быть, вы могли бы попробовать это:

 Drawable[] transBack = new Drawable[] { res.getDrawable( R.drawable.ic_acept_blue ), res.getDrawable( R.drawable.ic_acept )}; ImageView btn = (ImageView) findViewById(R.id.resource); TransitionDrawable transitionAcept = new TransitionDrawable(transBack); btn.setImageDrawable(transitionAcept); btn.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch (event.getAction()) { case MotionEvent.ACTION_DOWN:{ TransitionDrawable transition = (TransitionDrawable) btn.getDrawable(); transition.startTransition(75); }break; case MotionEvent.ACTION_UP:{ TransitionDrawable transition = (TransitionDrawable) btnAcept.getDrawable(); transition.reverseTransition(75); v.performClick(); }break; default: break; } return true; } }); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //... DO Something here } }); 

В приведенном выше коде реализована функция TouchListener для обработки переходов и переходов, а также функция clickListener для обработки ваших действий. Вот почему в MotionEvent.ACTION_UP вы вызываете v.performClick(); Надеюсь, это поможет вам.

Я расширил реализацию TransitionDrawable (фактически скопировал его и модифицировал), чтобы принять параметр repeatCount, который указывает, сколько раз, чтобы сделать переход вперед и назад. См. Раздел RepeatableTransitionDrawable в репозитории ниже.

Я также планирую добавить более двух поддерживаемых возможностей.

https://github.com/mehmet6parmak/CustomDrawables

Попробуйте с Handler;)

 final TransitionDrawable transition = (TransitionDrawable) sizesSelectionLayout.getBackground(); int duration = 500; transition.startTransition(duration); new Handler().postDelayed(new Runnable() { @Override public void run() { transition.reverseTransition(duration); } }, duration); 

😉

Оцените с помощью ViewAnimator вместо http://developer.android.com/reference/android/widget/ViewAnimator.html

Объект анимации, входящий и исходящий, прикрепленный к ViewAnimator, имеет AnimationListener, который запускает событие, которое вы хотите захватить