2016-04-27 12 views
11

Was ich tun möchte, ist den Hintergrund horizontal verschieben und haben es unendlich wiederholen.Android verschieben Hintergrund kontinuierlich mit Animation

Ich versuchte mit einer ImageSwitcher mit Animation, um diesen Effekt zu erzielen, konnte aber nicht richtig funktionieren. Dies ist der Code, den ich so farl haben

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

Warum verwenden Sie Ansichtsanimationen? Sie sollten sie wirklich nicht mehr verwenden ... Verwenden Sie stattdessen die neue Animations-API. Wie auch immer, Sie können einfach eine solche Animation erstellen, indem Sie zwei ImageViews in Ihrem Layout haben und diese mit einem ValueAnimator übersetzen. Siehe meine Antwort für weitere Informationen. –

Antwort

38

Warum versuchen Sie nicht nur den Hintergrund zu animieren, sich stattdessen eine ViewSwitcher zu verwenden? Sie brauchen, ist eine einfache ValueAnimator:

Erste zwei identische ImageViews zum Layout hinzufügen und die gleiche Hintergrundbild auf beide setzen:

<?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> 

Dann eine ValueAnimator nutzen ihre translationX Eigenschaft zu animieren, aber versetzt sie durch ihre Breite:

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

Daraus ergibt sich eine kontinuierliche Animation, die den Hintergrund auf unbestimmte Zeit wiederholt und sollte wie folgt aussehen:

+1

Dies ist genau das, was ich gesucht habe, danke :) –

+0

Wow! Du bist ein Zauberer, vielen Dank Xaver! – Sipty

+0

Wenn Sie die Animation verlangsamen möchten, erhöhen Sie die Dauer! :-) – Sipty

2

Sie AndroidScrollingImageView Bibliothek verwenden können, alles, was Sie tun müssen, ist die Geschwindigkeit und die ziehbar Quelle

<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 zu definieren:

als @Cliff Burton erwähnt, Sie können die Ansicht um 90 Grad drehen, wenn Sie vertikal blättern möchten.

+0

Gibt es eine Möglichkeit, vertikal mit diesem zu scrollen? –

+0

@CliffBurton Ich habe es vorher nicht versucht, aber Sie könnten damit spielen, vielleicht können Sie Orientierung in XML-Code hinzufügen, oder vielleicht gibt es eine Methode, das in Java-Code zu tun, aber das sind nur Vermutungen. –

+1

Ich habe gerade festgestellt, dass Sie die Ansicht um 90 Grad drehen können, wenn Sie vertikal scrollen möchten ... Wenn Sie möchten, können Sie Ihre Antwort mit dieser Lösung aktualisieren;) –