3

画像のスライドショーを作るのに、タイマー付きの画像スイッチャーを使いたいです。私はこのブログ投稿を読みましたが、それは非常に明確ですが、ネットワークから画像をロードしません。Glide Library を使用して、ネットワークから画像を読み込みたいと思います。

これは MainActivity です:

public class MainActivity extends Activity {
    private ImageSwitcher imageSwitcher;

    private int[] gallery = { http://www.helloworld.com/image1.png, http://www.helloworld.com/image2.png, http://www.helloworld.com/image3.png,
            http://www.helloworld.com/image4.png, };

    private int position;

    private static final Integer DURATION = 2500;

    private Timer timer = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageSwitcher = (ImageSwitcher) findViewById(R.id.imageSwitcher);
        imageSwitcher.setFactory(new ViewFactory() {

            public View makeView() {
                return new ImageView(MainActivity.this);
            }
        });

        // Set animations
        // https://danielme.com/2013/08/18/diseno-android-transiciones-entre-activities/
        Animation fadeIn = AnimationUtils.loadAnimation(this, R.anim.fade_in);
        Animation fadeOut = AnimationUtils.loadAnimation(this, R.anim.fade_out);
        imageSwitcher.setInAnimation(fadeIn);
        imageSwitcher.setOutAnimation(fadeOut);
    }

    // ////////////////////BUTTONS
    /**
     * starts or restarts the slider
     * 
     * @param button
     */
    public void start(View button) {
        if (timer != null) {
            timer.cancel();
        }
        position = 0;
        startSlider();
    }

    public void stop(View button) {
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

    public void startSlider() {
        timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {

            public void run() {
                // avoid exception:
                // "Only the original thread that created a view hierarchy can touch its views"
                runOnUiThread(new Runnable() {
                    public void run() {
                        imageSwitcher.setImageResource(gallery[position]);
                        position++;
                        if (position == gallery.length) {
                            position = 0;
                        }
                    }
                });
            }

        }, 0, DURATION);
    }

    // Stops the slider when the Activity is going into the background
    @Override
    protected void onPause() {
        super.onPause();
        if (timer != null) {
            timer.cancel();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (timer != null) {
            startSlider();
        }

    }

}

glide で画像を読み込もうとしていますが、どうすればよいかわかりません。

4

3 に答える 3

5

やり方はとても簡単です。必要なのは、メソッドで取得できる を使用Glideして画像をロードすることだけです。したがって、 メソッド内のコードを次のコードに置き換える必要があります。ImageViewImageSwitcherimageSwitcher.getCurrentView()runrunOnUiThread

Glide.with(MainActivity.this)
    .load(gallery[position])
    .asBitmap()
    .listener(new RequestListener<String, Bitmap>() {
        @Override
        public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
            return false;
        }

        @Override
        public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
            position++;
            if (position == gallery.length) {
                position = 0;
            }
            imageSwitcher.setImageDrawable(new BitmapDrawable(getResources(), resource));
            return true;
        }
    }).into((ImageView) imageSwitcher.getCurrentView());

また、画像の URL を適切な URL に置き換えることを忘れないでください (ダミーの URL が表示されます)。したがって、gallery配列は配列でなければなりませんString[]

に含めることも忘れないandroid.permission.INTERNETでくださいAndroidManifest.xml

最後に、Glide が画像をロードしないため、xmlandroid:layout_widthのプロパティを変更する必要があります。ImageSwitchermatch_parent

于 2016-06-19T10:11:29.403 に答える
1

承認された回答は素晴らしいと思いますが、何か重要なものが欠けています。彼らが現在の画像を更新するとき、これは基本的に、表示されている画像を置き換えるだけです。これは、ImageSwitcher をまったく使用しない方がよいことを意味します。必要なことは、次のビューを更新してから表示することです。これにより、追加したトランジション効果も確認できます。

私は自分のコード内でこのすべてのロジックを分離してきれいにしましたが、ここでは RAW 形式です。

ImageSwitcher のセットアップ

   

    Animation in = AnimationUtils.loadAnimation(this,android.R.anim.fade_in);
       Animation out = AnimationUtils.loadAnimation(this,android.R.anim.fade_out);
       imageSwitcher.setFactory(() -> {
                ImageView imageView = new ImageView(getApplicationContext());
                imageView.setLayoutParams(new FrameLayout.LayoutParams(
                        FrameLayout.LayoutParams.MATCH_PARENT,
                        FrameLayout.LayoutParams.MATCH_PARENT
                ));
                return imageView;
            });
       imageSwitcher.setInAnimation(in);
       imageSwitcher.setOutAnimation(out);

  

これを呼び出して、次の画像を更新します

   

    RequestOptions requestOptions = new 
       RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL);
       Bitmap nextImage = getAppropriateImage();
       GlideApp.with(this)
          .load(nextImage)
          .apply(requestOptions)
          .into((ImageView) imageSwitcher.getNextView());
       imageSwitcher.showNext();

于 2021-05-13T10:33:06.443 に答える
0

@rom4ek のバージョンを使用しましたが、クラッシュが発生しました。

致命的な例外: java.lang.RuntimeException Canvas: リサイクルされたビットマップ android.graphics.Bitmap@7ad49c4 を使用しようとしています

これは、 がに渡さdrawableれたものと同じに設定されていないためだと思います。ImageViewinto(...)

「次のビュー」を使用するように変更しました。Glideの可視性を から に設定する必要がありGONEます。INVISIBLE

imageSwitcher.getNextView().setVisibility(View.INVISIBLE);
Glide.with(...)
    .load(url)
    .listener(new RequestListener<String, Bitmap>() {
        @Override
        public boolean onException(Exception e, String model, Target<Drawable> target, boolean isFirstResource) {
            return false;
        }

        @Override
        public boolean onResourceReady(Drawable resource, String model, Target<Drawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
            imageSwitcher.setImageDrawable(resource);
            return true;
        }
    }).into((ImageView) imageSwitcher.getNextView());

コトリンのバージョン:

it.nextView.visibility = View.INVISIBLE
Glide.with(...)
    .load(url)
    .listener(object : RequestListener<Drawable> {
        override fun onLoadFailed(
            e: GlideException?,
            model: Any?,
            target: Target<Drawable>?,
            isFirstResource: Boolean
        ): Boolean {
            return false
        }

        override fun onResourceReady(
            resource: Drawable?,
            model: Any?,
            target: Target<Drawable>?,
            dataSource: DataSource?,
            isFirstResource: Boolean
        ): Boolean {
            it.setImageDrawable(resource)
            return true
        }
    })
    .into(it.nextView as ImageView)
于 2018-04-13T12:14:01.997 に答える