2013-08-14 17 views
8

Voglio far lampeggiare il mio ImageView. Più esattamente, su un evento come un clic di un pulsante, voglio che ImageView cambi il suo src per 1 secondo, quindi cambi di nuovo, poi di nuovo ecc. E poi dovrebbe fermarsi e ImageView dovrebbe avere lo stesso src del precedente. ho cercato di fare qualcosa sulla base di un'altra domanda, ma non funziona ...Android - make ImageView "lampeggia"

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); 
} 

Qualcuno sa come questo può essere fatto (se si può fare). Grazie!

+0

Prima di tutto, assicurati che il tuo 'imgView' i sn't null –

+0

Secondo, prova con la condizione 'j <1000'. 5 iterazioni è un periodo troppo breve (1,5 secondi) –

risposta

23

o si può semplicemente utilizzare AnimationDrawable definendo in 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> 

e chiamando start() su di esso:

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

Questo ha fatto il trucco. Ho finito per aggiungere queste righe al tuo codice: img.clearAnimation(); frameAnimation.stop() ;. E in XML I pun oneshot = "true" e copia-incolla alcune volte gli elementi dall'elenco di animazione –

+1

.. Ho dovuto aggiungere spazio dei nomi XML per l'elemento : 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> 

o dare un'occhiata a questo

link

+2

correggimi se ho torto, ma questo rende solo la mia vista visibile/invisibile ... –

1

Si può solo cambiare l'immagine di origine temporanea e avviare un timer per 1 secondo, dopo di che l'immagine originale può essere di nuovo visibile:

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

Il codice seguente posizionerà un ImageView sullo schermo e quando si clicca ImageView, lampeggerà tra 2 immagini diverse per 5 secondi:

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(); 
    } 
}); 

E il file 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>