2013-08-14 20 views
8

Chcę, aby mój ImageView wydawał się migać. Dokładniej, w przypadku zdarzenia takiego jak kliknięcie przycisku, chcę, aby ImageView zmieniał src na 1 sekundę, następnie zmieniał z powrotem, potem znowu itd. A następnie powinien się zatrzymać, a ImageView powinien mieć ten sam src co poprzedni. Próbowałem coś zrobić w oparciu o inne pytanie, ale to nie działa ...Android - ustaw "miganie" ImageView

private class MyHandler extends Handler { 
    public ImageView imgView; 

    @Override 
    public void handleMessage(Message msg) { 
     if (imgView != null) { 
      switch (msg.what) { 
      case 0: 
       imgView.setImageResource(R.drawable.red_img); 
       break; 
      case 1: 
       imgView.setImageResource(R.drawable.white_img); 
       break; 

      } 
     } 
     super.handleMessage(msg); 
    } 
} 

(...) 

MyHandler blinker = new MyHandler(); 
blinker.imgView = imgView; 
for (int j = 0; j < 5; j++) { 
    Message msg = new Message(); 
    if (j % 2 == 0) { 
     msg.what = 0; 
    } else { 
     msg.what = 1; 
    } 

    blinker.sendMessageDelayed(msg, j * 300); 
} 

Czy ktoś wie, w jaki sposób można to zrobić (jeśli można to zrobić). Dzięki!

+0

Przede wszystkim upewnij się, że twój 'imgView' i sn't null –

+0

Po drugie, spróbuj z warunkiem 'j <1000'. 5 iteracji to zbyt krótki okres (1,5 sekundy) –

Odpowiedz

23

Lub może po prostu użyć AnimationDrawable definiując go w xml:

<animation-list android:id="@+id/selected" android:oneshot="false"> 
    <item android:drawable="@drawable/state1" android:duration="1000" /> 
    <item android:drawable="@drawable/state2" android:duration="1000" /> 
</animation-list> 

i nazywając start() na nim:

ImageView img = (ImageView)findViewById(R.id.spinning_wheel_image); 
img.setImageResource(R.drawable.my_blinking_drawable); 
AnimationDrawable frameAnimation = (AnimationDrawable) img.getDrawable(); 
frameAnimation.start(); 
+0

To wystarczyło. Skończyło się na dodaniu tych linii do twojego kodu: img.clearAnimation(); frameAnimation.stop() ;. A w XML I pun oneshot = "true" i skopiowałem-wkleiłem kilka razy elementy z listy animacji –

+1

.. Musiałem dodać przestrzeń nazw XML dla elementu : xmlns: android = "http: // schemas.android.com/apk/res/android " – Li3ro

0
<?xml version="1.0" encoding="utf-8"?> 
    <set xmlns:android="http://schemas.android.com/apk/res/android"> 
     <alpha android:fromAlpha="0.0" 
      android:toAlpha="1.0" 
      android:interpolator="@android:anim/accelerate_interpolator" 
      android:duration="600" 
      android:repeatMode="reverse" 
      android:repeatCount="infinite"/> 
    </set> 

lub rzucić okiem na ten

link

+2

popraw mnie, jeśli się mylę, ale to tylko sprawia, że ​​mój widok jest widoczny/niewidoczny ... –

1

można po prostu zmienić tymczasowe źródło obrazu i rozpocząć Timer na 1 sekundę, po czym oryginalny obraz może być pokazany ponownie:

image.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(final View v) { 
     ImageView img = (ImageView) v; 
     img.setImageResource(R.drawable.temporary_image); 
     Timer t = new Timer(); 
     t.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         img.setImageResource(R.drawable.main_image) 
        } 
       }); 
      } 
     }, 1000); 
    } 
}); 
3

Poniższy kod umieści ImageView na ekranie, a po kliknięciu ImageView będzie migać między 2 różnymi obrazami przez 5 sekund:

int numberOfTimesToBlink = 4; 
long blinkInterval = 1000; // 1 second 

final ImageView blinkingImageView = (ImageView)findViewById(R.id.blinkingImageView); 

// setBackgroundDrawable is deprecated but it still works, and the newer method (setBackground) has min API level of 16 
blinkingImageView.setBackgroundDrawable(getResources().getDrawable(R.drawable.yourFirstImage)); 
blinkingImageView.setTag("yourFirstImage"); 

final CountDownTimer blinkTimer = new CountDownTimer((numberOfTimesToBlink+1)*1000, blinkInterval) { 
    @Override 
    public void onTick(long millisUntilFinished) { 
     if (blinkingImageView.getTag() == "yourFirstImage") { 
      blinkingImageView.setBackgroundDrawable(getResources().getDrawable(R.drawable.yourSecondImage)); 
      blinkingImageView.setTag("yourSecondImage"); 
     } 
     else if (blinkingImageView.getTag() == "yourSecondImage") { 
      blinkingImageView.setBackgroundDrawable(getResources().getDrawable(R.drawable.yourFirstImage)); 
      blinkingImageView.setTag("yourFirstImage"); 
     } 
    } 

    @Override 
    public void onFinish() { 

    } 
}; 

blinkingImageView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     blinkTimer.start(); 
    } 
}); 

i plik xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity"> 

    <ImageView android:id="@+id/blinkingImageView" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 

</RelativeLayout> 
Powiązane problemy