2015-02-01 3 views
0

Всего здесь нет, поэтому простите мое невежество. Я нашел код, чтобы анимировать ImageView:Создание нескольких изображений анимировать последовательно

public void startAnimatedBackground(Integer num) { 

    ImageSwitcher imageSwitcher = null; 
    switch (num) { 
     case 0: 
      imageSwitcher = img_0; 
      break; 
     case 1: 
      imageSwitcher = img_1; 
      break; 
     case 2: 
      imageSwitcher = img_2; 
      break; 
     case 3: 
      imageSwitcher = img_3; 
      break; 
     default: 
      break; 
    } 
    imageSwitcher.setInAnimation(aniIn); 
    imageSwitcher.setOutAnimation(aniOut); 
    imageSwitcher.setFactory(this); 
    imageSwitcher.setImageResource(images[index]); 

    final Handler handler = new Handler(); 
    final ImageSwitcher finalImageSwitcher = imageSwitcher; 
    Runnable runnable = new Runnable() { 

     @Override 
     public void run() { 
      if (isRunning) { 
       index++; 
       index = index % images.length; 
       finalImageSwitcher.setImageResource(images[index]); 
       handler.postDelayed(this, interval); 
      } 
     } 
    }; 
    handler.postDelayed(runnable, interval); 

} 

public View makeView() { 
    ImageView imageView = new ImageView(this); 
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    imageView.setLayoutParams(new ImageSwitcher.LayoutParams(
      TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT)); 
    return imageView; 
} 

@Override 
public void finish() { 
    isRunning = false; 
    super.finish(); 
}} 

Я создаю некоторые из необходимого кода на OnCreate():

private int index = 0; 
private boolean isRunning = true; 
Animation aniIn; 
Animation aniOut; 
ImageSwitcher img_0,img_1,img_2,img_3; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.user_walk_in_progress); 
    aniIn = AnimationUtils.loadAnimation(this, 
      android.R.anim.fade_in); 
    aniOut = AnimationUtils.loadAnimation(this, 
      android.R.anim.fade_out); 

    aniIn.setDuration(500); 
    aniOut.setDuration(500); 
    img_0 = (ImageSwitcher) findViewById(R.id.switcher_accept); 
    img_1 = (ImageSwitcher) findViewById(R.id.switcher_on_way); 
    img_2 = (ImageSwitcher) findViewById(R.id.switcher_in_progress); 
    img_3 = (ImageSwitcher) findViewById(R.id.switcher_finished); 
    startAnimatedBackground(0); 
} 

Теперь первый один работает отлично. Теперь в действии я пытаюсь переключить это, чтобы анимация начала второго изображения:

Редактировать: Это новое «действие» не является тем, что раздувает представление. Новое мероприятие - это служба GCM Intent Service, которая просто прослушивает уведомления и обновляет информацию о моем уведомлении. Когда я получаю это уведомление, я хочу принять представление, которое в настоящее время отображается на экране пользователя уже, и обновить анимацию, чтобы переключить ее на 2-е изображение.

  WalkInProgress walk = new WalkInProgress(); 
     walk.startAnimatedBackground(1); 

Это приводит к ошибке:

02-01 16:03:04.766 23805-24580/ly.leash.Leashly I/System.out﹕ null 02-01 16:03:04.778 23805-24580/ly.leash.Leashly E/AndroidRuntime﹕ FATAL EXCEPTION: IntentService[GcmIntentService] Process: ly.leash.Leashly, PID: 23805 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageSwitcher.setInAnimation(android.view.animation.Animation)' on a null object reference at ly.leash.Leashly.WalkInProgress.startAnimatedBackground(WalkInProgress.java:179) at ly.leash.Leashly.GcmIntentService.sendNotification(GcmIntentService.java:96) at ly.leash.Leashly.GcmIntentService.onHandleIntent(GcmIntentService.java:72) at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.os.HandlerThread.run(HandlerThread.java:61)

Так что для какой-либо причине анимация возвращается к нулевой.

Я попытался объявить все это в функции startAnimatedBackground вместо OnCreate, но это приводит к ошибкам, а также:

02-01 16:15:10.488 25553-25930/ly.leash.Leashly E/AndroidRuntime﹕ FATAL EXCEPTION: IntentService[GcmIntentService] Process: ly.leash.Leashly, PID: 25553 java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference at android.content.ContextWrapper.getResources(ContextWrapper.java:85) at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:74) at android.view.animation.AnimationUtils.loadAnimation(AnimationUtils.java:73) at ly.leash.Leashly.WalkInProgress.startAnimatedBackground(WalkInProgress.java:152) at ly.leash.Leashly.GcmIntentService.sendNotification(GcmIntentService.java:96) at ly.leash.Leashly.GcmIntentService.onHandleIntent(GcmIntentService.java:72) at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.os.HandlerThread.run(HandlerThread.java:61)

Ошибка в этой строке:

 aniIn = AnimationUtils.loadAnimation(this, 
      android.R.anim.fade_in); 
+0

Что вы подразумеваете под 'Now в другой части приложения? Другая деятельность? – iRuth

+0

Да, другое занятие. Извините – user1610719

+0

Я предполагаю, что 'img_1' не находится в файле макета новой активности. Я прав? – iRuth

ответ

1

Причина для нулевой указатель состоит в том, что ImageSwitcher, к которому вы пытаетесь получить доступ, находится в другом действии. Вам нужно будет создать его снова в этом новом действии, используя img_1 = (ImageSwitcher) findViewById(R.id.switcher_on_way); (предполагая, что виджет ImageSwitcher с id switcher_on_way находится в файле формата XML новой активности).

Update

Для того, чтобы отправить сообщение от Intent службы GCM к вашей текущей деятельности, вам нужно будет послать широковещательный к деятельности.

После подтверждения того, что пользователь в настоящее время просмотра вашей деятельности, создать Intent и посылает широковещательный к деятельности:

/* create intent */ 
Intent intent = new Intent("my_animation"); 
intent.putExtra("message", message); <-- replace this with what you 
             want to broadcast to your 
             activity (which would be an 
             integer specifying the new 
             ImageSwitcher) 

/* send broadcast */ 
this.sendBroadcast(intent); 

В вашей деятельности, создать BroadcastReceiver, который будет обрабатывать широковещательное намерение.

/* this handler will process the broadcast intent */ 
private BroadcastReceiver messageReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     // Extract data included in the Intent 
     String message = intent.getStringExtra("message"); 

     // you could start your animation here 
    } 
}; 

Зарегистрируйте BroadcastReceiver в onResume и разрегистрировать его в .

@Override 
protected void onResume() { 
    super.onResume(); 
    this.registerReceiver(messageReceiver, new IntentFilter("my_animation")); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    this.unregisterReceiver(messageReceiver); 
} 

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

+0

Извините, только что вернулся из поездки!Спасибо за ответ, вы говорите, что switcher_on_way должен быть в новом действии? Проверьте мое редактирование выше. Активность, вызывающая код для анимации второго изображения, на самом деле не является тем, что в настоящее время рассматривается, это всего лишь служба GCM, которая видит, что у нас есть обновленное сообщение GCM, и пытается обновить изображение для уже отображаемой активности выше – user1610719

+0

@ user1610719 Я обновил свой ответ. – iRuth

+0

Эй, спасибо. Я сделал то же, что сделал выше, и я не получаю функцию onReceive в своей первоначальной деятельности. Я также попытался добавить подробные сведения о классе, который я хочу отправить в Intent(), но это все еще ничего не изменило. Что мне не хватает? Я не знал о вещательных приемниках, это здорово! Я собираюсь прочитать и ответить на свой вопрос – user1610719