我们在开发过程中,总会遇到这样的需求,就是需要点击查看轮播图或者是商品详情页面的商品图片,点击查看大图,然后点击之后 跳转一个页面,图片可以缩放,并且是可以来回滑动的,有的甚至需要添加长按图片保存到相册的功能。
目前刚好有这个需求,记录一下。
实现思路: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) { //可以在此处调用保存图片到相册的方法 } });