Сохранить изображение из растрового изображения в Viewpager - PullRequest
0 голосов
/ 19 октября 2018

Я показываю изображения с сервера в Viewpager с Glide.У меня есть кнопка, с помощью которой пользователь может сохранить текущее изображение, щелкнув по нему.

// 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;
}

}

Myпроблема в том, что этот код работает, но он сохраняет следующее изображение из viewpager (я знаю, что viewpager загружает 3 изображения, next, current и previous).Теперь, как я могу получить текущий рисунок?

1 Ответ

0 голосов
/ 19 октября 2018
  1. Добавить переменную mMap, тип которой SparseArray<Bitmap>, для вашего ViewPager поставить растровое изображение после полной загрузки растрового изображения
  2. Добавить переменную mCurrentPosition для вашего ViewPager и установить ее значение в методе 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)
    ...
}

reedit: в saveImage должно быть следующее:

saveImage(myViewPagerAdapter.getBitmap(position));
...