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

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

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

实现思路:viewpager+fragment+photoview.

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

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

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

首先,第一步。

布局文件。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <include
        android:id="@+id/layoutTop"
        layout="@layout/layout_title_red"/>

    <com.haigoubeibei.app.view.PhotoViewPager
        android:id="@+id/viewPager"
        app:layout_constraintTop_toBottomOf="@+id/layoutTop"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent">

    </com.haigoubeibei.app.view.PhotoViewPager>

</android.support.constraint.ConstraintLayout>

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

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

    private ArrayList<String>imgUrls;
    private List<FragmentBigImageAndSave> 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<String> 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<FragmentBigImageAndSave> fragmentList;

        public PhotoFragmentAdapter(FragmentManager fm, List<FragmentBigImageAndSave> 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<Bitmap>() {
    @Override
    public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
      //可以在此处调用保存图片到相册的方法  
    }
});
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值