Как перемещать изображение вверх и вниз непрерывно, используя трансляцию анимации в Android?

17

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

private ImageView mScanner;
private Animation mAnimation;

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mScanner = (ImageView)findViewById(R.id.Scanner);

    mAnimation = new TranslateAnimation(0, 0, 0, 500);
    mAnimation.setDuration(10000);
    mAnimation.setFillAfter(true);
    mAnimation.setRepeatCount(-1);
    mAnimation.setRepeatMode(Animation.REVERSE);
    mScanner.setAnimation(mAnimation);
    mScanner.setVisibility(View.VISIBLE);
}

Теперь я хочу, чтобы при достижении изображения в нижней части экрана он должен начать движение назад. Как я могу это сделать?

Примечание: выполните обратный режим. См. Код. Но теперь проблема в том, что она оставляет линии при движении снизу вверх. Как прикрепленный образ. Как удалить эти строки?

    
задан Tshepang 02.09.2011 в 11:01
источник
  • Просмотр моего решения: stackoverflow.com/a/38934624/2535875 –  Md Imran Choudhury 13.08.2016 в 18:15

3 ответа

34

Измените код в соответствии с этим:

   mScanner.setVisibility(View.VISIBLE);
   mAnimation = new TranslateAnimation(
            TranslateAnimation.ABSOLUTE, 0f,
            TranslateAnimation.ABSOLUTE, 0f,
            TranslateAnimation.RELATIVE_TO_PARENT, 0f,
            TranslateAnimation.RELATIVE_TO_PARENT, 1.0f);
   mAnimation.setDuration(10000);
   mAnimation.setRepeatCount(-1);
   mAnimation.setRepeatMode(Animation.REVERSE);
   mAnimation.setInterpolator(new LinearInterpolator());
   mScanner.setAnimation(mAnimation);

И, кроме того, используйте xml, а не изображение. Пожалуйста, ознакомьтесь с приведенным ниже кодом и поместите его в свой файл ImageView src.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line">
    <solid android:color="#0000FF"/>
    <size android:width="480dp"
        android:height="10dp"/>
    <corners android:radius="1dp"/>
    <stroke android:width="3dp"
        android:color="#000000"/>
</shape>

Надеюсь, это поможет вам.

    
ответ дан user456118 12.04.2012 в 14:00
источник
  • Отлично. Я включил xml и удалил mAnimation.setFillAfter (true); линия, и она работала так, как я хотел. Спасибо за помощь. –  Apr 12 '12 at 12:14 12.04.2012 в 14:14
  • Эй, ваш код не работает над 2.3.6. –  sandy 10.10.2013 в 15:37
  • @sandy Я проверил этот код с 2.1 по 4.2 и его работу на всех моих устройствах. Пожалуйста, не пытайтесь использовать изображение, поскольку у меня возникла проблема с изображением, а затем я использовал созданную на основе XML строку в качестве замены изображения, используемого в проекте. Просьба проверить свой код и попробовать еще раз. благодаря –  Oct 11 '13 at 4:36 11.10.2013 в 06:36
  • Он показывает, что нужно, но только потому, что вы знаете, если вы используете его на экране камеры, это может сильно повлиять на производительность. Например, на узле 3 камера имела бы 1-секундный лаг –  KKO 21.07.2014 в 14:45
  • @KKO вам нужно позаботиться о производительности. Насколько я использовал, я не нашел никакого запаздывания. –  Sep 17 '14 at 14:23 17.09.2014 в 16:23
Показать остальные комментарии
7

Вам нужно установить свойство repeat

андроида: repeatMode

внутр. Как анимация ведет себя, когда она достигает конца анимации. android: repeatCount должен быть установлен на положительное целое число или «-1», чтобы этот атрибут имел эффект. Установите «reverse», чтобы иметь обратное направление анимации с каждой итерацией или «повторить», чтобы каждый цикл анимации начинался с начала.

Animation a;
a.setRepeatMode(Animation.REVERSE);
    
ответ дан Lukap 02.09.2011 в 11:44
источник
  • он работает, но оставляет линию при движении по обратному направлению вниз. Как удалить эту строку, чтобы она выглядела так, как сканирование. Я обновил свой код, а также добавил изображение. благодаря –  Sep 2 '11 at 9:59 02.09.2011 в 11:59
2

Я думаю, вам нужно удалить mAnimation.setFillAfter(true); , потому что это означает, что он останется навсегда, где он остановится.

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

    
ответ дан Dimitris Makris 02.09.2011 в 11:22
источник
  • Я сделал то, что хочу, но теперь у меня возникает новая проблема, для которой я привязал изображение. Я обновил свой вопрос. Пожалуйста, смотрите. благодаря –  Sep 3 '11 at 6:24 03.09.2011 в 08:24