2016-04-27 23 views
11

Quello che voglio fare è spostare lo sfondo in orizzontale e farlo ripetere all'infinito.Android sposta continuamente lo sfondo con animazione

Ho provato a utilizzare uno ImageSwitcher con animazione per ottenere questo effetto, ma non è riuscito a farlo funzionare correttamente. Questo è il codice che ho così Farl

public class MainActivity extends AppCompatActivity implements ViewSwitcher.ViewFactory { 

    private Animation animSlide; 
    private ImageSwitcher image; 
    private ImageView imagePop; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     image = (ImageSwitcher) findViewById(R.id.image_switcher); 

     image.setFactory(this); 
     image.setImageResource(R.drawable.zc06); 
     Animation in = AnimationUtils.loadAnimation(this, android.R.anim.slide_in_left); 
     in.setDuration(10000); 
     Animation out = AnimationUtils.loadAnimation(this, android.R.anim.slide_out_right); 
     out.setDuration(10000); 
     image.setInAnimation(in); 
     image.setOutAnimation(out); 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new TimerTask() { 

      @Override 
      public void run() { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         image.setImageResource(R.drawable.zc06); 
        } 
       }); 
      } 

     }, 0, 10000); 

     Animation mZoomInAnimation = AnimationUtils.loadAnimation(this, R.anim.zoom_in); 

     Animation mZoomOutAnimation = AnimationUtils.loadAnimation(this, R.anim.zoom_out); 
     imagePop.startAnimation(mZoomInAnimation); 
     imagePop.startAnimation(mZoomOutAnimation); 

    } 

    @Override 
    public View makeView() { 
     ImageView myView = new ImageView(getApplicationContext()); 
     return myView; 
    } 
} 
+0

Perché stai utilizzando le animazioni di visualizzazione? Non dovresti davvero usarli più ... Usa invece la nuova API di animazione. In ogni caso è possibile creare facilmente un'animazione del genere avendo due 'ImageViews' nel proprio layout e traducendoli con un' ValueAnimator'. Vedi la mia risposta per ulteriori informazioni. –

risposta

38

Perché non provi ad animare solo lo sfondo da soli invece di utilizzare un ViewSwitcher? Tutto ciò che serve è un semplice ValueAnimator:

Prima aggiungere due identici ImageViews al layout e ha impostato lo stesso sfondo ad entrambi:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ImageView 
     android:id="@+id/background_one" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:src="@drawable/background"/> 

    <ImageView 
     android:id="@+id/background_two" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:src="@drawable/background"/> 

</FrameLayout> 

Quindi utilizzare un ValueAnimator per animare le loro proprietà translationX, ma compensato li per la loro larghezza:

final ImageView backgroundOne = (ImageView) findViewById(R.id.background_one); 
final ImageView backgroundTwo = (ImageView) findViewById(R.id.background_two); 

final ValueAnimator animator = ValueAnimator.ofFloat(0.0f, 1.0f); 
animator.setRepeatCount(ValueAnimator.INFINITE); 
animator.setInterpolator(new LinearInterpolator()); 
animator.setDuration(10000L); 
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator animation) { 
     final float progress = (float) animation.getAnimatedValue(); 
     final float width = backgroundOne.getWidth(); 
     final float translationX = width * progress; 
     backgroundOne.setTranslationX(translationX); 
     backgroundTwo.setTranslationX(translationX - width); 
    } 
}); 
animator.start(); 

Ciò si traduce in un'animazione continua che ripete lo sfondo a tempo indeterminato e dovrebbe essere simile a questo:

+1

Questo è esattamente quello che stavo cercando, grazie :) –

+0

Wow! Sei un mago, grazie mille Xaver! – Sipty

+0

Nel caso in cui si desideri rallentare l'animazione, aumentare la durata! :-) – Sipty

2

è possibile utilizzare AndroidScrollingImageView Biblioteca, tutto ciò che dovete fare è quello di definire la velocità e la fonte disegnabile

<com.q42.android.scrollingimageview.ScrollingImageView 
    android:id="@+id/scrolling_background" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    scrolling_image_view:speed="1dp" 
    scrolling_image_view:src="@drawable/scrolling_background" /> 

EDIT:

come detto @Cliff Burton, puoi ruotare la vista di 90 gradi se vuoi scorrere verticalmente.

+0

C'è un modo per scorrere verticalmente con questo? –

+0

@CliffBurton Non l'ho provato prima, ma potresti giocarci, magari puoi aggiungere l'orientamento nel codice xml, o forse c'è un metodo per farlo nel codice java, ma quelli sono solo supposizioni. –

+1

Ho appena realizzato che puoi ruotare la vista di 90 gradi se vuoi scorrere verticalmente ... se vuoi puoi aggiornare la tua risposta con questa soluzione;) –