web-dev-qa-db-ja.com

Androidアニメーションで連続的に背景を移動する

私がやりたいことは、背景を水平方向に動かし、無限に繰り返すことです。

アニメーションで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;
    }
}
18
Praveen Pandey

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

これにより、バックグラウンドを無期限に繰り返す連続アニメーションが生成され、次のようになります。

52
Xaver Kapeller

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度回転できます。

5
Mohamed Ibrahim