私がやりたいことは、背景を水平方向に動かし、無限に繰り返すことです。
アニメーションでImageSwitcher
を使用してこの効果を与えようとしましたが、正しく機能させることができませんでした。これは私がこれまでに持っているコードです
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;
}
}
ViewSwitcher
を使用するのではなく、自分で背景をアニメーション化してみませんか?必要なのは、1つの単純なValueAnimator
:
最初に2つの同一の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();
これにより、バックグラウンドを無期限に繰り返す連続アニメーションが生成され、次のようになります。
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 Burtonが述べたように、垂直にスクロールしたい場合は、ビューを90度回転できます。