安卓开发中,viewpager+photoview+图片保存到相册的实现

我们在开发过程中,总会遇到这样的需求,就是需要点击查看轮播图或者是商品详情页面的商品图片,点击查看大图,然后点击之后 跳转一个页面,图片可以缩放,并且是可以来回滑动的,有的甚至需要添加长按图片保存到相册的功能。

目前刚好有这个需求,记录一下。

实现思路:viewpager+fragment+photoview.

viewpager中添加fragment,自定义的fragment,在fragment中实现 photoview展示图片,开启可缩放功能,以及长按保存到相册的功能。

长按保存到相册,可以参照我的博客。

此处与之前的保存图片相比略有不同,此处我也会详细的记录一下。

首先,第一步。

布局文件。




    

    

    

页面代码:主要实现fragment的添加,此处我的处理是每次进来都是默认显示第1张,你们可以根据自己的需要,进行设置当前position的显示,就跳转页面的时候 ,传递过来一个position就可以了。mViewPager.setCurrentItem(0); 设置为传递的position即可。

public class BigImageActivityWithSaveImage extends Screen {
    @BindView(R.id.viewPager)
    PhotoViewPager mViewPager;

    private ArrayListimgUrls;
    private List fragmentList = new ArrayList<>();
    @Override
    protected BasePresenter createPresenter() {

        return null;
    }

    @Override
    protected void initView() {
        super.initView();
        setContentView(R.layout.activity_big_image_layout);
        setScreenTitleMiddle("", true);
        imgUrls = getIntent().getStringArrayListExtra("imgUrls");
    }

    @Override
    protected void initData() {
        super.initData();
        fragmentList.clear();
        for (int i = 0; i < imgUrls.size(); i++) {
            fragmentList.add(FragmentBigImageAndSave.newInstance(screen, imgUrls.get(i)));
        }

        PhotoFragmentAdapter adapter = new PhotoFragmentAdapter(getSupportFragmentManager(), fragmentList);
        mViewPager.setAdapter(adapter);
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        mViewPager.setCurrentItem(0);
    }

    /**
     * @param
     * @time
     * @description 跳转到大图
     */
    public static void gotoBigImageActivity(Context context, ArrayList imgUrls) {
        Intent intent = new Intent(context, BigImageActivityWithSaveImage.class);
        Bundle bundle = new Bundle();
        bundle.putStringArrayList("imgUrls", imgUrls);
        intent.putExtras(bundle);
        context.startActivity(intent);

    }

    public class PhotoFragmentAdapter extends FragmentPagerAdapter {
        private List fragmentList;

        public PhotoFragmentAdapter(FragmentManager fm, List fragmentList) {
            super(fm);
            this.fragmentList = fragmentList;
        }


        @Override
        public Fragment getItem(int position) {
            return fragmentList.get(position);
        }

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

下面是fragment内的代码:

public class FragmentBigImageAndSave extends StateFragment implements PermissionPresenter.PermissionGetListener, SaveImgTools.HavePressSaveImgDialogSure {
    @BindView(R.id.photoView)
    PhotoView photoView;

    private PermissionPresenter presenter;
    private String imgUrl = "";

    public static FragmentBigImageAndSave newInstance(Screen screen, String imgUrl) {
        FragmentBigImageAndSave f = new FragmentBigImageAndSave();
        Bundle bundle = new Bundle();
        bundle.putString("url", imgUrl);
        f.setArguments(bundle);
        f.setFragmentActivity(screen);
        return f;
    }

    @Override
    protected int getContentView() {
        return R.layout.fragment_big_image_and_save_layout;
    }

    @Override
    protected void initView(View view) {
        super.initView(view);
        imgUrl = getArguments().getString("url");
    }

    @Override
    protected void initData(Bundle savedInstanceState) {
        super.initData(savedInstanceState);
        photoView.enable();
        Glide.with(getActivity())
                .load(imgUrl)
                .into(photoView);
        photoView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                SaveImgTools.ShowSaveImgDialog(getActivity(), FragmentBigImageAndSave.this::havePressSure
                        , R.id.photoView);
                return false;
            }
        });

        photoView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getActivity().finish();
            }
        });
    }

    @Override
    protected void createPresenter() {
        presenter = new PermissionPresenter(getActivity(), this);
    }

    @Override
    public void havePermission(int resId) {
        SaveImgTools.SaveImageToSysAlbumPhotoView(getActivity(), photoView);
    }

    @Override
    public void havePressSure(int resId) {
//请求读写权限
        presenter.requestPerssionStorage(resId);
    }
}

 

此处最关键的点就是调用的保存到相册的方法,注意切换,之前传递的控件类型,为photoview 。

 其实此处引申出一个点就是 通过URL,利用glide获取bitmap对象

直接搜索一下,就可以

Glide.with(screen).asBitmap().load(imgUrl).into(new SimpleTarget() {
    @Override
    public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) {
      //可以在此处调用保存图片到相册的方法  
    }
});

你可能感兴趣的:(安卓进阶)