如何使用ImageSwitcher中的Glide加载图像

时间:2016-06-19 07:40:52

标签: android android-widget android-glide imageswitcher

为了创建图像幻灯片,我想使用带有计时器的图像切换器。 我看了this blog post它非常清楚,但它并没有从网络加载图像。 现在我想从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();
        }

    }

}

我尝试用滑行加载图像,但我不知道该怎么办。

3 个答案:

答案 0 :(得分:5)

这很容易做到,您只需要使用Glide将图片加载到ImageViewImageSwitcher可以通过方法imageSwitcher.getCurrentView()获取run。因此,您需要将runOnUiThread方法的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()); 内的代码替换为下一个代码:

gallery

另外不要忘记用适当的网址替换你的图片网址(你现在有一些我看到的虚拟网址)。因此,您的String[]数组应该是android.permission.INTERNET数组。

不要忘记将AndroidManifest.xml加入android:layout_width

最后,您需要将ImageSwitcher的{​​{1}}属性更改为xml中的match_parent,因为Glide不会在其中加载图片。

答案 1 :(得分:0)

我使用了@ rom4ek的版本,但我遇到了一些崩溃:

  

致命异常:java.lang.RuntimeException   Canvas:尝试使用循环位图android.graphics.Bitmap@7ad49c4

我认为这是因为drawable未设置为传递给ImageView的{​​{1}}。

我将其更改为使用“下一个视图”。我们必须为Glide设置into(...)GONE的可见性。

INVISIBLE

Kotlin版本:

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

答案 2 :(得分:0)

我认为批准的答案很好,但它缺少一些关键。 当他们更新当前图像时,这基本上只是替换视图中的图像。这意味着我们可能根本不使用 ImageSwitcher。我们需要做的是,更新下一个视图,然后显示它。这将使我们还可以看到我们添加的任何过渡效果。

我已经在自己的代码中分离了所有这些逻辑以使其清晰,但这里是原始形式。

设置您的 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();