2016-04-27 49 views
11

我想要做的是水平移動背景並讓它無限重複。Android隨着動畫不斷移動背景

我嘗試使用帶動畫的ImageSwitcher來提供此效果,但無法使其正常工作。這是我的代碼,以便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

你爲什麼使用視圖動畫?你真的不應該再使用它們了......使用新的動畫API。無論如何,您可以通過在佈局中使用兩個「ImageViews」並使用「ValueAnimator」翻譯它們來輕鬆創建這樣的動畫。查看我的答案獲取更多信息。 –

回答

38

你爲什麼不嘗試只是自己的動畫背景,而不是使用ViewSwitcher的?所有你需要的是一個簡單的ValueAnimator

首先添加兩個相同的ImageViews到您的佈局和設置相同的背景圖像兩者:

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

然後用ValueAnimator動畫的translationX屬性,但偏向他們通過自己的寬度:

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

這導致連續動畫其中無限重複的背景,應該是這個樣子:

+1

這正是我所期待的,謝謝:) –

+0

哇!你是一個巫師,非常感謝Xaver! – Sipty

+0

如果你想減慢動畫速度,增加持續時間! :-) – Sipty

2

可以使用AndroidScrollingImageView庫,所有你需要做的是定義速度和繪​​制源

<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" /> 

編輯:

爲@Cliff伯頓提到,如果要垂直滾動,可以將視角旋轉90度。

+0

來反轉動畫。有沒有一種方法可以垂直滾動? –

+0

@CliffBurton我以前沒有嘗試過,但是可以使用它,也許可以在xml代碼中添加方向,也可以使用java代碼中的方法,但這些只是猜測。 –

+1

我剛剛意識到,如果你想垂直滾動,你可以旋轉90度的視圖...如果你想用這個解決方案可以更新你的答案;) –