在 Viewpager 中从位图中保存图像

Save image from bitmap in Viewpager

我正在使用 Glide 在 Viewpager 中显示来自服务器的图像。我有一个按钮,用户可以在点击它时保存当前图像。

// Code from FullImage Fragment
save_img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(myViewPagerAdapter.getBitmap() != null)
                saveImage(myViewPagerAdapter.getBitmap());

            }
        });

我像这样从 ViewpagerAdapter 获取位图 -

public class MyViewPagerAdapter extends PagerAdapter {
Context context;
Bitmap bitmap;
private ArrayList<Object> imagesList = new ArrayList<>();
public MyViewPagerAdapter(Context context, ArrayList<Object> images) {
    context = this.context;
    this.imagesList = images;
}

@NonNull
@SuppressLint("ClickableViewAccessibility")
@Override
public Object instantiateItem(@NonNull final ViewGroup container, int position) {
    Object recyclerViewItem = imagesList.get(position);
    final View view = LayoutInflater.from(container.getContext()).inflate(R.layout.util_image_fullscreen_preview, container, false);
    final TouchImageView imageViewPreview = view.findViewById(R.id.image_preview);
    ProgressBar progressBar = new ProgressBar(view.getContext(), null, android.R.attr.progressBarStyleSmall);
    progressBar.setVisibility(View.VISIBLE);
    if (recyclerViewItem instanceof Advertiser) {
        Advertiser advertiser = (Advertiser) imagesList.get(position);
        GlideApp
                .with(container.getContext())
                .asBitmap()
                .load(advertiser.getUrl())
                .fitCenter().diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
                        imageViewPreview.setImageBitmap(resource);
                    }


                });
        ;
    } else {
        Photos image = (Photos) imagesList.get(position);
        GlideApp
                .with(container.getContext())
                .asBitmap()
                .load(image.getUrl())

                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
                        bitmap = resource;
                        imageViewPreview.setImageBitmap(resource);
                    }


                });

    }
    container.addView(view);
    return view;

}

@Override
public int getCount() {
    return imagesList.size();

}


@Override
public boolean isViewFromObject(View view, Object obj) {
    return view.equals(obj);
}


@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((View) object);
}

public interface OnClickListener {

    void performClick();
}

public Bitmap getBitmap() {
    return bitmap;
}

}

我的问题是这段代码有效,但它正在从 viewpager 保存下一张图片(我知道 viewpager 加载 3 张图片,下一张、当前和上一张)。 现在我怎样才能得到当前位图?

  1. 为您的 ViewPager 添加一个类型为 SparseArray<Bitmap> 的变量 mMap 在位图加载完成后放置位图
  2. 为您的 ViewPager 添加一个变量 mCurrentPosition 并在方法 instantiateItem 中设置它的值
  3. 像下面的代码片段一样更改 getBitmap 的逻辑

// 用下面的代码替换你的 getBitmap

public Bitmap getBitmap(int pos){

   return mMap.get(pos);

}

redit:关于如何清除变量mMap并初始化它。

public class MyViewPagerAdapter extends PagerAdapter {
    ...
    Context context;
    SparseArray<Bitmap> mMap = new SparseArray<Bitmap>();
    ...
}


public Object instantiateItem(@NonNull final ViewGroup container, int position) {
    ...
    //add your bitmap in here after it load complete
    mMap.put(position,bitmap)
    ...
}

重新编辑:在 saveImage 中应该如下:

saveImage(myViewPagerAdapter.getBitmap(position));